public inbox for b.a.t.m.a.n@lists.open-mesh.org
 help / color / mirror / Atom feed
From: "Linus Lüssing" <linus.luessing@web.de>
To: The list for a Better Approach To Mobile Ad-hoc Networking
	<b.a.t.m.a.n@lists.open-mesh.org>
Subject: Re: [B.A.T.M.A.N.] [PATCHv2 3/3] batman-adv: Avoid deadlock between rtnl_lock and s_active
Date: Mon, 2 May 2011 19:27:28 +0200	[thread overview]
Message-ID: <20110502172728.GC12500@Sellars> (raw)
In-Reply-To: <1304182620-12637-3-git-send-email-sven@narfation.org>

Looks good, seems to make sense and tried it. Works so far with no
call traces or other uggly stuff. However I'm still trying to
reproduce the initial issue of ticket #145 to confirm that this
patch fixes it (used a different kernel and batman-adv version
back then, of course... so somehow the 'always' stated there does
not seem to be valid anymore :) ).

PS: Ok, just sometimes I'm still getting a locking dependancy call
trace, but that one involves two different locks
((&(&bat_priv->hna_ghash_lock)->rlock){+.-...}, at: [<f83a3dd6>]
hna_global_del_orig+0x22/0x90 [batman_adv]
(&(&hash->list_locks[i])->rlock){+.-...}, at: [<f839fe4b>]
_purge_orig+0x45/0x1be [batman_adv]) and therefore seems to be
unrelated - I'll open a new ticket for that.

On Sat, Apr 30, 2011 at 06:57:00PM +0200, Sven Eckelmann wrote:
> 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 <sven@narfation.org>
> ---
> Remove '{' '}' after 'if (hard_iface->if_status != IF_NOT_IN_USE)'
> 
>  bat_sysfs.c      |   16 +++++++++-------
>  soft-interface.c |    2 +-
>  2 files changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/bat_sysfs.c b/bat_sysfs.c
> index e449bf6..497a070 100644
> --- a/bat_sysfs.c
> +++ b/bat_sysfs.c
> @@ -488,22 +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();
> -	}
>  
>  	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 f4d80ad..bf53aa3 100644
> --- a/soft-interface.c
> +++ b/soft-interface.c
> @@ -613,7 +613,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);
> -- 
> 1.7.4.4
> 

  reply	other threads:[~2011-05-02 17:27 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-04-30 16:56 [B.A.T.M.A.N.] [PATCHv2 1/3] batman-adv: Fix crash on module shutdown with multiple ifaces Sven Eckelmann
2011-04-30 16:56 ` [B.A.T.M.A.N.] [PATCHv2 2/3] batman-adv: Remove unnecessary hardif_list_lock Sven Eckelmann
2011-04-30 20:54   ` [B.A.T.M.A.N.] [PATCHv3 " Sven Eckelmann
2011-05-02 17:16     ` Linus Lüssing
2011-05-02 19:15       ` Sven Eckelmann
2011-04-30 16:57 ` [B.A.T.M.A.N.] [PATCHv2 3/3] batman-adv: Avoid deadlock between rtnl_lock and s_active Sven Eckelmann
2011-05-02 17:27   ` Linus Lüssing [this message]
2011-05-02 18:05     ` Linus Lüssing

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110502172728.GC12500@Sellars \
    --to=linus.luessing@web.de \
    --cc=b.a.t.m.a.n@lists.open-mesh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox