From: Louis Peens louis.peens@corigine.com Date: Mon, 3 Jul 2023 14:01:16 +0200
From: Yinjun Zhang yinjun.zhang@corigine.com
When moving devices from one namespace to another, mc addresses are cleaned in software while not removed from application firmware. Thus the mc addresses are remained and will cause resource leak.
Now use `__dev_mc_unsync` to clean mc addresses when closing port.
Fixes: e20aa071cd95 ("nfp: fix schedule in atomic context when sync mc address") Cc: stable@vger.kernel.org Signed-off-by: Yinjun Zhang yinjun.zhang@corigine.com Acked-by: Simon Horman simon.horman@corigine.com Signed-off-by: Louis Peens louis.peens@corigine.com
Changes since v1:
- Use __dev_mc_unsyc to clean mc addresses instead of tracking mc addresses by driver itself.
- Clean mc addresses when closing port instead of driver exits, so that the issue of moving devices between namespaces can be fixed.
- Modify commit message accordingly.
.../ethernet/netronome/nfp/nfp_net_common.c | 171 +++++++++--------- 1 file changed, 87 insertions(+), 84 deletions(-)
[...]
+static int nfp_net_mc_sync(struct net_device *netdev, const unsigned char *addr) +{
- struct nfp_net *nn = netdev_priv(netdev);
- if (netdev_mc_count(netdev) > NFP_NET_CFG_MAC_MC_MAX) {
nn_err(nn, "Requested number of MC addresses (%d) exceeds maximum (%d).\n",
netdev_mc_count(netdev), NFP_NET_CFG_MAC_MC_MAX);
return -EINVAL;
- }
- return nfp_net_sched_mbox_amsg_work(nn, NFP_NET_CFG_MBOX_CMD_MULTICAST_ADD, addr,
NFP_NET_CFG_MULTICAST_SZ, nfp_net_mc_cfg);
+}
+static int nfp_net_mc_unsync(struct net_device *netdev, const unsigned char *addr) +{
- struct nfp_net *nn = netdev_priv(netdev);
- return nfp_net_sched_mbox_amsg_work(nn, NFP_NET_CFG_MBOX_CMD_MULTICAST_DEL, addr,
NFP_NET_CFG_MULTICAST_SZ, nfp_net_mc_cfg);
+}
You can just declare nfp_net_mc_unsync()'s prototype here, so that it will be visible to nfp_net_netdev_close(), without moving the whole set of functions. Either way works, but that one would allow avoiding big diffs not really related to fixing things going through the net-fixes tree.
/**
- nfp_net_clear_config_and_disable() - Clear control BAR and disable NFP
- @nn: NFP Net device to reconfigure
@@ -1084,6 +1168,9 @@ static int nfp_net_netdev_close(struct net_device *netdev) /* Step 2: Tell NFP */
- if (nn->cap_w1 & NFP_NET_CFG_CTRL_MCAST_FILTER)
__dev_mc_unsync(netdev, nfp_net_mc_unsync);
- nfp_net_clear_config_and_disable(nn); nfp_port_configure(netdev, false);
[...]
Thanks, Olek