Skip to content

Commit 15fca2c

Browse files
Tariq Toukandavem330
authored andcommitted
net/mlx4_en: Add ethtool statistics for XDP cases
XDP statistics are reported in ethtool, in total and per ring, as follows: - xdp_drop: the number of packets dropped by xdp. - xdp_tx: the number of packets forwarded by xdp. - xdp_tx_full: the number of times an xdp forward failed due to a full tx xdp ring. In addition, all packets that are dropped/forwarded by XDP are no longer accounted in rx_packets/rx_bytes of the ring, so that they count traffic that is passed to the stack. Signed-off-by: Tariq Toukan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 67f8b1d commit 15fca2c

File tree

7 files changed

+60
-12
lines changed

7 files changed

+60
-12
lines changed

drivers/net/ethernet/mellanox/mlx4/en_ethtool.c

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,10 @@ static const char main_strings[][ETH_GSTRING_LEN] = {
195195
"tx_prio_7_packets", "tx_prio_7_bytes",
196196
"tx_novlan_packets", "tx_novlan_bytes",
197197

198+
/* xdp statistics */
199+
"rx_xdp_drop",
200+
"rx_xdp_tx",
201+
"rx_xdp_tx_full",
198202
};
199203

200204
static const char mlx4_en_test_names[][ETH_GSTRING_LEN]= {
@@ -340,7 +344,7 @@ static int mlx4_en_get_sset_count(struct net_device *dev, int sset)
340344
case ETH_SS_STATS:
341345
return bitmap_iterator_count(&it) +
342346
(priv->tx_ring_num[TX] * 2) +
343-
(priv->rx_ring_num * 3);
347+
(priv->rx_ring_num * (3 + NUM_XDP_STATS));
344348
case ETH_SS_TEST:
345349
return MLX4_EN_NUM_SELF_TEST - !(priv->mdev->dev->caps.flags
346350
& MLX4_DEV_CAP_FLAG_UC_LOOPBACK) * 2;
@@ -400,6 +404,10 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
400404
if (bitmap_iterator_test(&it))
401405
data[index++] = ((unsigned long *)&priv->pkstats)[i];
402406

407+
for (i = 0; i < NUM_XDP_STATS; i++, bitmap_iterator_inc(&it))
408+
if (bitmap_iterator_test(&it))
409+
data[index++] = ((unsigned long *)&priv->xdp_stats)[i];
410+
403411
for (i = 0; i < priv->tx_ring_num[TX]; i++) {
404412
data[index++] = priv->tx_ring[TX][i]->packets;
405413
data[index++] = priv->tx_ring[TX][i]->bytes;
@@ -408,6 +416,9 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
408416
data[index++] = priv->rx_ring[i]->packets;
409417
data[index++] = priv->rx_ring[i]->bytes;
410418
data[index++] = priv->rx_ring[i]->dropped;
419+
data[index++] = priv->rx_ring[i]->xdp_drop;
420+
data[index++] = priv->rx_ring[i]->xdp_tx;
421+
data[index++] = priv->rx_ring[i]->xdp_tx_full;
411422
}
412423
spin_unlock_bh(&priv->stats_lock);
413424

@@ -470,6 +481,12 @@ static void mlx4_en_get_strings(struct net_device *dev,
470481
strcpy(data + (index++) * ETH_GSTRING_LEN,
471482
main_strings[strings]);
472483

484+
for (i = 0; i < NUM_XDP_STATS; i++, strings++,
485+
bitmap_iterator_inc(&it))
486+
if (bitmap_iterator_test(&it))
487+
strcpy(data + (index++) * ETH_GSTRING_LEN,
488+
main_strings[strings]);
489+
473490
for (i = 0; i < priv->tx_ring_num[TX]; i++) {
474491
sprintf(data + (index++) * ETH_GSTRING_LEN,
475492
"tx%d_packets", i);
@@ -483,6 +500,12 @@ static void mlx4_en_get_strings(struct net_device *dev,
483500
"rx%d_bytes", i);
484501
sprintf(data + (index++) * ETH_GSTRING_LEN,
485502
"rx%d_dropped", i);
503+
sprintf(data + (index++) * ETH_GSTRING_LEN,
504+
"rx%d_xdp_drop", i);
505+
sprintf(data + (index++) * ETH_GSTRING_LEN,
506+
"rx%d_xdp_tx", i);
507+
sprintf(data + (index++) * ETH_GSTRING_LEN,
508+
"rx%d_xdp_tx_full", i);
486509
}
487510
break;
488511
case ETH_SS_PRIV_FLAGS:

drivers/net/ethernet/mellanox/mlx4/en_netdev.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3125,6 +3125,10 @@ void mlx4_en_set_stats_bitmap(struct mlx4_dev *dev,
31253125

31263126
if (!mlx4_is_slave(dev))
31273127
bitmap_set(stats_bitmap->bitmap, last_i, NUM_PKT_STATS);
3128+
last_i += NUM_PKT_STATS;
3129+
3130+
bitmap_set(stats_bitmap->bitmap, last_i, NUM_XDP_STATS);
3131+
last_i += NUM_XDP_STATS;
31283132
}
31293133

31303134
int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,

drivers/net/ethernet/mellanox/mlx4/en_port.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,19 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
179179
priv->port_stats.rx_chksum_good = 0;
180180
priv->port_stats.rx_chksum_none = 0;
181181
priv->port_stats.rx_chksum_complete = 0;
182+
priv->xdp_stats.rx_xdp_drop = 0;
183+
priv->xdp_stats.rx_xdp_tx = 0;
184+
priv->xdp_stats.rx_xdp_tx_full = 0;
182185
for (i = 0; i < priv->rx_ring_num; i++) {
183186
stats->rx_packets += priv->rx_ring[i]->packets;
184187
stats->rx_bytes += priv->rx_ring[i]->bytes;
185188
sw_rx_dropped += priv->rx_ring[i]->dropped;
186189
priv->port_stats.rx_chksum_good += priv->rx_ring[i]->csum_ok;
187190
priv->port_stats.rx_chksum_none += priv->rx_ring[i]->csum_none;
188191
priv->port_stats.rx_chksum_complete += priv->rx_ring[i]->csum_complete;
192+
priv->xdp_stats.rx_xdp_drop += priv->rx_ring[i]->xdp_drop;
193+
priv->xdp_stats.rx_xdp_tx += priv->rx_ring[i]->xdp_tx;
194+
priv->xdp_stats.rx_xdp_tx_full += priv->rx_ring[i]->xdp_tx_full;
189195
}
190196
stats->tx_packets = 0;
191197
stats->tx_bytes = 0;

drivers/net/ethernet/mellanox/mlx4/en_rx.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -875,8 +875,6 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
875875
*/
876876
length = be32_to_cpu(cqe->byte_cnt);
877877
length -= ring->fcs_del;
878-
ring->bytes += length;
879-
ring->packets++;
880878
l2_tunnel = (dev->hw_enc_features & NETIF_F_RXCSUM) &&
881879
(cqe->vlan_my_qpn & cpu_to_be32(MLX4_CQE_L2_TUNNEL));
882880

@@ -902,22 +900,26 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
902900
case XDP_PASS:
903901
break;
904902
case XDP_TX:
905-
if (likely(!mlx4_en_xmit_frame(frags, dev,
903+
if (likely(!mlx4_en_xmit_frame(ring, frags, dev,
906904
length, cq->ring,
907905
&doorbell_pending)))
908906
goto consumed;
909-
goto xdp_drop; /* Drop on xmit failure */
907+
goto xdp_drop_no_cnt; /* Drop on xmit failure */
910908
default:
911909
bpf_warn_invalid_xdp_action(act);
912910
case XDP_ABORTED:
913911
case XDP_DROP:
914-
xdp_drop:
912+
ring->xdp_drop++;
913+
xdp_drop_no_cnt:
915914
if (likely(mlx4_en_rx_recycle(ring, frags)))
916915
goto consumed;
917916
goto next;
918917
}
919918
}
920919

920+
ring->bytes += length;
921+
ring->packets++;
922+
921923
if (likely(dev->features & NETIF_F_RXCSUM)) {
922924
if (cqe->status & cpu_to_be16(MLX4_CQE_STATUS_TCP |
923925
MLX4_CQE_STATUS_UDP)) {

drivers/net/ethernet/mellanox/mlx4/en_tx.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,8 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
10791079
return NETDEV_TX_OK;
10801080
}
10811081

1082-
netdev_tx_t mlx4_en_xmit_frame(struct mlx4_en_rx_alloc *frame,
1082+
netdev_tx_t mlx4_en_xmit_frame(struct mlx4_en_rx_ring *rx_ring,
1083+
struct mlx4_en_rx_alloc *frame,
10831084
struct net_device *dev, unsigned int length,
10841085
int tx_ind, int *doorbell_pending)
10851086
{
@@ -1154,8 +1155,7 @@ netdev_tx_t mlx4_en_xmit_frame(struct mlx4_en_rx_alloc *frame,
11541155
((ring->prod & ring->size) ?
11551156
cpu_to_be32(MLX4_EN_BIT_DESC_OWN) : 0);
11561157

1157-
ring->packets++;
1158-
ring->bytes += tx_info->nr_bytes;
1158+
rx_ring->xdp_tx++;
11591159
AVG_PERF_COUNTER(priv->pstats.tx_pktsz_avg, length);
11601160

11611161
ring->prod += nr_txbb;
@@ -1179,7 +1179,7 @@ netdev_tx_t mlx4_en_xmit_frame(struct mlx4_en_rx_alloc *frame,
11791179
return NETDEV_TX_OK;
11801180

11811181
tx_drop_count:
1182-
ring->tx_dropped++;
1182+
rx_ring->xdp_tx_full++;
11831183
tx_drop:
11841184
return NETDEV_TX_BUSY;
11851185
}

drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,9 @@ struct mlx4_en_rx_ring {
350350
unsigned long csum_ok;
351351
unsigned long csum_none;
352352
unsigned long csum_complete;
353+
unsigned long xdp_drop;
354+
unsigned long xdp_tx;
355+
unsigned long xdp_tx_full;
353356
unsigned long dropped;
354357
int hwtstamp_rx_filter;
355358
cpumask_var_t affinity_mask;
@@ -599,6 +602,7 @@ struct mlx4_en_priv {
599602
struct mlx4_en_flow_stats_rx rx_flowstats;
600603
struct mlx4_en_flow_stats_tx tx_flowstats;
601604
struct mlx4_en_port_stats port_stats;
605+
struct mlx4_en_xdp_stats xdp_stats;
602606
struct mlx4_en_stats_bitmap stats_bitmap;
603607
struct list_head mc_list;
604608
struct list_head curr_list;
@@ -687,7 +691,8 @@ void mlx4_en_tx_irq(struct mlx4_cq *mcq);
687691
u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb,
688692
void *accel_priv, select_queue_fallback_t fallback);
689693
netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev);
690-
netdev_tx_t mlx4_en_xmit_frame(struct mlx4_en_rx_alloc *frame,
694+
netdev_tx_t mlx4_en_xmit_frame(struct mlx4_en_rx_ring *rx_ring,
695+
struct mlx4_en_rx_alloc *frame,
691696
struct net_device *dev, unsigned int length,
692697
int tx_ind, int *doorbell_pending);
693698
void mlx4_en_xmit_doorbell(struct mlx4_en_tx_ring *ring);

drivers/net/ethernet/mellanox/mlx4/mlx4_stats.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ struct mlx4_en_perf_stats {
5555
#define NUM_PERF_COUNTERS 6
5656
};
5757

58+
struct mlx4_en_xdp_stats {
59+
unsigned long rx_xdp_drop;
60+
unsigned long rx_xdp_tx;
61+
unsigned long rx_xdp_tx_full;
62+
#define NUM_XDP_STATS 3
63+
};
64+
5865
#define NUM_MAIN_STATS 21
5966

6067
#define MLX4_NUM_PRIORITIES 8
@@ -107,7 +114,8 @@ enum {
107114
};
108115

109116
#define NUM_ALL_STATS (NUM_MAIN_STATS + NUM_PORT_STATS + NUM_PKT_STATS + \
110-
NUM_FLOW_STATS + NUM_PERF_STATS + NUM_PF_STATS)
117+
NUM_FLOW_STATS + NUM_PERF_STATS + NUM_PF_STATS + \
118+
NUM_XDP_STATS)
111119

112120
#define MLX4_FIND_NETDEV_STAT(n) (offsetof(struct net_device_stats, n) / \
113121
sizeof(((struct net_device_stats *)0)->n))

0 commit comments

Comments
 (0)