From patchwork Mon May 2 19:19:38 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sven Eckelmann X-Patchwork-Id: 976 Return-Path: Received: from v3-1039.vlinux.de (narfation.org [79.140.41.39]) by open-mesh.org (Postfix) with ESMTPS id 62DC8154487 for ; Mon, 2 May 2011 21:19:51 +0200 (CEST) Authentication-Results: open-mesh.org; dkim=pass (1024-bit key) header.i=@narfation.org; dkim-adsp=pass Received: from sven-desktop.home.narfation.org (i59F6B6B2.versanet.de [89.246.182.178]) by v3-1039.vlinux.de (Postfix) with ESMTPSA id BB08C940D7; Mon, 2 May 2011 21:20:03 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=narfation.org; s=mail; t=1304364004; bh=94w58bz2qaM1WhbiGFV4aL17T29uSf4fbjzVJevIU10=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=jRAUCWJI9dZX1k1Z5o8OD2e/RRPY59xMpTiaVabXTNkIvreY1DF/B9UysQEPNdGhH IqK2uQZKLVblPCddd2EzuFJntrJWuTtQSFOHqXMMdp3tqhY+WO9vwCSBjN0iko0jT7 YFctbQcGyfVKoX2SexxFJ79W+gpUOj8BnvL/Clw4= From: Sven Eckelmann To: b.a.t.m.a.n@lists.open-mesh.org Date: Mon, 2 May 2011 21:19:38 +0200 Message-Id: <1304363978-16164-2-git-send-email-sven@narfation.org> X-Mailer: git-send-email 1.7.4.4 In-Reply-To: <1304363978-16164-1-git-send-email-sven@narfation.org> References: <1304363978-16164-1-git-send-email-sven@narfation.org> Subject: [B.A.T.M.A.N.] [PATCHv4 2/2] batman-adv: Avoid deadlock between rtnl_lock and s_active X-BeenThere: b.a.t.m.a.n@lists.open-mesh.org X-Mailman-Version: 2.1.13 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: Mon, 02 May 2011 19:19:51 -0000 The hard_if_event is called by the notifier with rtnl_lock and tries to remove sysfs entries when a NETDEV_UNREGISTER event is received. This will automatically take the s_active lock. The s_active lock is also used when a new interface is added to a meshif through sysfs. In that situation we cannot wait for the rntl_lock before creating the actual batman-adv interface to prevent a deadlock. It is still possible to try to get the rtnl_lock and immediately abort the current operation when the trylock call failed. Signed-off-by: Sven Eckelmann --- Rebased on new merged patch 1/2 bat_sysfs.c | 18 +++++++++--------- soft-interface.c | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/bat_sysfs.c b/bat_sysfs.c index 85ba20d..497a070 100644 --- a/bat_sysfs.c +++ b/bat_sysfs.c @@ -488,24 +488,24 @@ static ssize_t store_mesh_iface(struct kobject *kobj, struct attribute *attr, (strncmp(hard_iface->soft_iface->name, buff, IFNAMSIZ) == 0)) goto out; + if (!rtnl_trylock()) { + ret = -ERESTARTSYS; + goto out; + } + if (status_tmp == IF_NOT_IN_USE) { - rtnl_lock(); hardif_disable_interface(hard_iface); - rtnl_unlock(); - goto out; + goto unlock; } /* if the interface already is in use */ - if (hard_iface->if_status != IF_NOT_IN_USE) { - rtnl_lock(); + if (hard_iface->if_status != IF_NOT_IN_USE) hardif_disable_interface(hard_iface); - rtnl_unlock(); - } - rtnl_lock(); ret = hardif_enable_interface(hard_iface, buff); + +unlock: rtnl_unlock(); - out: hardif_free_ref(hard_iface); return ret; diff --git a/soft-interface.c b/soft-interface.c index 1772e2b..a78e923 100644 --- a/soft-interface.c +++ b/soft-interface.c @@ -639,7 +639,7 @@ struct net_device *softif_create(char *name) goto out; } - ret = register_netdev(soft_iface); + ret = register_netdevice(soft_iface); if (ret < 0) { pr_err("Unable to register the batman interface '%s': %i\n", name, ret);