ixgbe: reduce PTP rx path overhead
authorJiri Benc <jbenc@redhat.com>
Thu, 25 Oct 2012 18:12:05 +0000 (18:12 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 30 Oct 2012 06:34:30 +0000 (23:34 -0700)
Hw timestamping code caused performance regression in ixgbe driver when the
timestamping is not enabled. The culprit is IXGBE_READ_REG call in the Rx
path which is executed for every received skb. This call is not needed when
the timestamping is disabled or for non-ptp packets.

netperf results:

The ixgbe side of the connection was acting as a server, the netperf command
line on the other side was:
netperf -H 192.168.1.23 -T0,0 -t UDP_STREAM -l 20

The values below mean throughput as reported by netperf (local/remote), for
3 runs, with timestamping not enabled.

3.7.0-rc1+ with CONFIG_IXGBE_PTP off:
5373.83 / 3329.32
5721.88 / 3033.89
5653.42 / 3112.38

3.7.0-rc1+ with CONFIG_IXGBE_PTP on:
5233.64 / 1226.85
5448.67 / 1039.32
5421.36 / 1095.66

Patched 3.7.0-rc1+ with CONFIG_IXGBE_PTP on:
5594.72 / 2942.53
5428.95 / 3110.16
5343.56 / 3200.48

Reported-by: Jesper Brouer <jbrouer@redhat.com>
Signed-off-by: Jiri Benc <jbenc@redhat.com>
Signed-off-by: Andy Gospodarek <gospo@redhat.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c

index 5e71ddbb34149e749601a2db2352065a2e5b2a14..842ba15550a545afd70f6b9dab78f51152ca9479 100644 (file)
@@ -554,12 +554,14 @@ void ixgbe_ptp_rx_hwtstamp(struct ixgbe_q_vector *q_vector,
        adapter = q_vector->adapter;
        hw = &adapter->hw;
 
+       if (likely(!ixgbe_ptp_match(skb, adapter->rx_hwtstamp_filter)))
+               return;
+
        tsyncrxctl = IXGBE_READ_REG(hw, IXGBE_TSYNCRXCTL);
 
        /* Check if we have a valid timestamp and make sure the skb should
         * have been timestamped */
-       if (likely(!(tsyncrxctl & IXGBE_TSYNCRXCTL_VALID) ||
-                  !ixgbe_ptp_match(skb, adapter->rx_hwtstamp_filter)))
+       if (!(tsyncrxctl & IXGBE_TSYNCRXCTL_VALID))
                return;
 
        /*