| From f04b3f2decf21383673ed398623c8006ced9ba2c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 21 Aug 2023 10:19:27 -0700 |
| Subject: igb: Avoid starting unnecessary workqueues |
| |
| From: Alessio Igor Bogani <alessio.bogani@elettra.eu> |
| |
| [ Upstream commit b888c510f7b3d64ca75fc0f43b4a4bd1a611312f ] |
| |
| If ptp_clock_register() fails or CONFIG_PTP isn't enabled, avoid starting |
| PTP related workqueues. |
| |
| In this way we can fix this: |
| BUG: unable to handle page fault for address: ffffc9000440b6f8 |
| #PF: supervisor read access in kernel mode |
| #PF: error_code(0x0000) - not-present page |
| PGD 100000067 P4D 100000067 PUD 1001e0067 PMD 107dc5067 PTE 0 |
| Oops: 0000 [#1] PREEMPT SMP |
| [...] |
| Workqueue: events igb_ptp_overflow_check |
| RIP: 0010:igb_rd32+0x1f/0x60 |
| [...] |
| Call Trace: |
| igb_ptp_read_82580+0x20/0x50 |
| timecounter_read+0x15/0x60 |
| igb_ptp_overflow_check+0x1a/0x50 |
| process_one_work+0x1cb/0x3c0 |
| worker_thread+0x53/0x3f0 |
| ? rescuer_thread+0x370/0x370 |
| kthread+0x142/0x160 |
| ? kthread_associate_blkcg+0xc0/0xc0 |
| ret_from_fork+0x1f/0x30 |
| |
| Fixes: 1f6e8178d685 ("igb: Prevent dropped Tx timestamps via work items and interrupts.") |
| Fixes: d339b1331616 ("igb: add PTP Hardware Clock code") |
| Signed-off-by: Alessio Igor Bogani <alessio.bogani@elettra.eu> |
| Tested-by: Arpana Arland <arpanax.arland@intel.com> (A Contingent worker at Intel) |
| Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> |
| Reviewed-by: Simon Horman <horms@kernel.org> |
| Link: https://lore.kernel.org/r/20230821171927.2203644-1-anthony.l.nguyen@intel.com |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/intel/igb/igb_ptp.c | 24 ++++++++++++------------ |
| 1 file changed, 12 insertions(+), 12 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/intel/igb/igb_ptp.c b/drivers/net/ethernet/intel/igb/igb_ptp.c |
| index 405886ee52615..319c544b9f04c 100644 |
| --- a/drivers/net/ethernet/intel/igb/igb_ptp.c |
| +++ b/drivers/net/ethernet/intel/igb/igb_ptp.c |
| @@ -1385,18 +1385,6 @@ void igb_ptp_init(struct igb_adapter *adapter) |
| return; |
| } |
| |
| - spin_lock_init(&adapter->tmreg_lock); |
| - INIT_WORK(&adapter->ptp_tx_work, igb_ptp_tx_work); |
| - |
| - if (adapter->ptp_flags & IGB_PTP_OVERFLOW_CHECK) |
| - INIT_DELAYED_WORK(&adapter->ptp_overflow_work, |
| - igb_ptp_overflow_check); |
| - |
| - adapter->tstamp_config.rx_filter = HWTSTAMP_FILTER_NONE; |
| - adapter->tstamp_config.tx_type = HWTSTAMP_TX_OFF; |
| - |
| - igb_ptp_reset(adapter); |
| - |
| adapter->ptp_clock = ptp_clock_register(&adapter->ptp_caps, |
| &adapter->pdev->dev); |
| if (IS_ERR(adapter->ptp_clock)) { |
| @@ -1406,6 +1394,18 @@ void igb_ptp_init(struct igb_adapter *adapter) |
| dev_info(&adapter->pdev->dev, "added PHC on %s\n", |
| adapter->netdev->name); |
| adapter->ptp_flags |= IGB_PTP_ENABLED; |
| + |
| + spin_lock_init(&adapter->tmreg_lock); |
| + INIT_WORK(&adapter->ptp_tx_work, igb_ptp_tx_work); |
| + |
| + if (adapter->ptp_flags & IGB_PTP_OVERFLOW_CHECK) |
| + INIT_DELAYED_WORK(&adapter->ptp_overflow_work, |
| + igb_ptp_overflow_check); |
| + |
| + adapter->tstamp_config.rx_filter = HWTSTAMP_FILTER_NONE; |
| + adapter->tstamp_config.tx_type = HWTSTAMP_TX_OFF; |
| + |
| + igb_ptp_reset(adapter); |
| } |
| } |
| |
| -- |
| 2.40.1 |
| |