Skip to content

Commit 80a788c

Browse files
tlendackydavem330
authored andcommitted
amd-xgbe: Add per queue Tx and Rx statistics
Add per queue Tx and Rx packet and byte counts. Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 3be9587 commit 80a788c

File tree

3 files changed

+46
-8
lines changed

3 files changed

+46
-8
lines changed

drivers/net/ethernet/amd/xgbe/xgbe-dev.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,6 +1609,7 @@ static void xgbe_dev_xmit(struct xgbe_channel *channel)
16091609
struct xgbe_ring_data *rdata;
16101610
struct xgbe_ring_desc *rdesc;
16111611
struct xgbe_packet_data *packet = &ring->packet_data;
1612+
unsigned int tx_packets, tx_bytes;
16121613
unsigned int csum, tso, vlan;
16131614
unsigned int tso_context, vlan_context;
16141615
unsigned int tx_set_ic;
@@ -1618,6 +1619,9 @@ static void xgbe_dev_xmit(struct xgbe_channel *channel)
16181619

16191620
DBGPR("-->xgbe_dev_xmit\n");
16201621

1622+
tx_packets = packet->tx_packets;
1623+
tx_bytes = packet->tx_bytes;
1624+
16211625
csum = XGMAC_GET_BITS(packet->attributes, TX_PACKET_ATTRIBUTES,
16221626
CSUM_ENABLE);
16231627
tso = XGMAC_GET_BITS(packet->attributes, TX_PACKET_ATTRIBUTES,
@@ -1645,13 +1649,12 @@ static void xgbe_dev_xmit(struct xgbe_channel *channel)
16451649
* - Addition of Tx frame count to the frame count since the
16461650
* last interrupt was set does not exceed the frame count setting
16471651
*/
1648-
ring->coalesce_count += packet->tx_packets;
1652+
ring->coalesce_count += tx_packets;
16491653
if (!pdata->tx_frames)
16501654
tx_set_ic = 0;
1651-
else if (packet->tx_packets > pdata->tx_frames)
1655+
else if (tx_packets > pdata->tx_frames)
16521656
tx_set_ic = 1;
1653-
else if ((ring->coalesce_count % pdata->tx_frames) <
1654-
packet->tx_packets)
1657+
else if ((ring->coalesce_count % pdata->tx_frames) < tx_packets)
16551658
tx_set_ic = 1;
16561659
else
16571660
tx_set_ic = 0;
@@ -1741,7 +1744,7 @@ static void xgbe_dev_xmit(struct xgbe_channel *channel)
17411744
XGMAC_SET_BITS_LE(rdesc->desc3, TX_NORMAL_DESC3, TCPHDRLEN,
17421745
packet->tcp_header_len / 4);
17431746

1744-
pdata->ext_stats.tx_tso_packets += packet->tx_packets;
1747+
pdata->ext_stats.tx_tso_packets += tx_packets;
17451748
} else {
17461749
/* Enable CRC and Pad Insertion */
17471750
XGMAC_SET_BITS_LE(rdesc->desc3, TX_NORMAL_DESC3, CPC, 0);
@@ -1789,8 +1792,11 @@ static void xgbe_dev_xmit(struct xgbe_channel *channel)
17891792
XGMAC_SET_BITS_LE(rdesc->desc2, TX_NORMAL_DESC2, IC, 1);
17901793

17911794
/* Save the Tx info to report back during cleanup */
1792-
rdata->tx.packets = packet->tx_packets;
1793-
rdata->tx.bytes = packet->tx_bytes;
1795+
rdata->tx.packets = tx_packets;
1796+
rdata->tx.bytes = tx_bytes;
1797+
1798+
pdata->ext_stats.txq_packets[channel->queue_index] += tx_packets;
1799+
pdata->ext_stats.txq_bytes[channel->queue_index] += tx_bytes;
17941800

17951801
/* In case the Tx DMA engine is running, make sure everything
17961802
* is written to the descriptor(s) before setting the OWN bit
@@ -1944,6 +1950,9 @@ static int xgbe_dev_read(struct xgbe_channel *channel)
19441950
FRAME, 1);
19451951
}
19461952

1953+
pdata->ext_stats.rxq_packets[channel->queue_index]++;
1954+
pdata->ext_stats.rxq_bytes[channel->queue_index] += rdata->rx.len;
1955+
19471956
DBGPR("<--xgbe_dev_read: %s - descriptor=%u (cur=%d)\n", channel->name,
19481957
ring->cur & (ring->rdesc_count - 1), ring->cur);
19491958

drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ static const struct xgbe_stats xgbe_gstring_stats[] = {
186186

187187
static void xgbe_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
188188
{
189+
struct xgbe_prv_data *pdata = netdev_priv(netdev);
189190
int i;
190191

191192
switch (stringset) {
@@ -195,6 +196,18 @@ static void xgbe_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
195196
ETH_GSTRING_LEN);
196197
data += ETH_GSTRING_LEN;
197198
}
199+
for (i = 0; i < pdata->tx_ring_count; i++) {
200+
sprintf(data, "txq_%u_packets", i);
201+
data += ETH_GSTRING_LEN;
202+
sprintf(data, "txq_%u_bytes", i);
203+
data += ETH_GSTRING_LEN;
204+
}
205+
for (i = 0; i < pdata->rx_ring_count; i++) {
206+
sprintf(data, "rxq_%u_packets", i);
207+
data += ETH_GSTRING_LEN;
208+
sprintf(data, "rxq_%u_bytes", i);
209+
data += ETH_GSTRING_LEN;
210+
}
198211
break;
199212
}
200213
}
@@ -211,15 +224,26 @@ static void xgbe_get_ethtool_stats(struct net_device *netdev,
211224
stat = (u8 *)pdata + xgbe_gstring_stats[i].stat_offset;
212225
*data++ = *(u64 *)stat;
213226
}
227+
for (i = 0; i < pdata->tx_ring_count; i++) {
228+
*data++ = pdata->ext_stats.txq_packets[i];
229+
*data++ = pdata->ext_stats.txq_bytes[i];
230+
}
231+
for (i = 0; i < pdata->rx_ring_count; i++) {
232+
*data++ = pdata->ext_stats.rxq_packets[i];
233+
*data++ = pdata->ext_stats.rxq_bytes[i];
234+
}
214235
}
215236

216237
static int xgbe_get_sset_count(struct net_device *netdev, int stringset)
217238
{
239+
struct xgbe_prv_data *pdata = netdev_priv(netdev);
218240
int ret;
219241

220242
switch (stringset) {
221243
case ETH_SS_STATS:
222-
ret = XGBE_STATS_COUNT;
244+
ret = XGBE_STATS_COUNT +
245+
(pdata->tx_ring_count * 2) +
246+
(pdata->rx_ring_count * 2);
223247
break;
224248

225249
default:

drivers/net/ethernet/amd/xgbe/xgbe.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,11 @@ struct xgbe_ext_stats {
668668
u64 tx_tso_packets;
669669
u64 rx_split_header_packets;
670670
u64 rx_buffer_unavailable;
671+
672+
u64 txq_packets[XGBE_MAX_DMA_CHANNELS];
673+
u64 txq_bytes[XGBE_MAX_DMA_CHANNELS];
674+
u64 rxq_packets[XGBE_MAX_DMA_CHANNELS];
675+
u64 rxq_bytes[XGBE_MAX_DMA_CHANNELS];
671676
};
672677

673678
struct xgbe_hw_if {

0 commit comments

Comments
 (0)