Message ID | 20240522192659.840796-7-tariqt@nvidia.com (mailing list archive) |
---|---|
State | Accepted |
Commit | f55cd31287e5f77f226c91d2f7756bafa0d583ed |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | mlx5 fixes 24-05-22 | expand |
On Wed, May 22, 2024 at 10:26:57PM +0300, Tariq Toukan wrote: > From: Rahul Rameshbabu <rrameshbabu@nvidia.com> > > The ptp channel instance is only initialized when ptp traffic is first > processed by the driver. This means that there is a window in between when > port timestamping is enabled and ptp traffic is sent where the ptp channel > instance is not initialized. Accessing statistics during this window will > lead to an access violation (NULL + member offset). Check the validity of > the instance before attempting to query statistics. > > BUG: unable to handle page fault for address: 0000000000003524 > #PF: supervisor read access in kernel mode > #PF: error_code(0x0000) - not-present page > PGD 109dfc067 P4D 109dfc067 PUD 1064ef067 PMD 0 > Oops: 0000 [#1] SMP > CPU: 0 PID: 420 Comm: ethtool Not tainted 6.9.0-rc2-rrameshbabu+ #245 > Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS Arch Linux 1.16.3-1-1 04/01/204 > RIP: 0010:mlx5e_stats_ts_get+0x4c/0x130 > <snip> > Call Trace: > <TASK> > ? show_regs+0x60/0x70 > ? __die+0x24/0x70 > ? page_fault_oops+0x15f/0x430 > ? do_user_addr_fault+0x2c9/0x5c0 > ? exc_page_fault+0x63/0x110 > ? asm_exc_page_fault+0x27/0x30 > ? mlx5e_stats_ts_get+0x4c/0x130 > ? mlx5e_stats_ts_get+0x20/0x130 > mlx5e_get_ts_stats+0x15/0x20 > <snip> > > Fixes: 3579032c08c1 ("net/mlx5e: Implement ethtool hardware timestamping statistics") > Signed-off-by: Rahul Rameshbabu <rrameshbabu@nvidia.com> > Signed-off-by: Tariq Toukan <tariqt@nvidia.com> Reviewed-by: Simon Horman <horms@kernel.org>
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c index e211c41cec06..e1ed214e8651 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c @@ -1186,6 +1186,9 @@ void mlx5e_stats_ts_get(struct mlx5e_priv *priv, ts_stats->err = 0; ts_stats->lost = 0; + if (!ptp) + goto out; + /* Aggregate stats across all TCs */ for (i = 0; i < ptp->num_tc; i++) { struct mlx5e_ptp_cq_stats *stats = @@ -1214,6 +1217,7 @@ void mlx5e_stats_ts_get(struct mlx5e_priv *priv, } } +out: mutex_unlock(&priv->state_lock); }