ixgbe: Improve statistics accuracy for DDP traffic
Noticed that the byte and packet count statistics are under- counting traffic handled by the DDP offload when there is more than one DDP completion processed in a single call to ixgbe_clean_rx_irq. This patch fixes that. I tried to optimize the setting of the rss value so that it only would have to be computed once, and only when there is a DDP completion present. Signed-off-by: Mark Rustad <mark.d.rustad@intel.com> Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com> Tested-by: Ross Brattain <ross.b.brattain@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
91fbd8f081
commit
4ffdf91a5f
|
@ -1785,7 +1785,8 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||
unsigned int total_rx_bytes = 0, total_rx_packets = 0;
|
||||
#ifdef IXGBE_FCOE
|
||||
struct ixgbe_adapter *adapter = q_vector->adapter;
|
||||
int ddp_bytes = 0;
|
||||
int ddp_bytes;
|
||||
unsigned int mss = 0;
|
||||
#endif /* IXGBE_FCOE */
|
||||
u16 cleaned_count = ixgbe_desc_unused(rx_ring);
|
||||
|
||||
|
@ -1839,6 +1840,20 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||
/* if ddp, not passing to ULD unless for FCP_RSP or error */
|
||||
if (ixgbe_rx_is_fcoe(rx_ring, rx_desc)) {
|
||||
ddp_bytes = ixgbe_fcoe_ddp(adapter, rx_desc, skb);
|
||||
/* include DDPed FCoE data */
|
||||
if (ddp_bytes > 0) {
|
||||
if (!mss) {
|
||||
mss = rx_ring->netdev->mtu -
|
||||
sizeof(struct fcoe_hdr) -
|
||||
sizeof(struct fc_frame_header) -
|
||||
sizeof(struct fcoe_crc_eof);
|
||||
if (mss > 512)
|
||||
mss &= ~511;
|
||||
}
|
||||
total_rx_bytes += ddp_bytes;
|
||||
total_rx_packets += DIV_ROUND_UP(ddp_bytes,
|
||||
mss);
|
||||
}
|
||||
if (!ddp_bytes) {
|
||||
dev_kfree_skb_any(skb);
|
||||
continue;
|
||||
|
@ -1852,21 +1867,6 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||
budget--;
|
||||
} while (likely(budget));
|
||||
|
||||
#ifdef IXGBE_FCOE
|
||||
/* include DDPed FCoE data */
|
||||
if (ddp_bytes > 0) {
|
||||
unsigned int mss;
|
||||
|
||||
mss = rx_ring->netdev->mtu - sizeof(struct fcoe_hdr) -
|
||||
sizeof(struct fc_frame_header) -
|
||||
sizeof(struct fcoe_crc_eof);
|
||||
if (mss > 512)
|
||||
mss &= ~511;
|
||||
total_rx_bytes += ddp_bytes;
|
||||
total_rx_packets += DIV_ROUND_UP(ddp_bytes, mss);
|
||||
}
|
||||
|
||||
#endif /* IXGBE_FCOE */
|
||||
u64_stats_update_begin(&rx_ring->syncp);
|
||||
rx_ring->stats.packets += total_rx_packets;
|
||||
rx_ring->stats.bytes += total_rx_bytes;
|
||||
|
|
Loading…
Reference in New Issue