diff options
author | Björn Töpel <bjorn.topel@intel.com> | 2018-06-04 07:57:12 -0400 |
---|---|---|
committer | Daniel Borkmann <daniel@iogearbox.net> | 2018-06-04 11:21:02 -0400 |
commit | a509a95536a86ef84deb16c656d741437791b414 (patch) | |
tree | 7003dd6cf67754e4320e4983604ad29c5ae2ee47 | |
parent | 4e64c835254095f55044d393e628dd3e92fca304 (diff) |
xsk: proper Rx drop statistics update
Previously, rx_dropped could be updated incorrectly, e.g. if the XDP
program redirected the frame to a socket bound to a different queue
than where the XDP program was executing.
Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
-rw-r--r-- | net/xdp/xsk.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 43554eb56fe6..966307ce4b8e 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c | |||
@@ -48,8 +48,10 @@ static int __xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp) | |||
48 | if (xs->dev != xdp->rxq->dev || xs->queue_id != xdp->rxq->queue_index) | 48 | if (xs->dev != xdp->rxq->dev || xs->queue_id != xdp->rxq->queue_index) |
49 | return -EINVAL; | 49 | return -EINVAL; |
50 | 50 | ||
51 | if (!xskq_peek_id(xs->umem->fq, &id)) | 51 | if (!xskq_peek_id(xs->umem->fq, &id)) { |
52 | xs->rx_dropped++; | ||
52 | return -ENOSPC; | 53 | return -ENOSPC; |
54 | } | ||
53 | 55 | ||
54 | buffer = xdp_umem_get_data_with_headroom(xs->umem, id); | 56 | buffer = xdp_umem_get_data_with_headroom(xs->umem, id); |
55 | memcpy(buffer, xdp->data, len); | 57 | memcpy(buffer, xdp->data, len); |
@@ -57,6 +59,8 @@ static int __xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp) | |||
57 | xs->umem->frame_headroom); | 59 | xs->umem->frame_headroom); |
58 | if (!err) | 60 | if (!err) |
59 | xskq_discard_id(xs->umem->fq); | 61 | xskq_discard_id(xs->umem->fq); |
62 | else | ||
63 | xs->rx_dropped++; | ||
60 | 64 | ||
61 | return err; | 65 | return err; |
62 | } | 66 | } |
@@ -68,8 +72,6 @@ int xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp) | |||
68 | err = __xsk_rcv(xs, xdp); | 72 | err = __xsk_rcv(xs, xdp); |
69 | if (likely(!err)) | 73 | if (likely(!err)) |
70 | xdp_return_buff(xdp); | 74 | xdp_return_buff(xdp); |
71 | else | ||
72 | xs->rx_dropped++; | ||
73 | 75 | ||
74 | return err; | 76 | return err; |
75 | } | 77 | } |
@@ -87,8 +89,6 @@ int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp) | |||
87 | err = __xsk_rcv(xs, xdp); | 89 | err = __xsk_rcv(xs, xdp); |
88 | if (!err) | 90 | if (!err) |
89 | xsk_flush(xs); | 91 | xsk_flush(xs); |
90 | else | ||
91 | xs->rx_dropped++; | ||
92 | 92 | ||
93 | return err; | 93 | return err; |
94 | } | 94 | } |