Commit 5d0b2046 authored by Wang Liang's avatar Wang Liang Committed by Alexei Starovoitov
Browse files

xsk: Fix __xsk_generic_xmit() error code when cq is full



When the cq reservation is failed, the error code is not set which is
initialized to zero in __xsk_generic_xmit(). That means the packet is not
send successfully but sendto() return ok.

Considering the impact on uapi, return -EAGAIN is a good idea. The cq is
full usually because it is not released in time, try to send msg again is
appropriate.

The bug was at the very early implementation of xsk, so the Fixes tag
targets the commit that introduced the changes in
xsk_cq_reserve_addr_locked where this fix depends on.

Fixes: e6c4047f ("xsk: Use xsk_buff_pool directly for cq functions")
Suggested-by: default avatarMagnus Karlsson <magnus.karlsson@gmail.com>
Signed-off-by: default avatarWang Liang <wangliang74@huawei.com>
Signed-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
Acked-by: default avatarStanislav Fomichev <sdf@fomichev.me>
Link: https://patch.msgid.link/20250227081052.4096337-1-wangliang74@huawei.com


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent a1b5bd45
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -806,8 +806,11 @@ static int __xsk_generic_xmit(struct sock *sk)
		 * if there is space in it. This avoids having to implement
		 * any buffering in the Tx path.
		 */
		if (xsk_cq_reserve_addr_locked(xs->pool, desc.addr))
		err = xsk_cq_reserve_addr_locked(xs->pool, desc.addr);
		if (err) {
			err = -EAGAIN;
			goto out;
		}

		skb = xsk_build_skb(xs, &desc);
		if (IS_ERR(skb)) {