From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: Stephen Hemminger <stephen@networkplumber.org>
Cc: netdev@vger.kernel.org, devel@linuxdriverproject.org,
Haiyang Zhang <haiyangz@microsoft.com>,
Stephen Hemminger <sthemmin@microsoft.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH net-next 2/4] hv_netvsc: protect nvdev->extension with RCU
Date: Tue, 31 Oct 2017 18:13:58 +0100 [thread overview]
Message-ID: <87shdzw889.fsf@vitty.brq.redhat.com> (raw)
In-Reply-To: <20171031174451.096978cd@shemminger-XPS-13-9360> (Stephen Hemminger's message of "Tue, 31 Oct 2017 17:44:51 +0100")
Stephen Hemminger <stephen@networkplumber.org> writes:
> On Tue, 31 Oct 2017 14:42:02 +0100
> Vitaly Kuznetsov <vkuznets@redhat.com> wrote:
>
>> @@ -2002,7 +2002,9 @@ static int netvsc_probe(struct hv_device *dev,
>> device_info.recv_sections = NETVSC_DEFAULT_RX;
>> device_info.recv_section_size = NETVSC_RECV_SECTION_SIZE;
>>
>> + rtnl_lock();
>> nvdev = rndis_filter_device_add(dev, &device_info);
>> + rtnl_unlock();
>
> rtnl is not necessary here. probe can not be bothered by other changes.
>
Yes, this is only to support rtnl_dereference() down the stack.
>> --- a/drivers/net/hyperv/rndis_filter.c
>> +++ b/drivers/net/hyperv/rndis_filter.c
>> @@ -402,20 +402,27 @@ int rndis_filter_receive(struct net_device *ndev,
>> void *data, u32 buflen)
>> {
>> struct net_device_context *net_device_ctx = netdev_priv(ndev);
>> - struct rndis_device *rndis_dev = net_dev->extension;
>> + struct rndis_device *rndis_dev;
>> struct rndis_message *rndis_msg = data;
>> + int ret = 0;
>> +
>> + rcu_read_lock_bh();
>> +
>> + rndis_dev = rcu_dereference_bh(net_dev->extension);
>
> filter_receive is already called only from NAPI only and has RCU lock and soft
> irq disabled. This is not necessary.
>
>> - net_dev->extension = NULL;
>> + rcu_assign_pointer(net_dev->extension, NULL);
>> +
>> + synchronize_rcu();
>
> rcu_assign_pointer with NULL is never a good idea.
> And synchronize_rcu is slow. Since net_device is already protected
> by RCU (for deletion) it should not be necessary.
>
I thought we don't care that much about the speed of this patch as
rndis_filter_device_remove() is only called on device remove/mtu
change/... and we need to interact with the host -- and this is already
slow.
> Thank you for trying to address these races. But it should be
> done carefully not by just slapping RCU everywhere.
Ok, I may have missed something. I'll try reproducing the crash and
finding a better fine-grained solution.
Thanks for the feedback!
--
Vitaly
WARNING: multiple messages have this Message-ID (diff)
From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: Stephen Hemminger <stephen@networkplumber.org>
Cc: netdev@vger.kernel.org, Haiyang Zhang <haiyangz@microsoft.com>,
Stephen Hemminger <sthemmin@microsoft.com>,
linux-kernel@vger.kernel.org, devel@linuxdriverproject.org
Subject: Re: [PATCH net-next 2/4] hv_netvsc: protect nvdev->extension with RCU
Date: Tue, 31 Oct 2017 18:13:58 +0100 [thread overview]
Message-ID: <87shdzw889.fsf@vitty.brq.redhat.com> (raw)
In-Reply-To: <20171031174451.096978cd@shemminger-XPS-13-9360> (Stephen Hemminger's message of "Tue, 31 Oct 2017 17:44:51 +0100")
Stephen Hemminger <stephen@networkplumber.org> writes:
> On Tue, 31 Oct 2017 14:42:02 +0100
> Vitaly Kuznetsov <vkuznets@redhat.com> wrote:
>
>> @@ -2002,7 +2002,9 @@ static int netvsc_probe(struct hv_device *dev,
>> device_info.recv_sections = NETVSC_DEFAULT_RX;
>> device_info.recv_section_size = NETVSC_RECV_SECTION_SIZE;
>>
>> + rtnl_lock();
>> nvdev = rndis_filter_device_add(dev, &device_info);
>> + rtnl_unlock();
>
> rtnl is not necessary here. probe can not be bothered by other changes.
>
Yes, this is only to support rtnl_dereference() down the stack.
>> --- a/drivers/net/hyperv/rndis_filter.c
>> +++ b/drivers/net/hyperv/rndis_filter.c
>> @@ -402,20 +402,27 @@ int rndis_filter_receive(struct net_device *ndev,
>> void *data, u32 buflen)
>> {
>> struct net_device_context *net_device_ctx = netdev_priv(ndev);
>> - struct rndis_device *rndis_dev = net_dev->extension;
>> + struct rndis_device *rndis_dev;
>> struct rndis_message *rndis_msg = data;
>> + int ret = 0;
>> +
>> + rcu_read_lock_bh();
>> +
>> + rndis_dev = rcu_dereference_bh(net_dev->extension);
>
> filter_receive is already called only from NAPI only and has RCU lock and soft
> irq disabled. This is not necessary.
>
>> - net_dev->extension = NULL;
>> + rcu_assign_pointer(net_dev->extension, NULL);
>> +
>> + synchronize_rcu();
>
> rcu_assign_pointer with NULL is never a good idea.
> And synchronize_rcu is slow. Since net_device is already protected
> by RCU (for deletion) it should not be necessary.
>
I thought we don't care that much about the speed of this patch as
rndis_filter_device_remove() is only called on device remove/mtu
change/... and we need to interact with the host -- and this is already
slow.
> Thank you for trying to address these races. But it should be
> done carefully not by just slapping RCU everywhere.
Ok, I may have missed something. I'll try reproducing the crash and
finding a better fine-grained solution.
Thanks for the feedback!
--
Vitaly
next prev parent reply other threads:[~2017-10-31 17:14 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-31 13:42 [PATCH net-next 0/4] hv_netvsc: fix some crashes and hangs on channel/mtu changes Vitaly Kuznetsov
2017-10-31 13:42 ` [PATCH net-next 1/4] hv_netvsc: netvsc_teardown_gpadl() split Vitaly Kuznetsov
2017-10-31 13:42 ` Vitaly Kuznetsov
2017-10-31 16:37 ` Stephen Hemminger
2017-10-31 13:42 ` [PATCH net-next 2/4] hv_netvsc: protect nvdev->extension with RCU Vitaly Kuznetsov
2017-10-31 13:42 ` Vitaly Kuznetsov
2017-10-31 16:44 ` Stephen Hemminger
2017-10-31 17:13 ` Vitaly Kuznetsov [this message]
2017-10-31 17:13 ` Vitaly Kuznetsov
2017-11-02 10:27 ` Vitaly Kuznetsov
2017-11-02 10:27 ` Vitaly Kuznetsov
2017-10-31 13:42 ` [PATCH net-next 3/4] hv_netvsc: reset net_device_ctx->nvdev with rcu_assign_pointer() Vitaly Kuznetsov
2017-10-31 13:42 ` Vitaly Kuznetsov
2017-10-31 14:09 ` Eric Dumazet
2017-10-31 14:40 ` Vitaly Kuznetsov
2017-10-31 14:44 ` David Miller
2017-10-31 14:44 ` David Miller
2017-10-31 14:50 ` Vitaly Kuznetsov
2017-10-31 16:45 ` Stephen Hemminger
2017-10-31 16:45 ` Stephen Hemminger
2017-10-31 13:42 ` [PATCH net-next 4/4] hv_netvsc: hide warnings about uninitialized/missing rndis device Vitaly Kuznetsov
2017-10-31 13:42 ` Vitaly Kuznetsov
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=87shdzw889.fsf@vitty.brq.redhat.com \
--to=vkuznets@redhat.com \
--cc=devel@linuxdriverproject.org \
--cc=haiyangz@microsoft.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=stephen@networkplumber.org \
--cc=sthemmin@microsoft.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.