Commit 1ae489ab authored by Petr Machata's avatar Petr Machata Committed by Jakub Kicinski

mlxsw: spectrum_switchdev: Use tracker helpers to hold & put netdevices

Using the tracking helpers makes it easier to debug netdevice refcount
imbalances when CONFIG_NET_DEV_REFCNT_TRACKER is enabled.

Convert dev_hold() / dev_put() to netdev_hold() / netdev_put() in the
switchdev module.
Signed-off-by: default avatarPetr Machata <petrm@nvidia.com>
Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/774c3d7b5b0231f1435df2ec9dd660192e382756.1690471774.git.petrm@nvidia.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 16f8c846
...@@ -3380,6 +3380,7 @@ static void mlxsw_sp_fdb_notify_work(struct work_struct *work) ...@@ -3380,6 +3380,7 @@ static void mlxsw_sp_fdb_notify_work(struct work_struct *work)
struct mlxsw_sp_switchdev_event_work { struct mlxsw_sp_switchdev_event_work {
struct work_struct work; struct work_struct work;
netdevice_tracker dev_tracker;
union { union {
struct switchdev_notifier_fdb_info fdb_info; struct switchdev_notifier_fdb_info fdb_info;
struct switchdev_notifier_vxlan_fdb_info vxlan_fdb_info; struct switchdev_notifier_vxlan_fdb_info vxlan_fdb_info;
...@@ -3536,8 +3537,8 @@ static void mlxsw_sp_switchdev_bridge_fdb_event_work(struct work_struct *work) ...@@ -3536,8 +3537,8 @@ static void mlxsw_sp_switchdev_bridge_fdb_event_work(struct work_struct *work)
out: out:
rtnl_unlock(); rtnl_unlock();
kfree(switchdev_work->fdb_info.addr); kfree(switchdev_work->fdb_info.addr);
netdev_put(dev, &switchdev_work->dev_tracker);
kfree(switchdev_work); kfree(switchdev_work);
dev_put(dev);
} }
static void static void
...@@ -3692,8 +3693,8 @@ static void mlxsw_sp_switchdev_vxlan_fdb_event_work(struct work_struct *work) ...@@ -3692,8 +3693,8 @@ static void mlxsw_sp_switchdev_vxlan_fdb_event_work(struct work_struct *work)
out: out:
rtnl_unlock(); rtnl_unlock();
netdev_put(dev, &switchdev_work->dev_tracker);
kfree(switchdev_work); kfree(switchdev_work);
dev_put(dev);
} }
static int static int
...@@ -3793,7 +3794,7 @@ static int mlxsw_sp_switchdev_event(struct notifier_block *unused, ...@@ -3793,7 +3794,7 @@ static int mlxsw_sp_switchdev_event(struct notifier_block *unused,
* upper device containig mlxsw_sp_port or just a * upper device containig mlxsw_sp_port or just a
* mlxsw_sp_port * mlxsw_sp_port
*/ */
dev_hold(dev); netdev_hold(dev, &switchdev_work->dev_tracker, GFP_ATOMIC);
break; break;
case SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE: case SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE:
case SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE: case SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE:
...@@ -3803,7 +3804,7 @@ static int mlxsw_sp_switchdev_event(struct notifier_block *unused, ...@@ -3803,7 +3804,7 @@ static int mlxsw_sp_switchdev_event(struct notifier_block *unused,
info); info);
if (err) if (err)
goto err_vxlan_work_prepare; goto err_vxlan_work_prepare;
dev_hold(dev); netdev_hold(dev, &switchdev_work->dev_tracker, GFP_ATOMIC);
break; break;
default: default:
kfree(switchdev_work); kfree(switchdev_work);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment