net: ena: xdp: add queue counters for xdp actions
[linux-2.6-microblaze.git] / drivers / net / ethernet / amazon / ena / ena_netdev.c
index 08474db..b52e8d0 100644 (file)
@@ -365,6 +365,7 @@ static int ena_xdp_execute(struct ena_ring *rx_ring,
 {
        struct bpf_prog *xdp_prog;
        u32 verdict = XDP_PASS;
+       u64 *xdp_stat;
 
        rcu_read_lock();
        xdp_prog = READ_ONCE(rx_ring->xdp_bpf_prog);
@@ -374,17 +375,31 @@ static int ena_xdp_execute(struct ena_ring *rx_ring,
 
        verdict = bpf_prog_run_xdp(xdp_prog, xdp);
 
-       if (verdict == XDP_TX)
+       if (verdict == XDP_TX) {
                ena_xdp_xmit_buff(rx_ring->netdev,
                                  xdp,
                                  rx_ring->qid + rx_ring->adapter->num_io_queues,
                                  rx_info);
-       else if (unlikely(verdict == XDP_ABORTED))
+
+               xdp_stat = &rx_ring->rx_stats.xdp_tx;
+       } else if (unlikely(verdict == XDP_ABORTED)) {
                trace_xdp_exception(rx_ring->netdev, xdp_prog, verdict);
-       else if (unlikely(verdict > XDP_TX))
+               xdp_stat = &rx_ring->rx_stats.xdp_aborted;
+       } else if (unlikely(verdict == XDP_DROP)) {
+               xdp_stat = &rx_ring->rx_stats.xdp_drop;
+       } else if (unlikely(verdict == XDP_PASS)) {
+               xdp_stat = &rx_ring->rx_stats.xdp_pass;
+       } else {
                bpf_warn_invalid_xdp_action(verdict);
+               xdp_stat = &rx_ring->rx_stats.xdp_invalid;
+       }
+
+       u64_stats_update_begin(&rx_ring->syncp);
+       (*xdp_stat)++;
+       u64_stats_update_end(&rx_ring->syncp);
 out:
        rcu_read_unlock();
+
        return verdict;
 }