mirror of
https://github.com/torvalds/linux.git
synced 2024-10-30 00:32:38 +00:00
ixgbevf: Add checksum statistics counters to rings
Add hardware checksum statistic counters to the ring structures and then during packet processing update those counters instead of the global counters in the adapter structure. Only update the adapter structure counters when all other statistics are gathered in the ixgbevf_update_stats() function. Signed-off-by: Greg Rose <gregory.v.rose@intel.com> Tested-by: Sibai Li <sibai.li@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
3938d3c8fd
commit
55fb277c1f
@ -74,6 +74,8 @@ struct ixgbevf_ring {
|
||||
u64 total_bytes;
|
||||
u64 total_packets;
|
||||
struct u64_stats_sync syncp;
|
||||
u64 hw_csum_rx_error;
|
||||
u64 hw_csum_rx_good;
|
||||
|
||||
u16 head;
|
||||
u16 tail;
|
||||
|
@ -295,12 +295,11 @@ static void ixgbevf_receive_skb(struct ixgbevf_q_vector *q_vector,
|
||||
|
||||
/**
|
||||
* ixgbevf_rx_checksum - indicate in skb if hw indicated a good cksum
|
||||
* @adapter: address of board private structure
|
||||
* @ring: pointer to Rx descriptor ring structure
|
||||
* @status_err: hardware indication of status of receive
|
||||
* @skb: skb currently being received and modified
|
||||
**/
|
||||
static inline void ixgbevf_rx_checksum(struct ixgbevf_adapter *adapter,
|
||||
struct ixgbevf_ring *ring,
|
||||
static inline void ixgbevf_rx_checksum(struct ixgbevf_ring *ring,
|
||||
u32 status_err, struct sk_buff *skb)
|
||||
{
|
||||
skb_checksum_none_assert(skb);
|
||||
@ -312,7 +311,7 @@ static inline void ixgbevf_rx_checksum(struct ixgbevf_adapter *adapter,
|
||||
/* if IP and error */
|
||||
if ((status_err & IXGBE_RXD_STAT_IPCS) &&
|
||||
(status_err & IXGBE_RXDADV_ERR_IPE)) {
|
||||
adapter->hw_csum_rx_error++;
|
||||
ring->hw_csum_rx_error++;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -320,13 +319,13 @@ static inline void ixgbevf_rx_checksum(struct ixgbevf_adapter *adapter,
|
||||
return;
|
||||
|
||||
if (status_err & IXGBE_RXDADV_ERR_TCPE) {
|
||||
adapter->hw_csum_rx_error++;
|
||||
ring->hw_csum_rx_error++;
|
||||
return;
|
||||
}
|
||||
|
||||
/* It must be a TCP or UDP packet with a valid checksum */
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
adapter->hw_csum_rx_good++;
|
||||
ring->hw_csum_rx_good++;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -462,7 +461,7 @@ static bool ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector,
|
||||
goto next_desc;
|
||||
}
|
||||
|
||||
ixgbevf_rx_checksum(adapter, rx_ring, staterr, skb);
|
||||
ixgbevf_rx_checksum(rx_ring, staterr, skb);
|
||||
|
||||
/* probably a little skewed due to removing CRC */
|
||||
total_rx_bytes += skb->len;
|
||||
@ -2094,6 +2093,7 @@ out:
|
||||
void ixgbevf_update_stats(struct ixgbevf_adapter *adapter)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
int i;
|
||||
|
||||
UPDATE_VF_COUNTER_32bit(IXGBE_VFGPRC, adapter->stats.last_vfgprc,
|
||||
adapter->stats.vfgprc);
|
||||
@ -2107,6 +2107,15 @@ void ixgbevf_update_stats(struct ixgbevf_adapter *adapter)
|
||||
adapter->stats.vfgotc);
|
||||
UPDATE_VF_COUNTER_32bit(IXGBE_VFMPRC, adapter->stats.last_vfmprc,
|
||||
adapter->stats.vfmprc);
|
||||
|
||||
for (i = 0; i < adapter->num_rx_queues; i++) {
|
||||
adapter->hw_csum_rx_error +=
|
||||
adapter->rx_ring[i].hw_csum_rx_error;
|
||||
adapter->hw_csum_rx_good +=
|
||||
adapter->rx_ring[i].hw_csum_rx_good;
|
||||
adapter->rx_ring[i].hw_csum_rx_error = 0;
|
||||
adapter->rx_ring[i].hw_csum_rx_good = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user