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