Message ID | 1732736570-19700-1-git-send-email-longli@linuxonhyperv.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | hv_netvsc: Set device flags for properly indicating bonding | expand |
> -----Original Message----- > From: longli@linuxonhyperv.com <longli@linuxonhyperv.com> > Sent: Wednesday, November 27, 2024 2:43 PM > To: KY Srinivasan <kys@microsoft.com>; Haiyang Zhang > <haiyangz@microsoft.com>; Wei Liu <wei.liu@kernel.org>; Dexuan Cui > <decui@microsoft.com>; David S. Miller <davem@davemloft.net>; Eric > Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo > Abeni <pabeni@redhat.com>; Shradha Gupta > <shradhagupta@linux.microsoft.com>; Simon Horman <horms@kernel.org>; > Konstantin Taranov <kotaranov@microsoft.com>; Souradeep Chakrabarti > <schakrabarti@linux.microsoft.com>; Erick Archer > <erick.archer@outlook.com>; linux-hyperv@vger.kernel.org; > netdev@vger.kernel.org; linux-kernel@vger.kernel.org; linux- > rdma@vger.kernel.org > Cc: Long Li <longli@microsoft.com> > Subject: [EXTERNAL] [PATCH] hv_netvsc: Set device flags for properly > indicating bonding > > From: Long Li <longli@microsoft.com> > > hv_netvsc uses a subset of bonding features in that the master always > has only one active slave. But it never properly setup those flags. > > Other kernel APIs (e.g those in "include/linux/netdevice.h") check for > IFF_MASTER, IFF_SLAVE and IFF_BONDING for determing if those are used > in a master/slave setup. RDMA uses those APIs extensively when looking > for master/slave devices. > > Make hv_netvsc properly setup those flags. > > Signed-off-by: Long Li <longli@microsoft.com> Please add Fixes tag, Cc stable, add "net" to the subject. Thanks. Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index d6c4abfc3a28..2112fb74eb21 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -2204,6 +2204,10 @@ static int netvsc_vf_join(struct net_device *vf_netdev, goto rx_handler_failed; } + vf_netdev->priv_flags |= IFF_BONDING; + ndev->priv_flags |= IFF_BONDING; + ndev->flags |= IFF_MASTER; + ret = netdev_master_upper_dev_link(vf_netdev, ndev, NULL, NULL, NULL); if (ret != 0) { @@ -2484,7 +2488,15 @@ static int netvsc_unregister_vf(struct net_device *vf_netdev) reinit_completion(&net_device_ctx->vf_add); netdev_rx_handler_unregister(vf_netdev); + + /* Unlink the slave device and clear flag */ + vf_netdev->priv_flags &= ~IFF_BONDING; + ndev->priv_flags &= ~IFF_BONDING; + vf_netdev->flags &= ~IFF_SLAVE; + ndev->flags &= ~IFF_MASTER; + netdev_upper_dev_unlink(vf_netdev, ndev); + RCU_INIT_POINTER(net_device_ctx->vf_netdev, NULL); dev_put(vf_netdev);