linux/drivers/net/ethernet/intel/ixgbe
Jacob Keller aaebaf50b5 ixgbe: fix race condition with PTP_TX_IN_PROGRESS bits
Hardware related to the ixgbe driver is limited to handling a single Tx
timestamp request at a time. Thus, the driver ignores requests for Tx
timestamp while waiting for the current request to finish. It uses
a state bit lock which enforces that only one timestamp request is
honored at a time.

Unfortunately this suffers from a simple race condition. The bit lock is
not cleared until after skb_tstamp_tx() is called notifying applications
of a new Tx timestamp. Even a well behaved application sending only one
packet at a time and waiting for a response can wake up and send a new
packet before the bit lock is cleared. This results in needlessly
dropping some Tx timestamp requests.

We can fix this by unlocking the state bit as soon as we read the
Timestamp register, as this is the first point at which it is safe to
unlock.

To avoid issues with the skb pointer, we'll use a copy of the pointer
and set the global variable in the driver structure to NULL first. This
ensures that the next timestamp request does not modify our local copy
of the skb pointer.

This ensures that well behaved applications do not accidentally race
with the unlock bit. Obviously an application which sends multiple Tx
timestamp requests at once will still only timestamp one packet at
a time. Unfortunately there is nothing we can do about this.

Reported-by: David Mirabito <davidm@metamako.com>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
2017-06-13 16:11:47 -07:00
..
ixgbe_82598.c ixgbe: Remove unused firmware version functions and method 2017-01-03 13:03:38 -08:00
ixgbe_82599.c ixgbe: Resolve warnings for -Wimplicit-fallthrough 2017-05-31 04:43:47 -07:00
ixgbe_common.c ixgbe: add missing configuration for rate select 1 2017-05-31 04:52:41 -07:00
ixgbe_common.h ixgbe: Implement firmware interface to access some PHYs 2017-01-03 13:03:39 -08:00
ixgbe_dcb_82598.c ixgbe: use BIT() macro 2016-04-25 04:15:11 -07:00
ixgbe_dcb_82598.h
ixgbe_dcb_82599.c ixgbe: use BIT() macro 2016-04-25 04:15:11 -07:00
ixgbe_dcb_82599.h
ixgbe_dcb_nl.c ixgbe: prefix Data Center Bridge ops struct 2017-02-16 04:02:44 -08:00
ixgbe_dcb.c ixgbe: use BIT() macro 2016-04-25 04:15:11 -07:00
ixgbe_dcb.h
ixgbe_debugfs.c
ixgbe_ethtool.c ixgbe: Resolve warnings for -Wimplicit-fallthrough 2017-05-31 04:43:47 -07:00
ixgbe_fcoe.c
ixgbe_fcoe.h
ixgbe_lib.c ixgbe: add support for XDP_TX action 2017-04-29 19:58:07 -07:00
ixgbe_main.c net: propagate tc filter chain index down the ndo_setup_tc call 2017-06-08 09:55:53 -04:00
ixgbe_mbx.c ixgbe: use BIT() macro 2016-04-25 04:15:11 -07:00
ixgbe_mbx.h ixgbe: Add PF support for VF promiscuous mode 2017-01-03 13:03:40 -08:00
ixgbe_model.h ixgbe: Fix deleting link filters for cls_u32 offloads 2016-06-29 10:05:24 -07:00
ixgbe_phy.c ixgbe: Remove driver config for KX4 PHY 2017-04-18 13:04:09 -07:00
ixgbe_phy.h ixgbe: correct CS4223/7 PHY identification 2017-05-31 04:48:19 -07:00
ixgbe_ptp.c ixgbe: fix race condition with PTP_TX_IN_PROGRESS bits 2017-06-13 16:11:47 -07:00
ixgbe_sriov.c ixgbe: Resolve warnings for -Wimplicit-fallthrough 2017-05-31 04:43:47 -07:00
ixgbe_sriov.h ixgbe: do not use adapter->num_vfs when setting VFs via module parameter 2017-04-18 13:25:30 -07:00
ixgbe_sysfs.c
ixgbe_type.h ixgbe: Add 1000Base-T device based on X550EM_X MAC 2017-04-29 20:01:03 -07:00
ixgbe_x540.c ixgbe: Acquire PHY semaphore before device reset 2017-04-28 19:02:31 -07:00
ixgbe_x540.h ixgbe: Place SWFW semaphore in known valid state at probe 2016-04-04 17:44:50 -07:00
ixgbe_x550.c ixgbe: fix incorrect status check 2017-05-31 04:54:12 -07:00
ixgbe.h ixgbe: Check for RSS key before setting value 2017-04-29 20:01:04 -07:00
Makefile