From patchwork Sun Oct 31 15:32:38 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Linus_L=C3=BCssing?= X-Patchwork-Id: 488 Return-Path: Received: from fmmailgate01.web.de (fmmailgate01.web.de [217.72.192.221]) by open-mesh.org (Postfix) with ESMTP id 2B04C1542FD for ; Sun, 31 Oct 2010 16:36:16 +0100 (CET) Received: from smtp04.web.de ( [172.20.0.225]) by fmmailgate01.web.de (Postfix) with ESMTP id E7F03173022ED for ; Sun, 31 Oct 2010 16:32:44 +0100 (CET) Received: from [46.126.246.98] (helo=localhost) by smtp04.web.de with asmtp (TLSv1:AES128-SHA:128) (WEB.DE 4.110 #4) id 1PCZtk-0003aO-00; Sun, 31 Oct 2010 16:32:44 +0100 From: =?UTF-8?q?Linus=20L=C3=BCssing?= To: b.a.t.m.a.n@lists.open-mesh.org Date: Sun, 31 Oct 2010 16:32:38 +0100 Message-Id: <1288539158-26976-1-git-send-email-linus.luessing@web.de> X-Mailer: git-send-email 1.7.1 MIME-Version: 1.0 Sender: linus.luessing@web.de X-Sender: linus.luessing@web.de X-Provags-ID: V01U2FsdGVkX1/kxTHIPHKEiKi7fLu0zgbu6dBYLThuRwtZSMeK pwEKdtlBpesDtKiK8fWVmqjcVw6x+wWjNqINHEkcmPdwhGuWmD 9mOHORFZYJwJfEAyKR3w== Subject: [B.A.T.M.A.N.] [PATCH] batman-adv: Don't call sysfs_del_hardif() in atomic context X-BeenThere: b.a.t.m.a.n@lists.open-mesh.org X-Mailman-Version: 2.1.11 Precedence: list Reply-To: The list for a Better Approach To Mobile Ad-hoc Networking List-Id: The list for a Better Approach To Mobile Ad-hoc Networking List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 31 Oct 2010 15:36:16 -0000 sysfs_del_hardif invokes kobject_put, which might sleep. However, we are not allowed to sleep during a call_rcu. There is also no need to do the removal with an atomic call_rcu, as kobject_put only frees the kobject when there is no more reference to it anyway. This commit basically revokes 7f32f2e8d97150ba5b80410dda86b01b0879fe8d, despite not reintroducing the synchronize_rcu, our rcu_barrier should handle this. Signed-off-by: Linus Lüssing --- hard-interface.c | 14 +++----------- 1 files changed, 3 insertions(+), 11 deletions(-) diff --git a/hard-interface.c b/hard-interface.c index 37f0f8b..5c6ce3f 100644 --- a/hard-interface.c +++ b/hard-interface.c @@ -36,16 +36,6 @@ /* protect update critical side of if_list - but not the content */ static DEFINE_SPINLOCK(if_list_lock); -static void hardif_free_rcu(struct rcu_head *rcu) -{ - struct batman_if *batman_if; - - batman_if = container_of(rcu, struct batman_if, rcu); - sysfs_del_hardif(&batman_if->hardif_obj); - dev_put(batman_if->net_dev); - kref_put(&batman_if->refcount, hardif_free_ref); -} - struct batman_if *get_batman_if_by_netdev(struct net_device *net_dev) { struct batman_if *batman_if; @@ -470,7 +460,9 @@ static void hardif_remove_interface(struct batman_if *batman_if) /* caller must take if_list_lock */ list_del_rcu(&batman_if->list); - call_rcu(&batman_if->rcu, hardif_free_rcu); + sysfs_del_hardif(&batman_if->hardif_obj); + dev_put(batman_if->net_dev); + kref_put(&batman_if->refcount, hardif_free_ref); } void hardif_remove_interfaces(void)