d04854
From 76ee0e37486917b04949a50549e1257f22973180 Mon Sep 17 00:00:00 2001
d04854
From: Lior Nahmanson <liorna@nvidia.com>
d04854
Date: Sun, 30 Jan 2022 13:29:01 +0200
d04854
Subject: [PATCH 08/17] net: macsec: Fix offload support for NETDEV_UNREGISTER
d04854
 event
d04854
Git-commit: 9cef24c8b76c1f6effe499d2f131807c90f7ce9a
d04854
Patch-mainline: v5.17-rc3
d04854
References: git-fixes
d04854
d04854
Current macsec netdev notify handler handles NETDEV_UNREGISTER event by
d04854
releasing relevant SW resources only, this causes resources leak in case
d04854
of macsec HW offload, as the underlay driver was not notified to clean
d04854
it's macsec offload resources.
d04854
d04854
Fix by calling the underlay driver to clean it's relevant resources
d04854
by moving offload handling from macsec_dellink() to macsec_common_dellink()
d04854
when handling NETDEV_UNREGISTER event.
d04854
d04854
Fixes: 3cf3227a21d1 ("net: macsec: hardware offloading infrastructure")
d04854
Signed-off-by: Lior Nahmanson <liorna@nvidia.com>
d04854
Reviewed-by: Raed Salem <raeds@nvidia.com>
d04854
Signed-off-by: Raed Salem <raeds@nvidia.com>
d04854
Reviewed-by: Antoine Tenart <atenart@kernel.org>
d04854
Link: https://lore.kernel.org/r/1643542141-28956-1-git-send-email-raeds@nvidia.com
d04854
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
d04854
Signed-off-by: Denis Kirjanov <denis.kirjanov@suse.com>
d04854
---
d04854
 drivers/net/macsec.c | 24 ++++++++++++------------
d04854
 1 file changed, 12 insertions(+), 12 deletions(-)
d04854
d04854
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
d04854
index 93dc48b9b4f2..7c1a4b0a7272 100644
d04854
--- a/drivers/net/macsec.c
d04854
+++ b/drivers/net/macsec.c
d04854
@@ -3870,6 +3870,18 @@ static void macsec_common_dellink(struct net_device *dev, struct list_head *head
d04854
 	struct macsec_dev *macsec = macsec_priv(dev);
d04854
 	struct net_device *real_dev = macsec->real_dev;
d04854
 
d04854
+	/* If h/w offloading is available, propagate to the device */
d04854
+	if (macsec_is_offloaded(macsec)) {
d04854
+		const struct macsec_ops *ops;
d04854
+		struct macsec_context ctx;
d04854
+
d04854
+		ops = macsec_get_ops(netdev_priv(dev), &ctx;;
d04854
+		if (ops) {
d04854
+			ctx.secy = &macsec->secy;
d04854
+			macsec_offload(ops->mdo_del_secy, &ctx;;
d04854
+		}
d04854
+	}
d04854
+
d04854
 	unregister_netdevice_queue(dev, head);
d04854
 	list_del_rcu(&macsec->secys);
d04854
 	macsec_del_dev(macsec);
d04854
@@ -3884,18 +3896,6 @@ static void macsec_dellink(struct net_device *dev, struct list_head *head)
d04854
 	struct net_device *real_dev = macsec->real_dev;
d04854
 	struct macsec_rxh_data *rxd = macsec_data_rtnl(real_dev);
d04854
 
d04854
-	/* If h/w offloading is available, propagate to the device */
d04854
-	if (macsec_is_offloaded(macsec)) {
d04854
-		const struct macsec_ops *ops;
d04854
-		struct macsec_context ctx;
d04854
-
d04854
-		ops = macsec_get_ops(netdev_priv(dev), &ctx;;
d04854
-		if (ops) {
d04854
-			ctx.secy = &macsec->secy;
d04854
-			macsec_offload(ops->mdo_del_secy, &ctx;;
d04854
-		}
d04854
-	}
d04854
-
d04854
 	macsec_common_dellink(dev, head);
d04854
 
d04854
 	if (list_empty(&rxd->secys)) {
d04854
-- 
d04854
2.16.4
d04854