Message ID | 20220405110631.404427-2-maciej.fijalkowski@intel.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | BPF |
Headers | show |
Series | xsk: stop softirq processing on full XSK Rx queue | expand |
On 05/04/2022 13.06, Maciej Fijalkowski wrote: > From: Björn Töpel<bjorn@kernel.org> > > The error codes returned by xdp_do_redirect() when redirecting a frame > to an AF_XDP socket has not been very useful. A driver could not > distinguish between different errors. Prior this change the following > codes where used: > > Socket not bound or incorrect queue/netdev: EINVAL > XDP frame/AF_XDP buffer size mismatch: ENOSPC > Could not allocate buffer (copy mode): ENOSPC > AF_XDP Rx buffer full: ENOSPC > > After this change: > > Socket not bound or incorrect queue/netdev: EINVAL > XDP frame/AF_XDP buffer size mismatch: ENOSPC > Could not allocate buffer (copy mode): ENOMEM > AF_XDP Rx buffer full: ENOBUFS > > An AF_XDP zero-copy driver can now potentially determine if the > failure was due to a full Rx buffer, and if so stop processing more > frames, yielding to the userland AF_XDP application. > > Signed-off-by: Björn Töpel<bjorn@kernel.org> > Signed-off-by: Maciej Fijalkowski<maciej.fijalkowski@intel.com> Acked-by: Jesper Dangaard Brouer <brouer@redhat.com> Thanks for picking this work up again! :-) --Jesper
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 2c34caee0fd1..f75e121073e7 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -184,7 +184,7 @@ static int __xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp) xsk_xdp = xsk_buff_alloc(xs->pool); if (!xsk_xdp) { xs->rx_dropped++; - return -ENOSPC; + return -ENOMEM; } xsk_copy_xdp(xsk_xdp, xdp, len); diff --git a/net/xdp/xsk_queue.h b/net/xdp/xsk_queue.h index 801cda5d1938..644479e65578 100644 --- a/net/xdp/xsk_queue.h +++ b/net/xdp/xsk_queue.h @@ -382,7 +382,7 @@ static inline int xskq_prod_reserve_desc(struct xsk_queue *q, u32 idx; if (xskq_prod_is_full(q)) - return -ENOSPC; + return -ENOBUFS; /* A, matches D */ idx = q->cached_prod++ & q->ring_mask;