--- /dev/null
+From 60240bc26114543fcbfcd8a28466e67e77b20388 Mon Sep 17 00:00:00 2001
+From: Jalal Mostafa <jalal.a.mostapha@gmail.com>
+Date: Wed, 21 Sep 2022 13:57:01 +0000
+Subject: xsk: Inherit need_wakeup flag for shared sockets
+
+From: Jalal Mostafa <jalal.a.mostapha@gmail.com>
+
+commit 60240bc26114543fcbfcd8a28466e67e77b20388 upstream.
+
+The flag for need_wakeup is not set for xsks with `XDP_SHARED_UMEM`
+flag and of different queue ids and/or devices. They should inherit
+the flag from the first socket buffer pool since no flags can be
+specified once `XDP_SHARED_UMEM` is specified.
+
+Fixes: b5aea28dca134 ("xsk: Add shared umem support between queue ids")
+Signed-off-by: Jalal Mostafa <jalal.a.mostapha@gmail.com>
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Acked-by: Magnus Karlsson <magnus.karlsson@intel.com>
+Link: https://lore.kernel.org/bpf/20220921135701.10199-1-jalal.a.mostapha@gmail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ include/net/xsk_buff_pool.h | 2 +-
+ net/xdp/xsk.c | 4 ++--
+ net/xdp/xsk_buff_pool.c | 5 +++--
+ 3 files changed, 6 insertions(+), 5 deletions(-)
+
+--- a/include/net/xsk_buff_pool.h
++++ b/include/net/xsk_buff_pool.h
+@@ -95,7 +95,7 @@ struct xsk_buff_pool *xp_create_and_assi
+ struct xdp_umem *umem);
+ int xp_assign_dev(struct xsk_buff_pool *pool, struct net_device *dev,
+ u16 queue_id, u16 flags);
+-int xp_assign_dev_shared(struct xsk_buff_pool *pool, struct xdp_umem *umem,
++int xp_assign_dev_shared(struct xsk_buff_pool *pool, struct xdp_sock *umem_xs,
+ struct net_device *dev, u16 queue_id);
+ int xp_alloc_tx_descs(struct xsk_buff_pool *pool, struct xdp_sock *xs);
+ void xp_destroy(struct xsk_buff_pool *pool);
+--- a/net/xdp/xsk.c
++++ b/net/xdp/xsk.c
+@@ -954,8 +954,8 @@ static int xsk_bind(struct socket *sock,
+ goto out_unlock;
+ }
+
+- err = xp_assign_dev_shared(xs->pool, umem_xs->umem,
+- dev, qid);
++ err = xp_assign_dev_shared(xs->pool, umem_xs, dev,
++ qid);
+ if (err) {
+ xp_destroy(xs->pool);
+ xs->pool = NULL;
+--- a/net/xdp/xsk_buff_pool.c
++++ b/net/xdp/xsk_buff_pool.c
+@@ -212,17 +212,18 @@ err_unreg_pool:
+ return err;
+ }
+
+-int xp_assign_dev_shared(struct xsk_buff_pool *pool, struct xdp_umem *umem,
++int xp_assign_dev_shared(struct xsk_buff_pool *pool, struct xdp_sock *umem_xs,
+ struct net_device *dev, u16 queue_id)
+ {
+ u16 flags;
++ struct xdp_umem *umem = umem_xs->umem;
+
+ /* One fill and completion ring required for each queue id. */
+ if (!pool->fq || !pool->cq)
+ return -EINVAL;
+
+ flags = umem->zc ? XDP_ZEROCOPY : XDP_COPY;
+- if (pool->uses_need_wakeup)
++ if (umem_xs->pool->uses_need_wakeup)
+ flags |= XDP_USE_NEED_WAKEUP;
+
+ return xp_assign_dev(pool, dev, queue_id, flags);