mirror_ubuntu-kernels/drivers/net/ethernet/intel/ice
Jacob Keller d40fd60093 ice: handle flushing stale Tx timestamps in ice_ptp_tx_tstamp
In the event of a PTP clock time change due to .adjtime or .settime, the
ice driver needs to update the cached copy of the PHC time and also discard
any outstanding Tx timestamps.

This is required because otherwise the wrong copy of the PHC time will be
used when extending the Tx timestamp. This could result in reporting
incorrect timestamps to the stack.

The current approach taken to handle this is to call
ice_ptp_flush_tx_tracker, which will discard any timestamps which are not
yet complete.

This is problematic for two reasons:

1) it could lead to a potential race condition where the wrong timestamp is
   associated with a future packet.

   This can occur with the following flow:

   1. Thread A gets request to transmit a timestamped packet, and picks an
      index and transmits the packet

   2. Thread B calls ice_ptp_flush_tx_tracker and sees the index in use,
      marking is as disarded. No timestamp read occurs because the status
      bit is not set, but the index is released for re-use

   3. Thread A gets a new request to transmit another timestamped packet,
      picks the same (now unused) index and transmits that packet.

   4. The PHY transmits the first packet and updates the timestamp slot and
      generates an interrupt.

   5. The ice_ptp_tx_tstamp thread executes and sees the interrupt and a
      valid timestamp but associates it with the new Tx SKB and not the one
      that actual timestamp for the packet as expected.

   This could result in the previous timestamp being assigned to a new
   packet producing incorrect timestamps and leading to incorrect behavior
   in PTP applications.

   This is most likely to occur when the packet rate for Tx timestamp
   requests is very high.

2) on E822 hardware, we must avoid reading a timestamp index more than once
   each time its status bit is set and an interrupt is generated by
   hardware.

   We do have some extensive checks for the unread flag to ensure that only
   one of either the ice_ptp_flush_tx_tracker or ice_ptp_tx_tstamp threads
   read the timestamp. However, even with this we can still have cases
   where we "flush" a timestamp that was actually completed in hardware.
   This can lead to cases where we don't read the timestamp index as
   appropriate.

To fix both of these issues, we must avoid calling ice_ptp_flush_tx_tracker
outside of the teardown path.

Rather than using ice_ptp_flush_tx_tracker, introduce a new state bitmap,
the stale bitmap. Start this as cleared when we begin a new timestamp
request. When we're about to extend a timestamp and send it up to the
stack, first check to see if that stale bit was set. If so, drop the
timestamp without sending it to the stack.

When we need to update the cached PHC timestamp out of band, just mark all
currently outstanding timestamps as stale. This will ensure that once
hardware completes the timestamp we'll ignore it correctly and avoid
reporting bogus timestamps to userspace.

With this change, we fix potential issues caused  by calling
ice_ptp_flush_tx_tracker during normal operation.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Gurucharan G <gurucharanx.g@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
2022-12-08 13:15:03 -08:00
..
ice_adminq_cmd.h ice: Introduce new parameters in ice_sched_node 2022-11-17 21:41:27 -08:00
ice_arfs.c ice: arfs: fix use-after-free when freeing @rx_cpu_rmap 2022-04-08 09:08:36 -07:00
ice_arfs.h ice: remove circular header dependencies on ice.h 2022-03-14 17:22:58 -07:00
ice_base.c ice: Use ICE_RLAN_BASE_S instead of magic number 2022-11-23 08:59:43 -08:00
ice_base.h
ice_cgu_regs.h
ice_common.c ice: Remove and replace ice speed defines with ethtool.h versions 2022-11-23 08:59:42 -08:00
ice_common.h ice: Remove and replace ice speed defines with ethtool.h versions 2022-11-23 08:59:42 -08:00
ice_controlq.c
ice_controlq.h
ice_dcb_lib.c ice: Accumulate HW and Netdev statistics over reset 2022-11-23 08:59:43 -08:00
ice_dcb_lib.h
ice_dcb_nl.c
ice_dcb_nl.h
ice_dcb.c ice: Add an option to pre-allocate memory for ice_sched_node 2022-11-17 21:41:28 -08:00
ice_dcb.h ice: remove circular header dependencies on ice.h 2022-03-14 17:22:58 -07:00
ice_devids.h ice: support features on new E810T variants 2022-09-28 11:40:57 -07:00
ice_devlink.c net: devlink: let the core report the driver name instead of the drivers 2022-11-30 21:49:38 -08:00
ice_devlink.h ice: Prevent ADQ, DCB coexistence with Custom Tx scheduler 2022-11-17 21:41:28 -08:00
ice_eswitch.c net: drop the weight argument from netif_napi_add 2022-09-28 18:57:14 -07:00
ice_eswitch.h ice: allow creating VFs for !CONFIG_NET_SWITCHDEV 2022-04-14 08:19:54 -07:00
ice_ethtool_fdir.c ice: Use correct order for the parameters of devm_kcalloc() 2022-06-08 08:55:13 -07:00
ice_ethtool.c ice: Accumulate ring statistics over reset 2022-11-23 08:59:43 -08:00
ice_fdir.c
ice_fdir.h
ice_flex_pipe.c ice: Add support for PPPoE hardware offload 2022-07-26 10:56:32 -07:00
ice_flex_pipe.h ice: Fix FV offset searching 2022-03-11 08:28:27 -08:00
ice_flex_type.h ice: Support GTP-U and GTP-C offload in switchdev 2022-03-11 08:28:28 -08:00
ice_flow.c ice: remove circular header dependencies on ice.h 2022-03-14 17:22:58 -07:00
ice_flow.h ice: remove circular header dependencies on ice.h 2022-03-14 17:22:58 -07:00
ice_fltr.c ice: Ignore error message when setting same promiscuous mode 2022-08-17 09:30:44 -07:00
ice_fltr.h
ice_fw_update.c ice: handle E822 generic device ID in PLDM header 2022-07-12 09:25:34 -07:00
ice_fw_update.h
ice_gnss.c ice: add write functionality for GNSS TTY 2022-07-21 13:25:17 -07:00
ice_gnss.h ice: add write functionality for GNSS TTY 2022-07-21 13:25:17 -07:00
ice_hw_autogen.h ice: Add support Flex RXD 2022-10-27 13:23:43 +02:00
ice_idc_int.h ice: remove circular header dependencies on ice.h 2022-03-14 17:22:58 -07:00
ice_idc.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2022-05-12 16:15:30 -07:00
ice_lag.c ice: remove non-inclusive language 2022-08-18 08:26:11 -07:00
ice_lag.h ice: remove non-inclusive language 2022-08-18 08:26:11 -07:00
ice_lan_tx_rx.h ice: Remove and replace ice speed defines with ethtool.h versions 2022-11-23 08:59:42 -08:00
ice_lib.c ice: Accumulate ring statistics over reset 2022-11-23 08:59:43 -08:00
ice_lib.h ice: Fix spurious interrupt during removal of trusted VF 2022-11-09 13:20:38 -08:00
ice_main.c ice: always call ice_ptp_link_change and make it void 2022-12-08 11:13:21 -08:00
ice_nvm.c ice: Add additional flags to ice_nvm_write_activate 2022-08-24 08:45:54 -07:00
ice_nvm.h ice: Add additional flags to ice_nvm_write_activate 2022-08-24 08:45:54 -07:00
ice_osdep.h ice: remove circular header dependencies on ice.h 2022-03-14 17:22:58 -07:00
ice_pf_vsi_vlan_ops.c ice: Support configuring the device to Double VLAN Mode 2022-02-09 09:24:45 -08:00
ice_pf_vsi_vlan_ops.h
ice_protocol_type.h ice: Add L2TPv3 hardware offload support 2022-09-20 09:13:38 +02:00
ice_ptp_consts.h
ice_ptp_hw.c ice: check Tx timestamp memory register for ready timestamps 2022-12-08 11:13:21 -08:00
ice_ptp_hw.h ice: check Tx timestamp memory register for ready timestamps 2022-12-08 11:13:21 -08:00
ice_ptp.c ice: handle flushing stale Tx timestamps in ice_ptp_tx_tstamp 2022-12-08 13:15:03 -08:00
ice_ptp.h ice: handle flushing stale Tx timestamps in ice_ptp_tx_tstamp 2022-12-08 13:15:03 -08:00
ice_repr.c ice: Accumulate ring statistics over reset 2022-11-23 08:59:43 -08:00
ice_repr.h ice: remove circular header dependencies on ice.h 2022-03-14 17:22:58 -07:00
ice_sbq_cmd.h
ice_sched.c ice: Add an option to pre-allocate memory for ice_sched_node 2022-11-17 21:41:28 -08:00
ice_sched.h ice: Add an option to pre-allocate memory for ice_sched_node 2022-11-17 21:41:28 -08:00
ice_sriov.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2022-07-28 18:21:16 -07:00
ice_sriov.h ice: introduce ice_virtchnl.c and ice_virtchnl.h 2022-03-15 13:23:10 -07:00
ice_switch.c ice: Add L2TPv3 hardware offload support 2022-09-20 09:13:38 +02:00
ice_switch.h ice: Introduce enabling promiscuous mode on multiple VF's 2022-07-28 11:44:22 -07:00
ice_tc_lib.c ice: Enable RX queue selection using skbedit action 2022-10-25 10:32:40 +02:00
ice_tc_lib.h ice: Enable RX queue selection using skbedit action 2022-10-25 10:32:40 +02:00
ice_trace.h ice: add trace events for tx timestamps 2022-03-16 10:38:15 -07:00
ice_txrx_lib.c ice: Accumulate ring statistics over reset 2022-11-23 08:59:43 -08:00
ice_txrx_lib.h ice: Add hot path support for 802.1Q and 802.1ad VLAN offloads 2022-02-09 09:24:45 -08:00
ice_txrx.c ice: Accumulate ring statistics over reset 2022-11-23 08:59:43 -08:00
ice_txrx.h ice: Accumulate ring statistics over reset 2022-11-23 08:59:43 -08:00
ice_type.h ice: Prevent ADQ, DCB coexistence with Custom Tx scheduler 2022-11-17 21:41:28 -08:00
ice_vf_lib_private.h ice: virtchnl rss hena support 2022-11-14 10:44:38 +00:00
ice_vf_lib.c ice: virtchnl rss hena support 2022-11-14 10:44:38 +00:00
ice_vf_lib.h ice: Fix promiscuous mode not turning off 2022-07-28 11:44:40 -07:00
ice_vf_mbx.c ice: Remove and replace ice speed defines with ethtool.h versions 2022-11-23 08:59:42 -08:00
ice_vf_mbx.h ice: rename ice_sriov.c to ice_vf_mbx.c 2022-03-14 17:22:58 -07:00
ice_vf_vsi_vlan_ops.c ice: rename ice_virtchnl_pf.c to ice_sriov.c 2022-03-14 17:22:58 -07:00
ice_vf_vsi_vlan_ops.h ice: Add support for VIRTCHNL_VF_OFFLOAD_VLAN_V2 2022-02-09 09:24:45 -08:00
ice_virtchnl_allowlist.c ice: Add support Flex RXD 2022-10-27 13:23:43 +02:00
ice_virtchnl_allowlist.h
ice_virtchnl_fdir.c ice: always check VF VSI pointer values 2022-05-05 11:28:36 -07:00
ice_virtchnl_fdir.h ice: introduce ice_vf_lib.c, ice_vf_lib.h, and ice_vf_lib_private.h 2022-03-15 13:22:13 -07:00
ice_virtchnl.c ice: Fix configuring VIRTCHNL_OP_CONFIG_VSI_QUEUES with unbalanced queues 2022-11-23 08:59:43 -08:00
ice_virtchnl.h ice: virtchnl rss hena support 2022-11-14 10:44:38 +00:00
ice_vlan_mode.c ice: Add support for VLAN TPID filters in switchdev 2022-06-30 13:53:33 -07:00
ice_vlan_mode.h ice: Support configuring the device to Double VLAN Mode 2022-02-09 09:24:45 -08:00
ice_vlan.h
ice_vsi_vlan_lib.c ice: Support configuring the device to Double VLAN Mode 2022-02-09 09:24:45 -08:00
ice_vsi_vlan_lib.h
ice_vsi_vlan_ops.c
ice_vsi_vlan_ops.h ice: Support configuring the device to Double VLAN Mode 2022-02-09 09:24:45 -08:00
ice_xsk.c ice: Accumulate ring statistics over reset 2022-11-23 08:59:43 -08:00
ice_xsk.h ice: xsk: change batched Tx descriptor cleaning 2022-09-27 08:11:02 -07:00
ice.h ice: Accumulate ring statistics over reset 2022-11-23 08:59:43 -08:00
Makefile ice: fix access-beyond-end in the switch code 2022-06-02 12:41:10 +02:00