On Wed, 25 Oct 2023 15:50:50 -0700
[email protected] wrote:

> @@ -2347,6 +2342,12 @@ static int netvsc_register_vf(struct net_device 
> *vf_netdev)
>       if (!ndev)
>               return NOTIFY_DONE;
>  
> +     if (event == NETDEV_POST_INIT) {
> +             /* set slave flag before open to prevent IPv6 addrconf */
> +             vf_netdev->flags |= IFF_SLAVE;
> +             return NOTIFY_DONE;
> +     }
> +
>       net_device_ctx = netdev_priv(ndev);
>       netvsc_dev = rtnl_dereference(net_device_ctx->nvdev);
>       if (!netvsc_dev || rtnl_dereference(net_device_ctx->vf_netdev))
> @@ -2753,8 +2754,9 @@ static int netvsc_netdev_event(struct notifier_block 
> *this,
>               return NOTIFY_DONE;
>  
>       switch (event) {
> +     case NETDEV_POST_INIT:
>       case NETDEV_REGISTER:
> -             return netvsc_register_vf(event_dev);
> +             return netvsc_register_vf(event_dev, event);

Although correct, this is an awkward way to write this.
There are two events which call register_vf() but the post init
one short circuits and doesn't really register the VF.

The code is clearer if flag is set in switch statement.

@@ -2206,9 +2206,6 @@ static int netvsc_vf_join(struct net_device *vf_netdev,
                goto upper_link_failed;
        }
 
-       /* set slave flag before open to prevent IPv6 addrconf */
-       vf_netdev->flags |= IFF_SLAVE;
-
        schedule_delayed_work(&ndev_ctx->vf_takeover, VF_TAKEOVER_INT);
 
        call_netdevice_notifiers(NETDEV_JOIN, vf_netdev);
@@ -2753,6 +2750,10 @@ static int netvsc_netdev_event(struct notifier_block 
*this,
                return NOTIFY_DONE;
 
        switch (event) {
+       case NETDEV_POST_INIT:
+               /* set slave flag before open to prevent IPv6 addrconf */
+               vf_netdev->flags |= IFF_SLAVE;
+               return NOTIFY_DONE;
        case NETDEV_REGISTER:
                return netvsc_register_vf(event_dev);
        case NETDEV_UNREGISTER:



Reply via email to