Hello,

On Mon, 1 Feb 2016, Salam Noureddine wrote:

> @@ -1572,8 +1582,12 @@ rollback:
>                               call_netdevice_notifier(nb, NETDEV_GOING_DOWN,
>                                                       dev);
>                               call_netdevice_notifier(nb, NETDEV_DOWN, dev);
> +                             call_netdevice_notifier(nb, NETDEV_DOWN_BATCH,
> +                                                     dev);
>                       }
>                       call_netdevice_notifier(nb, NETDEV_UNREGISTER, dev);
> +                     call_netdevice_notifier(nb, NETDEV_UNREGISTER_BATCH,
> +                                             dev);

                        If the rule is once per net, the above call...

>               }

                should be here:

                call_netdevice_notifier(nb, NETDEV_UNREGISTER_BATCH,
                                        net->loopback_dev);

        and also once after outroll label?:

        call_netdevice_notifier(nb, NETDEV_UNREGISTER_BATCH, last);

>       }
>  
> @@ -1614,8 +1628,12 @@ int unregister_netdevice_notifier(struct 
> notifier_block *nb)
>                               call_netdevice_notifier(nb, NETDEV_GOING_DOWN,
>                                                       dev);
>                               call_netdevice_notifier(nb, NETDEV_DOWN, dev);
> +                             call_netdevice_notifier(nb, NETDEV_DOWN_BATCH,
> +                                                     dev);
>                       }
>                       call_netdevice_notifier(nb, NETDEV_UNREGISTER, dev);
> +                     call_netdevice_notifier(nb, NETDEV_UNREGISTER_BATCH,
> +                                             dev);

                        Above call...

>               }

                should be here, for net->loopback_dev?
Also, is it ok to call NETDEV_DOWN_BATCH many times, as result,
sometimes after NETDEV_UNREGISTER?

>       }
>  unlock:

> @@ -6427,7 +6447,9 @@ static void net_set_todo(struct net_device *dev)
>  static void rollback_registered_many(struct list_head *head)
>  {
>       struct net_device *dev, *tmp;
> +     struct net *net, *net_tmp;
>       LIST_HEAD(close_head);
> +     LIST_HEAD(net_head);
>  
>       BUG_ON(dev_boot_phase);
>       ASSERT_RTNL();
> @@ -6504,6 +6526,15 @@ static void rollback_registered_many(struct list_head 
> *head)
>  #endif
>       }
>  
> +     list_for_each_entry(dev, head, unreg_list) {
> +             net_add_event_list(&net_head, dev_net(dev));
> +     }
> +     list_for_each_entry_safe(net, net_tmp, &net_head, event_list) {
> +             call_netdevice_notifiers(NETDEV_UNREGISTER_BATCH,
> +                                      net->loopback_dev);
> +             net_del_event_list(net);
> +     }
> +

        NETDEV_UNREGISTER* should not be called before
following synchronize_net and NETDEV_UNREGISTER. May be
we should split the loop: loop (dev_shutdown+NETDEV_UNREGISTER)
followed by above NETDEV_UNREGISTER_BATCH then again the
loop for all remaining calls.

>       synchronize_net();
>  
>       list_for_each_entry(dev, head, unreg_list)

Regards

--
Julian Anastasov <j...@ssi.bg>

Reply via email to