Skip to content

Commit 512286b

Browse files
Rafal Ozieblodavem330
authored andcommitted
net: macb: Added some queue statistics
Added statistics per queue: - qX_rx_packets - qX_rx_bytes - qX_rx_dropped - qX_tx_packets - qX_tx_bytes - qX_tx_dropped Signed-off-by: Rafal Ozieblo <rafalo@cadence.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent ae1f2a5 commit 512286b

File tree

2 files changed

+64
-4
lines changed

2 files changed

+64
-4
lines changed

drivers/net/ethernet/cadence/macb.h

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,34 @@ static const struct gem_statistic gem_statistics[] = {
922922

923923
#define GEM_STATS_LEN ARRAY_SIZE(gem_statistics)
924924

925+
#define QUEUE_STAT_TITLE(title) { \
926+
.stat_string = title, \
927+
}
928+
929+
/* per queue statistics, each should be unsigned long type */
930+
struct queue_stats {
931+
union {
932+
unsigned long first;
933+
unsigned long rx_packets;
934+
};
935+
unsigned long rx_bytes;
936+
unsigned long rx_dropped;
937+
unsigned long tx_packets;
938+
unsigned long tx_bytes;
939+
unsigned long tx_dropped;
940+
};
941+
942+
static const struct gem_statistic queue_statistics[] = {
943+
QUEUE_STAT_TITLE("rx_packets"),
944+
QUEUE_STAT_TITLE("rx_bytes"),
945+
QUEUE_STAT_TITLE("rx_dropped"),
946+
QUEUE_STAT_TITLE("tx_packets"),
947+
QUEUE_STAT_TITLE("tx_bytes"),
948+
QUEUE_STAT_TITLE("tx_dropped"),
949+
};
950+
951+
#define QUEUE_STATS_LEN ARRAY_SIZE(queue_statistics)
952+
925953
struct macb;
926954
struct macb_queue;
927955

@@ -989,6 +1017,7 @@ struct macb_queue {
9891017
struct sk_buff **rx_skbuff;
9901018
void *rx_buffers;
9911019
struct napi_struct napi;
1020+
struct queue_stats stats;
9921021

9931022
#ifdef CONFIG_MACB_USE_HWSTAMP
9941023
struct work_struct tx_ts_task;
@@ -1046,7 +1075,7 @@ struct macb {
10461075
int skb_length; /* saved skb length for pci_unmap_single */
10471076
unsigned int max_tx_length;
10481077

1049-
u64 ethtool_stats[GEM_STATS_LEN];
1078+
u64 ethtool_stats[GEM_STATS_LEN + QUEUE_STATS_LEN * MACB_MAX_QUEUES];
10501079

10511080
unsigned int rx_frm_len_mask;
10521081
unsigned int jumbo_max_len;

drivers/net/ethernet/cadence/macb_main.c

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -759,7 +759,9 @@ static void macb_tx_error_task(struct work_struct *work)
759759
macb_tx_ring_wrap(bp, tail),
760760
skb->data);
761761
bp->dev->stats.tx_packets++;
762+
queue->stats.tx_packets++;
762763
bp->dev->stats.tx_bytes += skb->len;
764+
queue->stats.tx_bytes += skb->len;
763765
}
764766
} else {
765767
/* "Buffers exhausted mid-frame" errors may only happen
@@ -859,7 +861,9 @@ static void macb_tx_interrupt(struct macb_queue *queue)
859861
macb_tx_ring_wrap(bp, tail),
860862
skb->data);
861863
bp->dev->stats.tx_packets++;
864+
queue->stats.tx_packets++;
862865
bp->dev->stats.tx_bytes += skb->len;
866+
queue->stats.tx_bytes += skb->len;
863867
}
864868

865869
/* Now we can safely release resources */
@@ -994,13 +998,15 @@ static int gem_rx(struct macb_queue *queue, int budget)
994998
netdev_err(bp->dev,
995999
"not whole frame pointed by descriptor\n");
9961000
bp->dev->stats.rx_dropped++;
1001+
queue->stats.rx_dropped++;
9971002
break;
9981003
}
9991004
skb = queue->rx_skbuff[entry];
10001005
if (unlikely(!skb)) {
10011006
netdev_err(bp->dev,
10021007
"inconsistent Rx descriptor chain\n");
10031008
bp->dev->stats.rx_dropped++;
1009+
queue->stats.rx_dropped++;
10041010
break;
10051011
}
10061012
/* now everything is ready for receiving packet */
@@ -1021,7 +1027,9 @@ static int gem_rx(struct macb_queue *queue, int budget)
10211027
skb->ip_summed = CHECKSUM_UNNECESSARY;
10221028

10231029
bp->dev->stats.rx_packets++;
1030+
queue->stats.rx_packets++;
10241031
bp->dev->stats.rx_bytes += skb->len;
1032+
queue->stats.rx_bytes += skb->len;
10251033

10261034
gem_ptp_do_rxstamp(bp, skb, desc);
10271035

@@ -2304,7 +2312,10 @@ static int macb_change_mtu(struct net_device *dev, int new_mtu)
23042312

23052313
static void gem_update_stats(struct macb *bp)
23062314
{
2307-
unsigned int i;
2315+
struct macb_queue *queue;
2316+
unsigned int i, q, idx;
2317+
unsigned long *stat;
2318+
23082319
u32 *p = &bp->hw_stats.gem.tx_octets_31_0;
23092320

23102321
for (i = 0; i < GEM_STATS_LEN; ++i, ++p) {
@@ -2321,6 +2332,11 @@ static void gem_update_stats(struct macb *bp)
23212332
*(++p) += val;
23222333
}
23232334
}
2335+
2336+
idx = GEM_STATS_LEN;
2337+
for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue)
2338+
for (i = 0, stat = &queue->stats.first; i < QUEUE_STATS_LEN; ++i, ++stat)
2339+
bp->ethtool_stats[idx++] = *stat;
23242340
}
23252341

23262342
static struct net_device_stats *gem_get_stats(struct macb *bp)
@@ -2368,28 +2384,43 @@ static void gem_get_ethtool_stats(struct net_device *dev,
23682384

23692385
bp = netdev_priv(dev);
23702386
gem_update_stats(bp);
2371-
memcpy(data, &bp->ethtool_stats, sizeof(u64) * GEM_STATS_LEN);
2387+
memcpy(data, &bp->ethtool_stats, sizeof(u64)
2388+
* (GEM_STATS_LEN + QUEUE_STATS_LEN * MACB_MAX_QUEUES));
23722389
}
23732390

23742391
static int gem_get_sset_count(struct net_device *dev, int sset)
23752392
{
2393+
struct macb *bp = netdev_priv(dev);
2394+
23762395
switch (sset) {
23772396
case ETH_SS_STATS:
2378-
return GEM_STATS_LEN;
2397+
return GEM_STATS_LEN + bp->num_queues * QUEUE_STATS_LEN;
23792398
default:
23802399
return -EOPNOTSUPP;
23812400
}
23822401
}
23832402

23842403
static void gem_get_ethtool_strings(struct net_device *dev, u32 sset, u8 *p)
23852404
{
2405+
char stat_string[ETH_GSTRING_LEN];
2406+
struct macb *bp = netdev_priv(dev);
2407+
struct macb_queue *queue;
23862408
unsigned int i;
2409+
unsigned int q;
23872410

23882411
switch (sset) {
23892412
case ETH_SS_STATS:
23902413
for (i = 0; i < GEM_STATS_LEN; i++, p += ETH_GSTRING_LEN)
23912414
memcpy(p, gem_statistics[i].stat_string,
23922415
ETH_GSTRING_LEN);
2416+
2417+
for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) {
2418+
for (i = 0; i < QUEUE_STATS_LEN; i++, p += ETH_GSTRING_LEN) {
2419+
snprintf(stat_string, ETH_GSTRING_LEN, "q%d_%s",
2420+
q, queue_statistics[i].stat_string);
2421+
memcpy(p, stat_string, ETH_GSTRING_LEN);
2422+
}
2423+
}
23932424
break;
23942425
}
23952426
}

0 commit comments

Comments
 (0)