All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Love, Robert W" <robert.w.love@intel.com>
To: "bvanassche@acm.org" <bvanassche@acm.org>,
	"linux-scsi@vger.kernel.org" <linux-scsi@vger.kernel.org>
Cc: "devel@open-fcoe.org" <devel@open-fcoe.org>,
	"Zou, Yi" <yi.zou@intel.com>
Subject: Re: [PATCH] fcoe: Don't hold rtnl_mutex in fcoe_update_src_mac
Date: Wed, 14 Mar 2012 00:42:05 +0000	[thread overview]
Message-ID: <4F5FE95D.8040408@intel.com> (raw)
In-Reply-To: <20120313225254.5473.92174.stgit@localhost6.localdomain6>

On 03/13/2012 03:52 PM, Robert Love wrote:
> The rtnl_mutex was held to protect calls to dev_uc_add
> and dev_uc_del. Holding rtnl is not required as those
> functions make use of the netif_addr_lock* API to
> protect the MAC changing.
>
> This change fixes the following regression by removing
> the rtnl usage when fcoe_update_src_mac is called.
>
> https://bugzilla.kernel.org/show_bug.cgi?id=42918
>
> the existing dependency chain (in reverse order) is:
>
> ->  #1 (&fip->ctlr_mutex){+.+...}:
>         [<c1091f70>] lock_acquire+0x80/0x1b0
>         [<c147655d>] mutex_lock_nested+0x6d/0x340
>         [<f8970c32>] fcoe_ctlr_link_up+0x22/0x180 [libfcoe]
>         [<f894620e>] fcoe_create+0x47e/0x6e0 [fcoe]
>         [<f8973dd3>] fcoe_transport_create+0x143/0x250 [libfcoe]
>         [<c10527e0>] param_attr_store+0x30/0x60
>         [<c1052696>] module_attr_store+0x26/0x40
>         [<c11a201e>] sysfs_write_file+0xae/0x100
>         [<c11449df>] vfs_write+0x8f/0x160
>         [<c1144cbd>] sys_write+0x3d/0x70
>         [<c147a0c4>] syscall_call+0x7/0xb
>
> ->  #0 (rtnl_mutex){+.+.+.}:
>         [<c109164b>] __lock_acquire+0x140b/0x1720
>         [<c1091f70>] lock_acquire+0x80/0x1b0
>         [<c147655d>] mutex_lock_nested+0x6d/0x340
>         [<c13a10c4>] rtnl_lock+0x14/0x20
>         [<f89445ac>] fcoe_update_src_mac+0x2c/0xb0 [fcoe]
>         [<f8971712>] fcoe_ctlr_timer_work+0x712/0xb60 [libfcoe]
>         [<c104fb69>] process_one_work+0x179/0x5d0
>         [<c10502f1>] worker_thread+0x121/0x2d0
>         [<c10550ed>] kthread+0x7d/0x90
>         [<c1481a82>] kernel_thread_helper+0x6/0x10
>
> other info that might help us debug this:
>
>   Possible unsafe locking scenario:
>
>         CPU0                    CPU1
>         ----                    ----
>    lock(&fip->ctlr_mutex);
>                                 lock(rtnl_mutex);
>                                 lock(&fip->ctlr_mutex);
>    lock(rtnl_mutex);
>
>   *** DEADLOCK ***
>
> Signed-off-by: Robert Love<robert.w.love@intel.com>
> ---
>   drivers/scsi/fcoe/fcoe.c |    2 --
>   1 files changed, 0 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
> index e959960..85b8203 100644
> --- a/drivers/scsi/fcoe/fcoe.c
> +++ b/drivers/scsi/fcoe/fcoe.c
> @@ -539,13 +539,11 @@ static void fcoe_update_src_mac(struct fc_lport *lport, u8 *addr)
>   	struct fcoe_port *port = lport_priv(lport);
>   	struct fcoe_interface *fcoe = port->priv;
>
> -	rtnl_lock();
>   	if (!is_zero_ether_addr(port->data_src_addr))
>   		dev_uc_del(fcoe->netdev, port->data_src_addr);
>   	if (!is_zero_ether_addr(addr))
>   		dev_uc_add(fcoe->netdev, addr);
>   	memcpy(port->data_src_addr, addr, ETH_ALEN);
> -	rtnl_unlock();
>   }
>
>   /**
>
This isn't going to work. We do need rtnl_lock when calling 
dev_uc_add/del to ensure the driver isn't removed while making the 
change. I have an alternative patch that I'll post as soon as I clean it 
up a bit.

Nacked-by: Robert Love <robert.w.love@intel.com>

  reply	other threads:[~2012-03-14  0:45 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <bug-42918-11613@https.bugzilla.kernel.org>
2012-03-13 22:52 ` [PATCH] fcoe: Don't hold rtnl_mutex in fcoe_update_src_mac Robert Love
2012-03-14  0:42   ` Love, Robert W [this message]
2012-03-14  2:14     ` [Open-FCoE] " John Fastabend
     [not found]       ` <4F5FFF19.1060601-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2012-03-14 16:18         ` Zou, Yi
2012-03-15  8:40   ` Bart Van Assche

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=4F5FE95D.8040408@intel.com \
    --to=robert.w.love@intel.com \
    --cc=bvanassche@acm.org \
    --cc=devel@open-fcoe.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=yi.zou@intel.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.