Commit 320d5441 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by David S. Miller

net: mvneta: rely on struct mvneta_stats in mvneta_update_stats routine

Introduce mvneta_stats structure in mvneta_update_stats routine signature
in order to collect all the rx stats and update them at the end at the
napi loop. mvneta_stats will be reused adding xdp statistics support to
ethtool.
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 69de66fc
...@@ -397,7 +397,15 @@ static const struct mvneta_statistic mvneta_statistics[] = { ...@@ -397,7 +397,15 @@ static const struct mvneta_statistic mvneta_statistics[] = {
{ ETHTOOL_STAT_REFILL_ERR, T_SW, "refill_errors", }, { ETHTOOL_STAT_REFILL_ERR, T_SW, "refill_errors", },
}; };
struct mvneta_stats {
u64 rx_packets;
u64 rx_bytes;
u64 tx_packets;
u64 tx_bytes;
};
struct mvneta_ethtool_stats { struct mvneta_ethtool_stats {
struct mvneta_stats ps;
u64 skb_alloc_error; u64 skb_alloc_error;
u64 refill_error; u64 refill_error;
}; };
...@@ -406,12 +414,8 @@ struct mvneta_pcpu_stats { ...@@ -406,12 +414,8 @@ struct mvneta_pcpu_stats {
struct u64_stats_sync syncp; struct u64_stats_sync syncp;
struct mvneta_ethtool_stats es; struct mvneta_ethtool_stats es;
u64 rx_packets;
u64 rx_bytes;
u64 rx_dropped; u64 rx_dropped;
u64 rx_errors; u64 rx_errors;
u64 tx_packets;
u64 tx_bytes;
}; };
struct mvneta_pcpu_port { struct mvneta_pcpu_port {
...@@ -751,12 +755,12 @@ mvneta_get_stats64(struct net_device *dev, ...@@ -751,12 +755,12 @@ mvneta_get_stats64(struct net_device *dev,
cpu_stats = per_cpu_ptr(pp->stats, cpu); cpu_stats = per_cpu_ptr(pp->stats, cpu);
do { do {
start = u64_stats_fetch_begin_irq(&cpu_stats->syncp); start = u64_stats_fetch_begin_irq(&cpu_stats->syncp);
rx_packets = cpu_stats->rx_packets; rx_packets = cpu_stats->es.ps.rx_packets;
rx_bytes = cpu_stats->rx_bytes; rx_bytes = cpu_stats->es.ps.rx_bytes;
rx_dropped = cpu_stats->rx_dropped; rx_dropped = cpu_stats->rx_dropped;
rx_errors = cpu_stats->rx_errors; rx_errors = cpu_stats->rx_errors;
tx_packets = cpu_stats->tx_packets; tx_packets = cpu_stats->es.ps.tx_packets;
tx_bytes = cpu_stats->tx_bytes; tx_bytes = cpu_stats->es.ps.tx_bytes;
} while (u64_stats_fetch_retry_irq(&cpu_stats->syncp, start)); } while (u64_stats_fetch_retry_irq(&cpu_stats->syncp, start));
stats->rx_packets += rx_packets; stats->rx_packets += rx_packets;
...@@ -1945,13 +1949,14 @@ static void mvneta_rxq_drop_pkts(struct mvneta_port *pp, ...@@ -1945,13 +1949,14 @@ static void mvneta_rxq_drop_pkts(struct mvneta_port *pp,
} }
static void static void
mvneta_update_stats(struct mvneta_port *pp, u32 pkts, u32 len) mvneta_update_stats(struct mvneta_port *pp,
struct mvneta_stats *ps)
{ {
struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats); struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats);
u64_stats_update_begin(&stats->syncp); u64_stats_update_begin(&stats->syncp);
stats->rx_packets += pkts; stats->es.ps.rx_packets += ps->rx_packets;
stats->rx_bytes += len; stats->es.ps.rx_bytes += ps->rx_bytes;
u64_stats_update_end(&stats->syncp); u64_stats_update_end(&stats->syncp);
} }
...@@ -2026,8 +2031,8 @@ mvneta_xdp_submit_frame(struct mvneta_port *pp, struct mvneta_tx_queue *txq, ...@@ -2026,8 +2031,8 @@ mvneta_xdp_submit_frame(struct mvneta_port *pp, struct mvneta_tx_queue *txq,
tx_desc->data_size = xdpf->len; tx_desc->data_size = xdpf->len;
u64_stats_update_begin(&stats->syncp); u64_stats_update_begin(&stats->syncp);
stats->tx_bytes += xdpf->len; stats->es.ps.tx_bytes += xdpf->len;
stats->tx_packets++; stats->es.ps.tx_packets++;
u64_stats_update_end(&stats->syncp); u64_stats_update_end(&stats->syncp);
mvneta_txq_inc_put(txq); mvneta_txq_inc_put(txq);
...@@ -2098,7 +2103,8 @@ mvneta_xdp_xmit(struct net_device *dev, int num_frame, ...@@ -2098,7 +2103,8 @@ mvneta_xdp_xmit(struct net_device *dev, int num_frame,
static int static int
mvneta_run_xdp(struct mvneta_port *pp, struct mvneta_rx_queue *rxq, mvneta_run_xdp(struct mvneta_port *pp, struct mvneta_rx_queue *rxq,
struct bpf_prog *prog, struct xdp_buff *xdp) struct bpf_prog *prog, struct xdp_buff *xdp,
struct mvneta_stats *stats)
{ {
unsigned int len; unsigned int len;
u32 ret, act; u32 ret, act;
...@@ -2108,8 +2114,7 @@ mvneta_run_xdp(struct mvneta_port *pp, struct mvneta_rx_queue *rxq, ...@@ -2108,8 +2114,7 @@ mvneta_run_xdp(struct mvneta_port *pp, struct mvneta_rx_queue *rxq,
switch (act) { switch (act) {
case XDP_PASS: case XDP_PASS:
ret = MVNETA_XDP_PASS; return MVNETA_XDP_PASS;
break;
case XDP_REDIRECT: { case XDP_REDIRECT: {
int err; int err;
...@@ -2145,6 +2150,9 @@ mvneta_run_xdp(struct mvneta_port *pp, struct mvneta_rx_queue *rxq, ...@@ -2145,6 +2150,9 @@ mvneta_run_xdp(struct mvneta_port *pp, struct mvneta_rx_queue *rxq,
break; break;
} }
stats->rx_bytes += xdp->data_end - xdp->data;
stats->rx_packets++;
return ret; return ret;
} }
...@@ -2154,7 +2162,8 @@ mvneta_swbm_rx_frame(struct mvneta_port *pp, ...@@ -2154,7 +2162,8 @@ mvneta_swbm_rx_frame(struct mvneta_port *pp,
struct mvneta_rx_queue *rxq, struct mvneta_rx_queue *rxq,
struct xdp_buff *xdp, struct xdp_buff *xdp,
struct bpf_prog *xdp_prog, struct bpf_prog *xdp_prog,
struct page *page, u32 *xdp_ret) struct page *page, u32 *xdp_ret,
struct mvneta_stats *stats)
{ {
unsigned char *data = page_address(page); unsigned char *data = page_address(page);
int data_len = -MVNETA_MH_SIZE, len; int data_len = -MVNETA_MH_SIZE, len;
...@@ -2185,10 +2194,8 @@ mvneta_swbm_rx_frame(struct mvneta_port *pp, ...@@ -2185,10 +2194,8 @@ mvneta_swbm_rx_frame(struct mvneta_port *pp,
if (xdp_prog) { if (xdp_prog) {
u32 ret; u32 ret;
ret = mvneta_run_xdp(pp, rxq, xdp_prog, xdp); ret = mvneta_run_xdp(pp, rxq, xdp_prog, xdp, stats);
if (ret != MVNETA_XDP_PASS) { if (ret != MVNETA_XDP_PASS) {
mvneta_update_stats(pp, 1,
xdp->data_end - xdp->data);
rx_desc->buf_phys_addr = 0; rx_desc->buf_phys_addr = 0;
*xdp_ret |= ret; *xdp_ret |= ret;
return ret; return ret;
...@@ -2259,11 +2266,11 @@ static int mvneta_rx_swbm(struct napi_struct *napi, ...@@ -2259,11 +2266,11 @@ static int mvneta_rx_swbm(struct napi_struct *napi,
struct mvneta_port *pp, int budget, struct mvneta_port *pp, int budget,
struct mvneta_rx_queue *rxq) struct mvneta_rx_queue *rxq)
{ {
int rcvd_pkts = 0, rcvd_bytes = 0, rx_proc = 0; int rx_proc = 0, rx_todo, refill;
struct net_device *dev = pp->dev; struct net_device *dev = pp->dev;
struct mvneta_stats ps = {};
struct bpf_prog *xdp_prog; struct bpf_prog *xdp_prog;
struct xdp_buff xdp_buf; struct xdp_buff xdp_buf;
int rx_todo, refill;
u32 xdp_ret = 0; u32 xdp_ret = 0;
/* Get number of received packets */ /* Get number of received packets */
...@@ -2297,7 +2304,8 @@ static int mvneta_rx_swbm(struct napi_struct *napi, ...@@ -2297,7 +2304,8 @@ static int mvneta_rx_swbm(struct napi_struct *napi,
} }
err = mvneta_swbm_rx_frame(pp, rx_desc, rxq, &xdp_buf, err = mvneta_swbm_rx_frame(pp, rx_desc, rxq, &xdp_buf,
xdp_prog, page, &xdp_ret); xdp_prog, page, &xdp_ret,
&ps);
if (err) if (err)
continue; continue;
} else { } else {
...@@ -2321,8 +2329,9 @@ static int mvneta_rx_swbm(struct napi_struct *napi, ...@@ -2321,8 +2329,9 @@ static int mvneta_rx_swbm(struct napi_struct *napi,
rxq->skb = NULL; rxq->skb = NULL;
continue; continue;
} }
rcvd_pkts++;
rcvd_bytes += rxq->skb->len; ps.rx_bytes += rxq->skb->len;
ps.rx_packets++;
/* Linux processing */ /* Linux processing */
rxq->skb->protocol = eth_type_trans(rxq->skb, dev); rxq->skb->protocol = eth_type_trans(rxq->skb, dev);
...@@ -2337,8 +2346,8 @@ static int mvneta_rx_swbm(struct napi_struct *napi, ...@@ -2337,8 +2346,8 @@ static int mvneta_rx_swbm(struct napi_struct *napi,
if (xdp_ret & MVNETA_XDP_REDIR) if (xdp_ret & MVNETA_XDP_REDIR)
xdp_do_flush_map(); xdp_do_flush_map();
if (rcvd_pkts) if (ps.rx_packets)
mvneta_update_stats(pp, rcvd_pkts, rcvd_bytes); mvneta_update_stats(pp, &ps);
/* return some buffers to hardware queue, one at a time is too slow */ /* return some buffers to hardware queue, one at a time is too slow */
refill = mvneta_rx_refill_queue(pp, rxq); refill = mvneta_rx_refill_queue(pp, rxq);
...@@ -2346,7 +2355,7 @@ static int mvneta_rx_swbm(struct napi_struct *napi, ...@@ -2346,7 +2355,7 @@ static int mvneta_rx_swbm(struct napi_struct *napi,
/* Update rxq management counters */ /* Update rxq management counters */
mvneta_rxq_desc_num_update(pp, rxq, rx_proc, refill); mvneta_rxq_desc_num_update(pp, rxq, rx_proc, refill);
return rcvd_pkts; return ps.rx_packets;
} }
/* Main rx processing when using hardware buffer management */ /* Main rx processing when using hardware buffer management */
...@@ -2472,8 +2481,8 @@ static int mvneta_rx_hwbm(struct napi_struct *napi, ...@@ -2472,8 +2481,8 @@ static int mvneta_rx_hwbm(struct napi_struct *napi,
struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats); struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats);
u64_stats_update_begin(&stats->syncp); u64_stats_update_begin(&stats->syncp);
stats->rx_packets += rcvd_pkts; stats->es.ps.rx_packets += rcvd_pkts;
stats->rx_bytes += rcvd_bytes; stats->es.ps.rx_bytes += rcvd_bytes;
u64_stats_update_end(&stats->syncp); u64_stats_update_end(&stats->syncp);
} }
...@@ -2746,8 +2755,8 @@ static netdev_tx_t mvneta_tx(struct sk_buff *skb, struct net_device *dev) ...@@ -2746,8 +2755,8 @@ static netdev_tx_t mvneta_tx(struct sk_buff *skb, struct net_device *dev)
txq->pending += frags; txq->pending += frags;
u64_stats_update_begin(&stats->syncp); u64_stats_update_begin(&stats->syncp);
stats->tx_bytes += len; stats->es.ps.tx_bytes += len;
stats->tx_packets++; stats->es.ps.tx_packets++;
u64_stats_update_end(&stats->syncp); u64_stats_update_end(&stats->syncp);
} else { } else {
dev->stats.tx_dropped++; dev->stats.tx_dropped++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment