From: jeffy <jeffy.chen@rock-chips.com>
To: Cong Wang <xiyou.wangcong@gmail.com>, netdev@vger.kernel.org
Cc: David Ahern <dsahern@gmail.com>
Subject: Re: [Patch net] ipv6: only call ip6_route_dev_notify() once for NETDEV_UNREGISTER
Date: Wed, 21 Jun 2017 11:01:14 +0800 [thread overview]
Message-ID: <5949E17A.4020508@rock-chips.com> (raw)
In-Reply-To: <1497984147-15011-1-git-send-email-xiyou.wangcong@gmail.com>
Hi Cong Wang,
i don't know much about net core, maybe i'm misreading the code...but
On 06/21/2017 02:42 AM, Cong Wang wrote:
> In commit 242d3a49a2a1 ("ipv6: reorder ip6_route_dev_notifier after ipv6_dev_notf")
> I assumed NETDEV_REGISTER and NETDEV_UNREGISTER are paired,
> unfortunately, as reported by jeffy, netdev_wait_allrefs()
> could rebroadcast NETDEV_UNREGISTER event until all refs are
> gone.
>
> We have to add an additional check to avoid this corner case.
> For netdev_wait_allrefs() dev->reg_state is NETREG_UNREGISTERED,
> for dev_change_net_namespace(), dev->reg_state is
> NETREG_REGISTERED. So check for dev->reg_state != NETREG_UNREGISTERED.
i saw we are calling NETDEV_REGISTER in these cases:
1/ register_netdevice_notifier:
the paired unregister would be:
a) normal unregister: rollback_registered_many
b) the error path:
register_netdevice_notifier->rollback jump label
2/ register_netdevice:
the paired unregister would both be rollback_registered_many for
normal/error cases
3/ dev_change_net_namespace:
the paired unregister is the one right before the register notify
i think we are handling all register notifies, but only unregister
notify from rollback_registered_many now?
>
> Fixes: 242d3a49a2a1 ("ipv6: reorder ip6_route_dev_notifier after ipv6_dev_notf")
> Reported-by: jeffy <jeffy.chen@rock-chips.com>
> Cc: David Ahern <dsahern@gmail.com>
> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
> ---
> net/ipv6/route.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/net/ipv6/route.c b/net/ipv6/route.c
> index 7cebd95..322bd62 100644
> --- a/net/ipv6/route.c
> +++ b/net/ipv6/route.c
> @@ -3722,7 +3722,11 @@ static int ip6_route_dev_notify(struct notifier_block *this,
> net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
> net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
> #endif
> - } else if (event == NETDEV_UNREGISTER) {
> + } else if (event == NETDEV_UNREGISTER &&
> + dev->reg_state != NETREG_UNREGISTERED) {
> + /* NETDEV_UNREGISTER could be fired for multiple times by
> + * netdev_wait_allrefs(). Make sure we only call this once.
> + */
> in6_dev_put(net->ipv6.ip6_null_entry->rt6i_idev);
> #ifdef CONFIG_IPV6_MULTIPLE_TABLES
> in6_dev_put(net->ipv6.ip6_prohibit_entry->rt6i_idev);
>
next prev parent reply other threads:[~2017-06-21 3:01 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-20 18:42 [Patch net] ipv6: only call ip6_route_dev_notify() once for NETDEV_UNREGISTER Cong Wang
2017-06-21 3:01 ` jeffy [this message]
2017-06-21 3:08 ` jeffy
2017-06-21 3:16 ` David Ahern
2017-06-22 15:07 ` 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=5949E17A.4020508@rock-chips.com \
--to=jeffy.chen@rock-chips.com \
--cc=dsahern@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=xiyou.wangcong@gmail.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.