Commit 39dfb71b authored by Alexander Duyck's avatar Alexander Duyck Committed by Jeff Kirsher

ixgbe: Inline Rx PTP descriptor handling

This change is meant to inline the Rx PTP descriptor handling.  The main
motivation is to avoid unnecessary jumps into function calls that we then
immediately exit because we are not performing timestamps.

The net result of this change is that ixgbe_ptp_rx_tstamp drops from .5% CPU
utilization in my performance runs to 0%, and the only value tested is the Rx
descriptor which should already be warm in the cache if not stored in a
register.

Cc: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@intel.com>
Acked-by: default avatarJacob Keller <Jacob.e.keller@intel.com>
Tested-by: default avatarPhil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent b1e50f7a
...@@ -755,9 +755,24 @@ extern void ixgbe_ptp_init(struct ixgbe_adapter *adapter); ...@@ -755,9 +755,24 @@ extern void ixgbe_ptp_init(struct ixgbe_adapter *adapter);
extern void ixgbe_ptp_stop(struct ixgbe_adapter *adapter); extern void ixgbe_ptp_stop(struct ixgbe_adapter *adapter);
extern void ixgbe_ptp_overflow_check(struct ixgbe_adapter *adapter); extern void ixgbe_ptp_overflow_check(struct ixgbe_adapter *adapter);
extern void ixgbe_ptp_rx_hang(struct ixgbe_adapter *adapter); extern void ixgbe_ptp_rx_hang(struct ixgbe_adapter *adapter);
extern void ixgbe_ptp_rx_hwtstamp(struct ixgbe_ring *rx_ring, extern void __ixgbe_ptp_rx_hwtstamp(struct ixgbe_q_vector *q_vector,
union ixgbe_adv_rx_desc *rx_desc,
struct sk_buff *skb); struct sk_buff *skb);
static inline void ixgbe_ptp_rx_hwtstamp(struct ixgbe_ring *rx_ring,
union ixgbe_adv_rx_desc *rx_desc,
struct sk_buff *skb)
{
if (unlikely(!ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_STAT_TS)))
return;
__ixgbe_ptp_rx_hwtstamp(rx_ring->q_vector, skb);
/*
* Update the last_rx_timestamp timer in order to enable watchdog check
* for error case of latched timestamp on a dropped packet.
*/
rx_ring->last_rx_timestamp = jiffies;
}
extern int ixgbe_ptp_hwtstamp_ioctl(struct ixgbe_adapter *adapter, extern int ixgbe_ptp_hwtstamp_ioctl(struct ixgbe_adapter *adapter,
struct ifreq *ifr, int cmd); struct ifreq *ifr, int cmd);
extern void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter); extern void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter);
......
...@@ -531,17 +531,15 @@ static void ixgbe_ptp_tx_hwtstamp_work(struct work_struct *work) ...@@ -531,17 +531,15 @@ static void ixgbe_ptp_tx_hwtstamp_work(struct work_struct *work)
} }
/** /**
* ixgbe_ptp_rx_hwtstamp - utility function which checks for RX time stamp * __ixgbe_ptp_rx_hwtstamp - utility function which checks for RX time stamp
* @q_vector: structure containing interrupt and ring information * @q_vector: structure containing interrupt and ring information
* @rx_desc: the rx descriptor
* @skb: particular skb to send timestamp with * @skb: particular skb to send timestamp with
* *
* if the timestamp is valid, we convert it into the timecounter ns * if the timestamp is valid, we convert it into the timecounter ns
* value, then store that result into the shhwtstamps structure which * value, then store that result into the shhwtstamps structure which
* is passed up the network stack * is passed up the network stack
*/ */
void ixgbe_ptp_rx_hwtstamp(struct ixgbe_ring *rx_ring, void __ixgbe_ptp_rx_hwtstamp(struct ixgbe_q_vector *q_vector,
union ixgbe_adv_rx_desc *rx_desc,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct ixgbe_adapter *adapter; struct ixgbe_adapter *adapter;
...@@ -552,15 +550,12 @@ void ixgbe_ptp_rx_hwtstamp(struct ixgbe_ring *rx_ring, ...@@ -552,15 +550,12 @@ void ixgbe_ptp_rx_hwtstamp(struct ixgbe_ring *rx_ring,
unsigned long flags; unsigned long flags;
/* we cannot process timestamps on a ring without a q_vector */ /* we cannot process timestamps on a ring without a q_vector */
if (!rx_ring->q_vector || !rx_ring->q_vector->adapter) if (!q_vector || !q_vector->adapter)
return; return;
adapter = rx_ring->q_vector->adapter; adapter = q_vector->adapter;
hw = &adapter->hw; hw = &adapter->hw;
if (unlikely(!ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_STAT_TS)))
return;
/* /*
* Read the tsyncrxctl register afterwards in order to prevent taking an * Read the tsyncrxctl register afterwards in order to prevent taking an
* I/O hit on every packet. * I/O hit on every packet.
...@@ -569,12 +564,6 @@ void ixgbe_ptp_rx_hwtstamp(struct ixgbe_ring *rx_ring, ...@@ -569,12 +564,6 @@ void ixgbe_ptp_rx_hwtstamp(struct ixgbe_ring *rx_ring,
if (!(tsyncrxctl & IXGBE_TSYNCRXCTL_VALID)) if (!(tsyncrxctl & IXGBE_TSYNCRXCTL_VALID))
return; return;
/*
* Update the last_rx_timestamp timer in order to enable watchdog check
* for error case of latched timestamp on a dropped packet.
*/
rx_ring->last_rx_timestamp = jiffies;
regval |= (u64)IXGBE_READ_REG(hw, IXGBE_RXSTMPL); regval |= (u64)IXGBE_READ_REG(hw, IXGBE_RXSTMPL);
regval |= (u64)IXGBE_READ_REG(hw, IXGBE_RXSTMPH) << 32; regval |= (u64)IXGBE_READ_REG(hw, IXGBE_RXSTMPH) << 32;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment