> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On Behalf
> Of Kurt Kanzenbach
> Sent: Tuesday, March 3, 2026 12:49 PM
> To: Nguyen, Anthony L <[email protected]>; Kitszel,
> Przemyslaw <[email protected]>
> Cc: Paul Menzel <[email protected]>; Vadim Fedorenko
> <[email protected]>; Gomes, Vinicius
> <[email protected]>; [email protected]; Richard Cochran
> <[email protected]>; Kurt Kanzenbach <[email protected]>;
> [email protected]; Andrew Lunn <[email protected]>;
> Eric Dumazet <[email protected]>; [email protected];
> Keller, Jacob E <[email protected]>; Jakub Kicinski
> <[email protected]>; Paolo Abeni <[email protected]>; David S. Miller
> <[email protected]>; Sebastian Andrzej Siewior
> <[email protected]>
> Subject: [Intel-wired-lan] [PATCH iwl-next v4] igb: Retrieve Tx
> timestamp from BH workqueue
> 
> Retrieve Tx timestamp from system BH instead of regular system
> workqueue.
> 
> The current implementation uses schedule_work() which is executed by
> the system work queue and kworkers to retrieve Tx timestamps. This
> increases latency and can lead to timeouts in case of heavy system
> load. i210 is often used in industrial systems, where timestamp
> timeouts can be fatal.
> 
> Therefore, switch to the system BH workqueues which are executed
> directly at the end of the IRQ handler.
> 
I'd recommend "executed directly at the end of the IRQ handler" -> "executed in 
softirq context shortly after the IRQ handler returns"
But anyway.
Reviewed-by: Aleksandr Loktionov <[email protected]>

> Tested on Intel i210 and i350 with ptp4l.
> 
> Signed-off-by: Kurt Kanzenbach <[email protected]>
> ---
> Changes in v4:
> - Use BH workqueue (tasklet) instead of doing timestamping in IRQ path
> (Jakub Kicinski)
> - Link to v3: https://patch.msgid.link/20260205-igb_irq_ts-v3-1-
> [email protected]
> 
> Changes in v3:
> - Switch back to IRQ, but for i210 only
> - Keep kworker for all other NICs like i350 (Miroslav)
> - Link to v2: https://lore.kernel.org/r/20250822-igb_irq_ts-v2-1-
> [email protected]
> 
> Changes in v2:
> - Switch from IRQ to PTP aux worker due to NTP performance regression
> (Miroslav)
> - Link to v1: https://lore.kernel.org/r/20250815-igb_irq_ts-v1-1-
> [email protected]
> ---
>  drivers/net/ethernet/intel/igb/igb_main.c | 4 ++--
> drivers/net/ethernet/intel/igb/igb_ptp.c  | 2 +-
>  2 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/igb/igb_main.c
> b/drivers/net/ethernet/intel/igb/igb_main.c
> index ee99fd8fd513..9fd29fedb9f5 100644
> --- a/drivers/net/ethernet/intel/igb/igb_main.c
> +++ b/drivers/net/ethernet/intel/igb/igb_main.c
> @@ -6572,7 +6572,7 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff
> *skb,
>                       adapter->ptp_tx_skb = skb_get(skb);
>                       adapter->ptp_tx_start = jiffies;
>                       if (adapter->hw.mac.type == e1000_82576)
> -                             schedule_work(&adapter->ptp_tx_work);
> +                             queue_work(system_bh_wq, &adapter-
> >ptp_tx_work);
>               } else {
>                       adapter->tx_hwtstamp_skipped++;
>               }
> @@ -7076,7 +7076,7 @@ static void igb_tsync_interrupt(struct
> igb_adapter *adapter)
> 
>       if (tsicr & E1000_TSICR_TXTS) {
>               /* retrieve hardware timestamp */
> -             schedule_work(&adapter->ptp_tx_work);
> +             queue_work(system_bh_wq, &adapter->ptp_tx_work);
>       }
> 
>       if (tsicr & TSINTR_TT0)
> diff --git a/drivers/net/ethernet/intel/igb/igb_ptp.c
> b/drivers/net/ethernet/intel/igb/igb_ptp.c
> index bd85d02ecadd..7b44f9090631 100644
> --- a/drivers/net/ethernet/intel/igb/igb_ptp.c
> +++ b/drivers/net/ethernet/intel/igb/igb_ptp.c
> @@ -832,7 +832,7 @@ static void igb_ptp_tx_work(struct work_struct
> *work)
>               igb_ptp_tx_hwtstamp(adapter);
>       else
>               /* reschedule to check later */
> -             schedule_work(&adapter->ptp_tx_work);
> +             queue_work(system_bh_wq, &adapter->ptp_tx_work);
>  }
> 
>  static void igb_ptp_overflow_check(struct work_struct *work)
> 
> ---
> base-commit: a0e8c9a5060fbdb72fca767164467a3cf2b8fc30
> change-id: 20250813-igb_irq_ts-1aa77cc7b4cb
> 
> Best regards,
> --
> Kurt Kanzenbach <[email protected]>

Reply via email to