Skip to content

Commit 325945e

Browse files
Jakub Kicinskidavem330
authored andcommitted
nfp: split software and hardware vNIC statistics
In preparation for reporting vNIC HW stats on representors split handling of the SW and HW stats in ethtool -S. Representors don't have SW stats (since vNIC is assigned to the VM). Remove the questionable defines which assume nn variable exists in the scope. Signed-off-by: Jakub Kicinski <[email protected]> Reviewed-by: Simon Horman <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 634287b commit 325945e

File tree

1 file changed

+120
-72
lines changed

1 file changed

+120
-72
lines changed

drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c

Lines changed: 120 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,7 @@ static const struct nfp_et_stat nfp_net_et_stats[] = {
100100
};
101101

102102
#define NN_ET_GLOBAL_STATS_LEN ARRAY_SIZE(nfp_net_et_stats)
103-
#define NN_ET_RVEC_STATS_LEN (nn->dp.num_r_vecs * 3)
104103
#define NN_ET_RVEC_GATHER_STATS 7
105-
#define NN_ET_QUEUE_STATS_LEN ((nn->dp.num_tx_rings + nn->dp.num_rx_rings) * 2)
106-
#define NN_ET_STATS_LEN (NN_ET_GLOBAL_STATS_LEN + NN_ET_RVEC_GATHER_STATS + \
107-
NN_ET_RVEC_STATS_LEN + NN_ET_QUEUE_STATS_LEN)
108104

109105
static void nfp_net_get_nspinfo(struct nfp_app *app, char *version)
110106
{
@@ -346,96 +342,146 @@ static __printf(2, 3) u8 *nfp_pr_et(u8 *data, const char *fmt, ...)
346342
return data + ETH_GSTRING_LEN;
347343
}
348344

349-
static void nfp_net_get_strings(struct net_device *netdev,
350-
u32 stringset, u8 *data)
345+
static unsigned int nfp_vnic_get_sw_stats_count(struct net_device *netdev)
351346
{
352347
struct nfp_net *nn = netdev_priv(netdev);
353-
int i;
354348

355-
switch (stringset) {
356-
case ETH_SS_STATS:
357-
for (i = 0; i < NN_ET_GLOBAL_STATS_LEN; i++)
358-
data = nfp_pr_et(data, nfp_net_et_stats[i].name);
349+
return NN_ET_RVEC_GATHER_STATS + nn->dp.num_r_vecs * 3;
350+
}
359351

360-
for (i = 0; i < nn->dp.num_r_vecs; i++) {
361-
data = nfp_pr_et(data, "rvec_%u_rx_pkts", i);
362-
data = nfp_pr_et(data, "rvec_%u_tx_pkts", i);
363-
data = nfp_pr_et(data, "rvec_%u_tx_busy", i);
364-
}
352+
static u8 *nfp_vnic_get_sw_stats_strings(struct net_device *netdev, u8 *data)
353+
{
354+
struct nfp_net *nn = netdev_priv(netdev);
355+
int i;
365356

366-
data = nfp_pr_et(data, "hw_rx_csum_ok");
367-
data = nfp_pr_et(data, "hw_rx_csum_inner_ok");
368-
data = nfp_pr_et(data, "hw_rx_csum_err");
369-
data = nfp_pr_et(data, "hw_tx_csum");
370-
data = nfp_pr_et(data, "hw_tx_inner_csum");
371-
data = nfp_pr_et(data, "tx_gather");
372-
data = nfp_pr_et(data, "tx_lso");
373-
374-
for (i = 0; i < nn->dp.num_tx_rings; i++) {
375-
data = nfp_pr_et(data, "txq_%u_pkts", i);
376-
data = nfp_pr_et(data, "txq_%u_bytes", i);
377-
}
357+
for (i = 0; i < nn->dp.num_r_vecs; i++) {
358+
data = nfp_pr_et(data, "rvec_%u_rx_pkts", i);
359+
data = nfp_pr_et(data, "rvec_%u_tx_pkts", i);
360+
data = nfp_pr_et(data, "rvec_%u_tx_busy", i);
361+
}
378362

379-
for (i = 0; i < nn->dp.num_rx_rings; i++) {
380-
data = nfp_pr_et(data, "rxq_%u_pkts", i);
381-
data = nfp_pr_et(data, "rxq_%u_bytes", i);
382-
}
363+
data = nfp_pr_et(data, "hw_rx_csum_ok");
364+
data = nfp_pr_et(data, "hw_rx_csum_inner_ok");
365+
data = nfp_pr_et(data, "hw_rx_csum_err");
366+
data = nfp_pr_et(data, "hw_tx_csum");
367+
data = nfp_pr_et(data, "hw_tx_inner_csum");
368+
data = nfp_pr_et(data, "tx_gather");
369+
data = nfp_pr_et(data, "tx_lso");
383370

384-
break;
385-
}
371+
return data;
386372
}
387373

388-
static void nfp_net_get_stats(struct net_device *netdev,
389-
struct ethtool_stats *stats, u64 *data)
374+
static u64 *nfp_vnic_get_sw_stats(struct net_device *netdev, u64 *data)
390375
{
391376
u64 gathered_stats[NN_ET_RVEC_GATHER_STATS] = {};
392377
struct nfp_net *nn = netdev_priv(netdev);
393378
u64 tmp[NN_ET_RVEC_GATHER_STATS];
394-
u8 __iomem *io_p;
395-
int i, j, k;
379+
unsigned int i, j;
396380

397-
for (i = 0; i < NN_ET_GLOBAL_STATS_LEN; i++) {
398-
io_p = nn->dp.ctrl_bar + nfp_net_et_stats[i].off;
399-
data[i] = readq(io_p);
400-
}
401-
for (j = 0; j < nn->dp.num_r_vecs; j++) {
381+
for (i = 0; i < nn->dp.num_r_vecs; i++) {
402382
unsigned int start;
403383

404384
do {
405-
start = u64_stats_fetch_begin(&nn->r_vecs[j].rx_sync);
406-
data[i++] = nn->r_vecs[j].rx_pkts;
407-
tmp[0] = nn->r_vecs[j].hw_csum_rx_ok;
408-
tmp[1] = nn->r_vecs[j].hw_csum_rx_inner_ok;
409-
tmp[2] = nn->r_vecs[j].hw_csum_rx_error;
410-
} while (u64_stats_fetch_retry(&nn->r_vecs[j].rx_sync, start));
385+
start = u64_stats_fetch_begin(&nn->r_vecs[i].rx_sync);
386+
*data++ = nn->r_vecs[i].rx_pkts;
387+
tmp[0] = nn->r_vecs[i].hw_csum_rx_ok;
388+
tmp[1] = nn->r_vecs[i].hw_csum_rx_inner_ok;
389+
tmp[2] = nn->r_vecs[i].hw_csum_rx_error;
390+
} while (u64_stats_fetch_retry(&nn->r_vecs[i].rx_sync, start));
411391

412392
do {
413-
start = u64_stats_fetch_begin(&nn->r_vecs[j].tx_sync);
414-
data[i++] = nn->r_vecs[j].tx_pkts;
415-
data[i++] = nn->r_vecs[j].tx_busy;
416-
tmp[3] = nn->r_vecs[j].hw_csum_tx;
417-
tmp[4] = nn->r_vecs[j].hw_csum_tx_inner;
418-
tmp[5] = nn->r_vecs[j].tx_gather;
419-
tmp[6] = nn->r_vecs[j].tx_lso;
420-
} while (u64_stats_fetch_retry(&nn->r_vecs[j].tx_sync, start));
421-
422-
for (k = 0; k < NN_ET_RVEC_GATHER_STATS; k++)
423-
gathered_stats[k] += tmp[k];
393+
start = u64_stats_fetch_begin(&nn->r_vecs[i].tx_sync);
394+
*data++ = nn->r_vecs[i].tx_pkts;
395+
*data++ = nn->r_vecs[i].tx_busy;
396+
tmp[3] = nn->r_vecs[i].hw_csum_tx;
397+
tmp[4] = nn->r_vecs[i].hw_csum_tx_inner;
398+
tmp[5] = nn->r_vecs[i].tx_gather;
399+
tmp[6] = nn->r_vecs[i].tx_lso;
400+
} while (u64_stats_fetch_retry(&nn->r_vecs[i].tx_sync, start));
401+
402+
for (j = 0; j < NN_ET_RVEC_GATHER_STATS; j++)
403+
gathered_stats[j] += tmp[j];
424404
}
405+
425406
for (j = 0; j < NN_ET_RVEC_GATHER_STATS; j++)
426-
data[i++] = gathered_stats[j];
427-
for (j = 0; j < nn->dp.num_tx_rings; j++) {
428-
io_p = nn->dp.ctrl_bar + NFP_NET_CFG_TXR_STATS(j);
429-
data[i++] = readq(io_p);
430-
io_p = nn->dp.ctrl_bar + NFP_NET_CFG_TXR_STATS(j) + 8;
431-
data[i++] = readq(io_p);
407+
*data++ = gathered_stats[j];
408+
409+
return data;
410+
}
411+
412+
static unsigned int
413+
nfp_vnic_get_hw_stats_count(unsigned int rx_rings, unsigned int tx_rings)
414+
{
415+
return NN_ET_GLOBAL_STATS_LEN + (rx_rings + tx_rings) * 2;
416+
}
417+
418+
static u8 *
419+
nfp_vnic_get_hw_stats_strings(u8 *data, unsigned int rx_rings,
420+
unsigned int tx_rings)
421+
{
422+
int i;
423+
424+
for (i = 0; i < NN_ET_GLOBAL_STATS_LEN; i++)
425+
data = nfp_pr_et(data, nfp_net_et_stats[i].name);
426+
427+
for (i = 0; i < tx_rings; i++) {
428+
data = nfp_pr_et(data, "txq_%u_pkts", i);
429+
data = nfp_pr_et(data, "txq_%u_bytes", i);
432430
}
433-
for (j = 0; j < nn->dp.num_rx_rings; j++) {
434-
io_p = nn->dp.ctrl_bar + NFP_NET_CFG_RXR_STATS(j);
435-
data[i++] = readq(io_p);
436-
io_p = nn->dp.ctrl_bar + NFP_NET_CFG_RXR_STATS(j) + 8;
437-
data[i++] = readq(io_p);
431+
432+
for (i = 0; i < rx_rings; i++) {
433+
data = nfp_pr_et(data, "rxq_%u_pkts", i);
434+
data = nfp_pr_et(data, "rxq_%u_bytes", i);
438435
}
436+
437+
return data;
438+
}
439+
440+
static u64 *
441+
nfp_vnic_get_hw_stats(u64 *data, u8 __iomem *mem,
442+
unsigned int rx_rings, unsigned int tx_rings)
443+
{
444+
unsigned int i;
445+
446+
for (i = 0; i < NN_ET_GLOBAL_STATS_LEN; i++)
447+
*data++ = readq(mem + nfp_net_et_stats[i].off);
448+
449+
for (i = 0; i < tx_rings; i++) {
450+
*data++ = readq(mem + NFP_NET_CFG_TXR_STATS(i));
451+
*data++ = readq(mem + NFP_NET_CFG_TXR_STATS(i) + 8);
452+
}
453+
454+
for (i = 0; i < rx_rings; i++) {
455+
*data++ = readq(mem + NFP_NET_CFG_RXR_STATS(i));
456+
*data++ = readq(mem + NFP_NET_CFG_RXR_STATS(i) + 8);
457+
}
458+
459+
return data;
460+
}
461+
462+
static void nfp_net_get_strings(struct net_device *netdev,
463+
u32 stringset, u8 *data)
464+
{
465+
struct nfp_net *nn = netdev_priv(netdev);
466+
467+
switch (stringset) {
468+
case ETH_SS_STATS:
469+
data = nfp_vnic_get_sw_stats_strings(netdev, data);
470+
data = nfp_vnic_get_hw_stats_strings(data, nn->dp.num_rx_rings,
471+
nn->dp.num_tx_rings);
472+
break;
473+
}
474+
}
475+
476+
static void
477+
nfp_net_get_stats(struct net_device *netdev, struct ethtool_stats *stats,
478+
u64 *data)
479+
{
480+
struct nfp_net *nn = netdev_priv(netdev);
481+
482+
data = nfp_vnic_get_sw_stats(netdev, data);
483+
data = nfp_vnic_get_hw_stats(data, nn->dp.ctrl_bar,
484+
nn->dp.num_rx_rings, nn->dp.num_tx_rings);
439485
}
440486

441487
static int nfp_net_get_sset_count(struct net_device *netdev, int sset)
@@ -444,7 +490,9 @@ static int nfp_net_get_sset_count(struct net_device *netdev, int sset)
444490

445491
switch (sset) {
446492
case ETH_SS_STATS:
447-
return NN_ET_STATS_LEN;
493+
return nfp_vnic_get_sw_stats_count(netdev) +
494+
nfp_vnic_get_hw_stats_count(nn->dp.num_rx_rings,
495+
nn->dp.num_tx_rings);
448496
default:
449497
return -EOPNOTSUPP;
450498
}

0 commit comments

Comments
 (0)