From: Veaceslav Falico <vfalico@redhat.com>
To: Nikolay Aleksandrov <nikolay@redhat.com>
Cc: netdev@vger.kernel.org, Jay Vosburgh <fubar@us.ibm.com>,
Andy Gospodarek <andy@greyhouse.net>
Subject: Re: [PATCH net-next] bonding: RCUify bond_set_rx_mode()
Date: Mon, 5 Aug 2013 14:31:03 +0200 [thread overview]
Message-ID: <20130805123103.GH22756@redhat.com> (raw)
In-Reply-To: <51FF7CC4.7010806@redhat.com>
On Mon, Aug 05, 2013 at 12:21:56PM +0200, Nikolay Aleksandrov wrote:
>On 08/05/2013 11:26 AM, Veaceslav Falico wrote:
>> Currently, we might easily deadlock with bond_set_rx_mode() and
>> bond_hw_addr_swap(). bond_set_rx_mode() is called via dev_set_rx_mode(),
>> which already holds the netif_addr_lock_bh(bond), and inside it takes the
>> bond->curr_active_slave lock, while bond_hw_addr_swap() is called with
>> bond->curr_active_slave lock held and then takes netif_addr_lock_bh(bond),
>> which results in deadlock.
>>
>> CPU0 CPU1
>> ---- ----
>> lock(&bonding_netdev_addr_lock_key);
>> lock(&bond->curr_slave_lock);
>> lock(&bonding_netdev_addr_lock_key);
>> lock(&bond->curr_slave_lock);
>>
>> Fix this by using the RCU primites in bond_set_rx_mode(). We're safe wrt
>> racing of dev_?c_(un)sync() because we hold
>> lock(&bonding_netdev_addr_lock_key), and thus nobody will be able to modify
>> these lists before we finish.
>>
>Hi,
>I don't think this deadlock can actually happen because bond_hw_addr_swap() is
>called from bond_change_active_slave() only in USES_PRIMARY mode, and in such
>mode it's always called with rtnl acquired before that, and since
>dev_set_rx_mode is called with rtnl, IMO such deadlock can't happen.
Yep, indeed, missed the part with USES_PRIMARY(). So the lockdep had a
false alarm.
>Also I think bond_set_rx_mode() can work without RCU because of the held rtnl
>and converted to ASSERT_RTNL (this is optional) + rtnl_dereference for the
>curr_active_slave.
Yes, we don't need the real rcu cause we're under rtnl and everybody else
who touches it also is under rtnl. Awesome catch.
Thanks, will resubmit another patch (hard to call it v2...).
>
>Cheers,
> Nik
>
>> CC: Jay Vosburgh <fubar@us.ibm.com>
>> CC: Andy Gospodarek <andy@greyhouse.net>
>> CC: Nikolay Aleksandrov <nikolay@redhat.com>
>> Signed-off-by: Veaceslav Falico <vfalico@redhat.com>
>> ---
>
next prev parent reply other threads:[~2013-08-05 12:31 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-05 9:26 [PATCH net-next] bonding: RCUify bond_set_rx_mode() Veaceslav Falico
2013-08-05 10:21 ` Nikolay Aleksandrov
2013-08-05 12:31 ` Veaceslav Falico [this message]
2013-08-05 18:31 ` Veaceslav Falico
-- strict thread matches above, loose matches on Subject: below --
2013-09-28 19:18 Veaceslav Falico
2013-10-01 5:27 ` David Miller
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=20130805123103.GH22756@redhat.com \
--to=vfalico@redhat.com \
--cc=andy@greyhouse.net \
--cc=fubar@us.ibm.com \
--cc=netdev@vger.kernel.org \
--cc=nikolay@redhat.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.