mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-25 06:30:54 +07:00
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;
|
unsigned int total_rx_bytes = 0, total_rx_packets = 0;
|
||||||
#ifdef IXGBE_FCOE
|
#ifdef IXGBE_FCOE
|
||||||
struct ixgbe_adapter *adapter = q_vector->adapter;
|
struct ixgbe_adapter *adapter = q_vector->adapter;
|
||||||
int ddp_bytes = 0;
|
int ddp_bytes;
|
||||||
|
unsigned int mss = 0;
|
||||||
#endif /* IXGBE_FCOE */
|
#endif /* IXGBE_FCOE */
|
||||||
u16 cleaned_count = ixgbe_desc_unused(rx_ring);
|
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 ddp, not passing to ULD unless for FCP_RSP or error */
|
||||||
if (ixgbe_rx_is_fcoe(rx_ring, rx_desc)) {
|
if (ixgbe_rx_is_fcoe(rx_ring, rx_desc)) {
|
||||||
ddp_bytes = ixgbe_fcoe_ddp(adapter, rx_desc, skb);
|
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) {
|
if (!ddp_bytes) {
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
continue;
|
continue;
|
||||||
@ -1852,21 +1867,6 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|||||||
budget--;
|
budget--;
|
||||||
} while (likely(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);
|
u64_stats_update_begin(&rx_ring->syncp);
|
||||||
rx_ring->stats.packets += total_rx_packets;
|
rx_ring->stats.packets += total_rx_packets;
|
||||||
rx_ring->stats.bytes += total_rx_bytes;
|
rx_ring->stats.bytes += total_rx_bytes;
|
||||||
|
Loading…
Reference in New Issue
Block a user