mlx5e profile change fix
cover mlx5e profile change fix
From: Saeed Mahameed <[email protected]>
This series fixes a crash in mlx5e due to profile change error flow.
Saeed Mahameed (4):
net/mlx5e: Fix crash on profile change rollback failure net/mlx5e: Don't store mlx5e_priv in mlx5e_dev devlink priv net/mlx5e: Pass netdev to mlx5e_destroy_netdev instead of priv net/mlx5e: Restore destroying state bit after profile cleanup
drivers/net/ethernet/mellanox/mlx5/core/en.h | 13 +-- .../net/ethernet/mellanox/mlx5/core/en_main.c | 86 ++++++++++++------- .../net/ethernet/mellanox/mlx5/core/en_rep.c | 15 ++-- 3 files changed, 71 insertions(+), 43 deletions(-)
Signature · 1 line
2.52.0
PATCH 1/4 net/mlx5e: Fix crash on profile change rollback failure
From: Saeed Mahameed <[email protected]>
mlx5e_netdev_change_profile can fail to attach a new profile and can fail to rollback to old profile, in such case, we could end up with a dangling netdev with a fully reset netdev_priv. A retry to change profile, e.g. another attempt to call mlx5e_netdev_change_profile via switchdev mode change, will crash trying to access the now NULL priv->mdev.
This fix allows mlx5e_netdev_change_profile() to handle previous failures and an empty priv, by not assuming priv is valid.
Pass netdev and mdev to all flows requiring mlx5e_netdev_change_profile() and avoid passing priv.
In mlx5e_netdev_change_profile() check if current priv is valid, and if not, just attach the new profile without trying to access the old one.
This fixes the following oops, when enabling switchdev mode for the 2nd time after first time failure:
## Enabling switchdev mode first time:
mlx5_core 0012:03:00.1: E-Switch: Supported tc chains and prios offload
workqueue: Failed to create a rescuer kthread for wq "mlx5e": -EINTRmlx5_core 0012:03:00.1: mlx5e_netdev_init_profile:6214:(pid 37199): mlx5e_priv_init failed, err=-12 mlx5_core 0012:03:00.1 gpu3rdma1: mlx5e_netdev_change_profile: new profile init failed, -12
workqueue: Failed to create a rescuer kthread for wq "mlx5e": -EINTRmlx5_core 0012:03:00.1: mlx5e_netdev_init_profile:6214:(pid 37199): mlx5e_priv_init failed, err=-12 mlx5_core 0012:03:00.1 gpu3rdma1: mlx5e_netdev_change_profile: failed to rollback to orig profile, -12
^^^^^^^^
mlx5_core 0000:00:03.0: E-Switch: Disable: mode(LEGACY), nvfs(0), necvfs(0), active vports(0)
## retry: Enabling switchdev mode 2nd time:
mlx5_core 0000:00:03.0: E-Switch: Supported tc chains and prios offload
BUG: kernel NULL pointer dereference, address: 0000000000000038 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: Oops: 0000 [#1] SMP NOPTI CPU: 13 UID: 0 PID: 520 Comm: devlink Not tainted 6.18.0-rc4+ #91 PREEMPT(voluntary) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-2.fc40 04/01/2014 RIP: 0010:mlx5e_detach_netdev+0x3c/0x90 Code: 50 00 00 f0 80 4f 78 02 48 8b bf e8 07 00 00 48 85 ff 74 16 48 8b 73 78 48 d1 ee 83 e6 01 83 f6 01 40 0f b6 f6 e8 c4 42 00 00 <48> 8b 45 38 48 85 c0 74 08 48 89 df e8 cc 47 40 1e 48 8b bb f0 07 RSP: 0018:ffffc90000673890 EFLAGS: 00010246 RAX: 0000000000000000 RBX: ffff8881036a89c0 RCX: 0000000000000000 RDX: ffff888113f63800 RSI: ffffffff822fe720 RDI: 0000000000000000 RBP: 0000000000000000 R08: 0000000000002dcd R09: 0000000000000000 R10: ffffc900006738e8 R11: 00000000ffffffff R12: 0000000000000000 R13: 0000000000000000 R14: ffff8881036a89c0 R15: 0000000000000000 FS: 00007fdfb8384740(0000) GS:ffff88856a9d6000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000038 CR3: 0000000112ae0005 CR4: 0000000000370ef0 Call Trace: <TASK> mlx5e_netdev_change_profile+0x45/0xb0 mlx5e_vport_rep_load+0x27b/0x2d0 mlx5_esw_offloads_rep_load+0x72/0xf0 esw_offloads_enable+0x5d0/0x970 mlx5_eswitch_enable_locked+0x349/0x430 ? is_mp_supported+0x57/0xb0 mlx5_devlink_eswitch_mode_set+0x26b/0x430 devlink_nl_eswitch_set_doit+0x6f/0xf0 genl_family_rcv_msg_doit+0xe8/0x140 genl_rcv_msg+0x18b/0x290 ? __pfx_devlink_nl_pre_doit+0x10/0x10 ? __pfx_devlink_nl_eswitch_set_doit+0x10/0x10 ? __pfx_devlink_nl_post_doit+0x10/0x10 ? __pfx_genl_rcv_msg+0x10/0x10 netlink_rcv_skb+0x52/0x100 genl_rcv+0x28/0x40 netlink_unicast+0x282/0x3e0 ? __alloc_skb+0xd6/0x190 netlink_sendmsg+0x1f7/0x430 __sys_sendto+0x213/0x220 ? __sys_recvmsg+0x6a/0xd0 __x64_sys_sendto+0x24/0x30 do_syscall_64+0x50/0x1f0 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0033:0x7fdfb8495047
--- drivers/net/ethernet/mellanox/mlx5/core/en.h | 9 ++-- .../net/ethernet/mellanox/mlx5/core/en_main.c | 48 +++++++++++++------ .../net/ethernet/mellanox/mlx5/core/en_rep.c | 11 ++--- 3 files changed, 44 insertions(+), 24 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en.h +6 -3
@@ -1243,9 +1243,12 @@ mlx5e_create_netdev(struct mlx5_core_dev *mdev, const struct mlx5e_profile *profint mlx5e_attach_netdev (struct mlx5e_priv *priv);void mlx5e_detach_netdev (struct mlx5e_priv *priv);void mlx5e_destroy_netdev (struct mlx5e_priv *priv); -int mlx5e_netdev_change_profile (struct mlx5e_priv *priv, -const struct mlx5e_profile *new_profile,void *new_ppriv); -void mlx5e_netdev_attach_nic_profile (struct mlx5e_priv *priv); +int mlx5e_netdev_change_profile (struct net_device *netdev, +struct mlx5_core_dev *mdev, +const struct mlx5e_profile *new_profile, +void *new_ppriv); +void mlx5e_netdev_attach_nic_profile (struct net_device *netdev, +struct mlx5_core_dev *mdev);void mlx5e_set_netdev_mtu_boundaries (struct mlx5e_priv *priv);void mlx5e_build_nic_params (struct mlx5e_priv *priv,struct mlx5e_xsk *xsk,u16 mtu);
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +33 -15
68 lines not on this page · raw message
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +5 -6
@@ -1508,17 +1508,16 @@ mlx5e_vport_uplink_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep * {struct mlx5e_rep_priv *rpriv =mlx5e_rep_to_rep_priv (rep);struct net_device *netdev; -struct mlx5e_priv *priv;int err; netdev =mlx5_uplink_netdev_get (dev);if (!netdev)return 0 ; - priv =netdev_priv (netdev); - rpriv->netdev = priv->netdev; - err =mlx5e_netdev_change_profile (priv, &mlx5e_uplink_rep_profile, - rpriv); +/* must not use netdev_priv(netdev), it might not be initialized yet */ + rpriv->netdev = netdev; + err =mlx5e_netdev_change_profile (netdev, dev, + &mlx5e_uplink_rep_profile, rpriv);mlx5_uplink_netdev_put (dev, netdev);return err; }
@@ -1546,7 +1545,7 @@ mlx5e_vport_uplink_rep_unload(struct mlx5e_rep_priv *rpriv)if (!(priv->mdev->priv.flags &MLX5_PRIV_FLAGS_SWITCH_LEGACY ))unregister_netdev (netdev); -mlx5e_netdev_attach_nic_profile (priv); +mlx5e_netdev_attach_nic_profile (netdev, priv->mdev); } static int
Signature · 1 line
2.52.0
PATCH 2/4 net/mlx5e: Don't store mlx5e_priv in mlx5e_dev devlink priv
In reply to Saeed MahameedFrom: Saeed Mahameed <[email protected]>
mlx5e_priv is an unstable structure that can be memset(0) if profile attaching fails, mlx5e_priv in mlx5e_dev devlink private is used to reference the netdev and mdev associated with that struct. Instead, store netdev directly into mlx5e_dev and get mdev from the containing mlx5_adev aux device structure.
This fixes a kernel oops in mlx5e_remove when switchdev mode fails due to change profile failure.
$ devlink dev eswitch set pci/0000:00:03.0 mode switchdev Error: mlx5_core: Failed setting eswitch to offloads. dmesg: workqueue: Failed to create a rescuer kthread for wq "mlx5e": -EINTR mlx5_core 0012:03:00.1: mlx5e_netdev_init_profile:6214:(pid 37199): mlx5e_priv_init failed, err=-12 mlx5_core 0012:03:00.1 gpu3rdma1: mlx5e_netdev_change_profile: new profile init failed, -12 workqueue: Failed to create a rescuer kthread for wq "mlx5e": -EINTR mlx5_core 0012:03:00.1: mlx5e_netdev_init_profile:6214:(pid 37199): mlx5e_priv_init failed, err=-12 mlx5_core 0012:03:00.1 gpu3rdma1: mlx5e_netdev_change_profile: failed to rollback to orig profile, -12
$ devlink dev reload pci/0000:00:03.0 ==> oops
BUG: kernel NULL pointer dereference, address: 0000000000000520 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: Oops: 0000 [#1] SMP NOPTI CPU: 3 UID: 0 PID: 521 Comm: devlink Not tainted 6.18.0-rc5+ #117 PREEMPT(voluntary) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-2.fc40 04/01/2014 RIP: 0010:mlx5e_remove+0x68/0x130 RSP: 0018:ffffc900034838f0 EFLAGS: 00010246 RAX: ffff88810283c380 RBX: ffff888101874400 RCX: ffffffff826ffc45 RDX: 0000000000000000 RSI: 0000000000000001 RDI: 0000000000000000 RBP: ffff888102d789c0 R08: ffff8881007137f0 R09: ffff888100264e10 R10: ffffc90003483898 R11: ffffc900034838a0 R12: ffff888100d261a0 R13: ffff888100d261a0 R14: ffff8881018749a0 R15: ffff888101874400 FS: 00007f8565fea740(0000) GS:ffff88856a759000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000520 CR3: 000000010b11a004 CR4: 0000000000370ef0 Call Trace: <TASK> device_release_driver_internal+0x19c/0x200 bus_remove_device+0xc6/0x130 device_del+0x160/0x3d0 ? devl_param_driverinit_value_get+0x2d/0x90 mlx5_detach_device+0x89/0xe0 mlx5_unload_one_devl_locked+0x3a/0x70 mlx5_devlink_reload_down+0xc8/0x220 devlink_reload+0x7d/0x260 devlink_nl_reload_doit+0x45b/0x5a0 genl_family_rcv_msg_doit+0xe8/0x140
--- drivers/net/ethernet/mellanox/mlx5/core/en.h | 2 +- .../net/ethernet/mellanox/mlx5/core/en_main.c | 20 ++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en.h +1 -1
@@ -962,7 +962,7 @@ struct mlx5e_priv { };struct mlx5e_dev { -struct mlx5e_priv *priv; +struct net_device *netdev;struct devlink_port dl_port; };
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +11 -9
@@ -6655,8 +6655,8 @@ static int _mlx5e_resume(struct auxiliary_device *adev) { struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev);struct mlx5e_dev *mlx5e_dev =auxiliary_get_drvdata (adev); -struct mlx5e_priv *priv = mlx5e_dev->priv; -struct net_device *netdev = priv->netdev; +struct mlx5e_priv *priv =netdev_priv (mlx5e_dev->netdev); +struct net_device *netdev = mlx5e_dev->netdev;struct mlx5_core_dev *mdev = edev->mdev;struct mlx5_core_dev *pos, *to;int err, i;
@@ -6702,10 +6702,11 @@ static int mlx5e_resume(struct auxiliary_device *adev)static int _mlx5e_suspend (struct auxiliary_device *adev,bool pre_netdev_reg) { + struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev);struct mlx5e_dev *mlx5e_dev =auxiliary_get_drvdata (adev); -struct mlx5e_priv *priv = mlx5e_dev->priv; -struct net_device *netdev = priv->netdev; -struct mlx5_core_dev *mdev = priv->mdev; +struct mlx5e_priv *priv =netdev_priv (mlx5e_dev->netdev); +struct net_device *netdev = mlx5e_dev->netdev; +struct mlx5_core_dev *mdev = edev->mdev;struct mlx5_core_dev *pos;int i;
@@ -6766,11 +6767,11 @@ static int _mlx5e_probe(struct auxiliary_device *adev) goto err_devlink_port_unregister; }SET_NETDEV_DEVLINK_PORT (netdev, &mlx5e_dev->dl_port); + mlx5e_dev->netdev = netdev;mlx5e_build_nic_netdev (netdev); priv =netdev_priv (netdev); - mlx5e_dev->priv = priv; priv->profile = profile; priv->ppriv =NULL ;
@@ -6833,7 +6834,8 @@ static void _mlx5e_remove(struct auxiliary_device *adev) { struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev);struct mlx5e_dev *mlx5e_dev =auxiliary_get_drvdata (adev); -struct mlx5e_priv *priv = mlx5e_dev->priv; +struct net_device *netdev = mlx5e_dev->netdev; +struct mlx5e_priv *priv =netdev_priv (netdev);struct mlx5_core_dev *mdev = edev->mdev;mlx5_core_uplink_netdev_set (mdev,NULL );
@@ -6842,8 +6844,8 @@ static void _mlx5e_remove(struct auxiliary_device *adev)* if it's from legacy mode. If from switchdev mode, it * is already unregistered before changing to NIC profile. */ -if (priv->netdev->reg_state ==NETREG_REGISTERED ) { -unregister_netdev (priv->netdev); +if (netdev->reg_state ==NETREG_REGISTERED ) { +unregister_netdev (netdev);_mlx5e_suspend (adev, false); }else {struct mlx5_core_dev *pos;
Signature · 1 line
2.52.0
PATCH 3/4 net/mlx5e: Pass netdev to mlx5e_destroy_netdev instead of priv
In reply to Saeed MahameedFrom: Saeed Mahameed <[email protected]>
mlx5e_priv is an unstable structure that can be memset(0) if profile attaching fails.
Pass netdev to mlx5e_destroy_netdev() to guarantee it will work on a valid netdev.
On mlx5e_remove: Check validity of priv->profile, before attempting to cleanup any resources that might be not there.
This fixes a kernel oops in mlx5e_remove when switchdev mode fails due to change profile failure.
$ devlink dev eswitch set pci/0000:00:03.0 mode switchdev Error: mlx5_core: Failed setting eswitch to offloads. dmesg: workqueue: Failed to create a rescuer kthread for wq "mlx5e": -EINTR mlx5_core 0012:03:00.1: mlx5e_netdev_init_profile:6214:(pid 37199): mlx5e_priv_init failed, err=-12 mlx5_core 0012:03:00.1 gpu3rdma1: mlx5e_netdev_change_profile: new profile init failed, -12 workqueue: Failed to create a rescuer kthread for wq "mlx5e": -EINTR mlx5_core 0012:03:00.1: mlx5e_netdev_init_profile:6214:(pid 37199): mlx5e_priv_init failed, err=-12 mlx5_core 0012:03:00.1 gpu3rdma1: mlx5e_netdev_change_profile: failed to rollback to orig profile, -12
$ devlink dev reload pci/0000:00:03.0 ==> oops
BUG: kernel NULL pointer dereference, address: 0000000000000370 PGD 0 P4D 0 Oops: Oops: 0000 [#1] SMP NOPTI CPU: 15 UID: 0 PID: 520 Comm: devlink Not tainted 6.18.0-rc5+ #115 PREEMPT(voluntary) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-2.fc40 04/01/2014 RIP: 0010:mlx5e_dcbnl_dscp_app+0x23/0x100 RSP: 0018:ffffc9000083f8b8 EFLAGS: 00010286 RAX: ffff8881126fc380 RBX: ffff8881015ac400 RCX: ffffffff826ffc45 RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff8881035109c0 RBP: ffff8881035109c0 R08: ffff888101e3e838 R09: ffff888100264e10 R10: ffffc9000083f898 R11: ffffc9000083f8a0 R12: ffff888101b921a0 R13: ffff888101b921a0 R14: ffff8881015ac9a0 R15: ffff8881015ac400 FS: 00007f789a3c8740(0000) GS:ffff88856aa59000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000370 CR3: 000000010b6c0001 CR4: 0000000000370ef0 Call Trace: <TASK> mlx5e_remove+0x57/0x110 device_release_driver_internal+0x19c/0x200 bus_remove_device+0xc6/0x130 device_del+0x160/0x3d0 ? devl_param_driverinit_value_get+0x2d/0x90 mlx5_detach_device+0x89/0xe0 mlx5_unload_one_devl_locked+0x3a/0x70 mlx5_devlink_reload_down+0xc8/0x220 devlink_reload+0x7d/0x260 devlink_nl_reload_doit+0x45b/0x5a0 genl_family_rcv_msg_doit+0xe8/0x140
--- drivers/net/ethernet/mellanox/mlx5/core/en.h | 2 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 15 +++++++++------ drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en.h +1 -1
@@ -1242,7 +1242,7 @@ struct net_device * mlx5e_create_netdev(struct mlx5_core_dev *mdev, const struct mlx5e_profile *profile);int mlx5e_attach_netdev (struct mlx5e_priv *priv);void mlx5e_detach_netdev (struct mlx5e_priv *priv); -void mlx5e_destroy_netdev (struct mlx5e_priv *priv); +void mlx5e_destroy_netdev (struct net_device *netdev); int mlx5e_netdev_change_profile(struct net_device *netdev, struct mlx5_core_dev *mdev, const struct mlx5e_profile *new_profile,
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +9 -6
@@ -6643,11 +6643,12 @@ void mlx5e_netdev_attach_nic_profile(struct net_device *netdev,mlx5e_netdev_change_profile (netdev, mdev, &mlx5e_nic_profile,NULL ); } -void mlx5e_destroy_netdev (struct mlx5e_priv *priv) +void mlx5e_destroy_netdev (struct net_device *netdev) { -struct net_device *netdev = priv->netdev; +struct mlx5e_priv *priv =netdev_priv (netdev); -mlx5e_priv_cleanup (priv); +if (priv->profile) +mlx5e_priv_cleanup (priv);free_netdev (netdev); }
@@ -6804,7 +6805,7 @@ static int _mlx5e_probe(struct auxiliary_device *adev) err_profile_cleanup: profile->cleanup (priv); err_destroy_netdev: -mlx5e_destroy_netdev (priv); +mlx5e_destroy_netdev (netdev); err_devlink_port_unregister:mlx5e_devlink_port_unregister (mlx5e_dev); err_devlink_unregister:
@@ -6839,7 +6840,9 @@ static void _mlx5e_remove(struct auxiliary_device *adev)struct mlx5_core_dev *mdev = edev->mdev;mlx5_core_uplink_netdev_set (mdev,NULL ); -mlx5e_dcbnl_delete_app (priv); + +if (priv->profile) +mlx5e_dcbnl_delete_app (priv);/* When unload driver, the netdev is in registered state * if it's from legacy mode. If from switchdev mode, it * is already unregistered before changing to NIC profile.
@@ -6860,7 +6863,7 @@ static void _mlx5e_remove(struct auxiliary_device *adev)/* Avoid cleanup if profile rollback failed. */ if (priv->profile) priv->profile->cleanup (priv); -mlx5e_destroy_netdev (priv); +mlx5e_destroy_netdev (netdev);mlx5e_devlink_port_unregister (mlx5e_dev);mlx5e_destroy_devlink (mlx5e_dev); }
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +2 -2
@@ -1611,7 +1611,7 @@ mlx5e_vport_vf_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep) priv->profile->cleanup (priv); err_destroy_netdev: -mlx5e_destroy_netdev (netdev_priv (netdev)); +mlx5e_destroy_netdev (netdev);return err; }
@@ -1666,7 +1666,7 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep)mlx5e_rep_vnic_reporter_destroy (priv);mlx5e_detach_netdev (priv); priv->profile->cleanup (priv); -mlx5e_destroy_netdev (priv); +mlx5e_destroy_netdev (netdev); free_ppriv:kvfree (ppriv);/* mlx5e_rep_priv */ }
Signature · 1 line
2.52.0
PATCH 4/4 net/mlx5e: Restore destroying state bit after profile cleanup
In reply to Saeed MahameedFrom: Saeed Mahameed <[email protected]>
Profile rollback can fail in mlx5e_netdev_change_profile() and we will end up with invalid mlx5e_priv memset to 0, we must maintain the 'destroying' bit in order to gracefully shutdown even if the profile/priv are not valid.
This patch maintains the previous state of the 'destroying' state of mlx5e_priv after priv cleanup, to allow the remove flow to cleanup common resources from mlx5_core to avoid FW fatal errors as seen below:
$ devlink dev eswitch set pci/0000:00:03.0 mode switchdev
Error: mlx5_core: Failed setting eswitch to offloads.
dmesg: mlx5_core 0000:00:03.0 enp0s3np0: failed to rollback to orig profile, ...$ devlink dev reload pci/0000:00:03.0
mlx5_core 0000:00:03.0: E-Switch: Disable: mode(LEGACY), nvfs(0), necvfs(0), active vports(0) mlx5_core 0000:00:03.0: poll_health:803:(pid 519): Fatal error 3 detectedmlx5_core 0000:00:03.0: firmware version: 28.41.1000mlx5_core 0000:00:03.0: 0.000 Gb/s available PCIe bandwidth (Unknown x255 link)mlx5_core 0000:00:03.0: mlx5_function_enable:1200:(pid 519): enable hca failedmlx5_core 0000:00:03.0: mlx5_function_enable:1200:(pid 519): enable hca failedmlx5_core 0000:00:03.0: mlx5_health_try_recover:340:(pid 141): handling bad device here mlx5_core 0000:00:03.0: mlx5_handle_bad_state:285:(pid 141): Expected to see disabled NIC but it is full driver mlx5_core 0000:00:03.0: mlx5_error_sw_reset:236:(pid 141): startmlx5_core 0000:00:03.0: NIC IFC still 0 after 4000ms.
--- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +3 -0
@@ -6325,6 +6325,7 @@ int mlx5e_priv_init(struct mlx5e_priv *priv,void mlx5e_priv_cleanup (struct mlx5e_priv *priv) { +bool destroying =test_bit (MLX5E_STATE_DESTROYING , &priv->state);int i;/* bail if change profile failed and also rollback failed */
@@ -6352,6 +6353,8 @@ void mlx5e_priv_cleanup(struct mlx5e_priv *priv) }memset (priv,0 ,sizeof (*priv)); +if (destroying)/* restore destroying bit, to allow unload */ +set_bit (MLX5E_STATE_DESTROYING , &priv->state); } static unsigned int mlx5e_get_max_num_txqs(struct mlx5_core_dev *mdev,
Signature · 1 line
2.52.0
This series was applied to netdev/net.git (main) by Jakub Kicinski <[email protected]>:
Hello:
This series was applied to netdev/net.git (main)
by Jakub Kicinski <[email protected]>:
Quoted 11 lines · On Thu, 8 Jan 2026 13:26:53 -0800 you wrote:
From: Saeed Mahameed <[email protected]>
This series fixes a crash in mlx5e due to profile change error flow.
Saeed Mahameed (4):
net/mlx5e: Fix crash on profile change rollback failure net/mlx5e: Don't storemlx5e_privinmlx5e_devdevlink priv net/mlx5e: Pass netdev tomlx5e_destroy_netdevinstead of priv net/mlx5e: Restore destroying state bit after profile cleanup[...]
Here is the summary with links:
- [net,1/4] net/mlx5e: Fix crash on profile change rollback failure
https://git.kernel.org/netdev/net/c/4dadc4077e3f - [net,2/4] net/mlx5e: Don't store mlx5e_priv in mlx5e_dev devlink priv https://git.kernel.org/netdev/net/c/123eda2e5b16 - [net,3/4] net/mlx5e: Pass netdev to mlx5e_destroy_netdev instead of priv https://git.kernel.org/netdev/net/c/4ef8512e1427 - [net,4/4] net/mlx5e: Restore destroying state bit after profile cleanup https://git.kernel.org/netdev/net/c/5629f8859dca
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html