diff options
author | Maciej Fijalkowski <maciej.fijalkowski@intel.com> | 2024-01-24 22:15:52 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2024-02-01 03:19:04 +0300 |
commit | cce713664548284daf977739e7ff1cd59e84189c (patch) | |
tree | d89bff132a73a7b5360203d53def98c11efb3a62 /net/xdp/xsk.c | |
parent | bf47ffc1a5275146d4507fc121a0056838744231 (diff) | |
download | linux-cce713664548284daf977739e7ff1cd59e84189c.tar.xz |
xsk: recycle buffer in case Rx queue was full
[ Upstream commit 269009893146c495f41e9572dd9319e787c2eba9 ]
Add missing xsk_buff_free() call when __xsk_rcv_zc() failed to produce
descriptor to XSK Rx queue.
Fixes: 24ea50127ecf ("xsk: support mbuf on ZC RX")
Acked-by: Magnus Karlsson <magnus.karlsson@intel.com>
Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Link: https://lore.kernel.org/r/20240124191602.566724-2-maciej.fijalkowski@intel.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'net/xdp/xsk.c')
-rw-r--r-- | net/xdp/xsk.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 774a6d1916e4..d849dc04a334 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -166,8 +166,10 @@ static int xsk_rcv_zc(struct xdp_sock *xs, struct xdp_buff *xdp, u32 len) contd = XDP_PKT_CONTD; err = __xsk_rcv_zc(xs, xskb, len, contd); - if (err || likely(!frags)) - goto out; + if (err) + goto err; + if (likely(!frags)) + return 0; xskb_list = &xskb->pool->xskb_list; list_for_each_entry_safe(pos, tmp, xskb_list, xskb_list_node) { @@ -176,11 +178,13 @@ static int xsk_rcv_zc(struct xdp_sock *xs, struct xdp_buff *xdp, u32 len) len = pos->xdp.data_end - pos->xdp.data; err = __xsk_rcv_zc(xs, pos, len, contd); if (err) - return err; + goto err; list_del(&pos->xskb_list_node); } -out: + return 0; +err: + xsk_buff_free(xdp); return err; } |