On Mon, Sep 19, 2022 at 9:27 PM Jalal Mostafa <jalal.a.mostapha@xxxxxxxxx> wrote: > > 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. The issue is fixed > by creating a new function `xp_create_and_assign_umem_shared` to > create xsk_buff_pool for xsks with the shared umem flag set. Thanks for spotting this Jalal. Though I think we should aim for a simpler fix. The uses_need_wakeup flag is set by xp_assign_dev(). The problem here is the function xp_assign_dev_shared() that prepares the flag parameter for xp_assign_dev(). if (pool->uses_need_wakeup) flags |= XDP_USE_NEED_WAKEUP; Should really be: if (umem_xs->pool->uses_need_wakeup) flags |= XDP_USE_NEED_WAKEUP; So change the function parameter *umem to *umem_xs, use that in the function call and do: flags = umem_xs->umem->zc ? XDP_ZEROCOPY : XDP_COPY; if (umem_xs->pool->uses_need_wakeup) flags |= XDP_USE_NEED_WAKEUP; What do you think? > Signed-off-by: Jalal Mostafa <jalal.a.mostapha@xxxxxxxxx> > --- > include/net/xsk_buff_pool.h | 2 ++ > net/xdp/xsk.c | 3 +-- > net/xdp/xsk_buff_pool.c | 15 +++++++++++++++ > 3 files changed, 18 insertions(+), 2 deletions(-) > > diff --git a/include/net/xsk_buff_pool.h b/include/net/xsk_buff_pool.h > index 647722e847b4..917cfef9d355 100644 > --- a/include/net/xsk_buff_pool.h > +++ b/include/net/xsk_buff_pool.h > @@ -93,6 +93,8 @@ struct xsk_buff_pool { > /* AF_XDP core. */ > struct xsk_buff_pool *xp_create_and_assign_umem(struct xdp_sock *xs, > struct xdp_umem *umem); > +struct xsk_buff_pool *xp_create_and_assign_umem_shared(struct xdp_sock *xs, > + struct xdp_sock *umem_xs); > 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, > diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c > index 5b4ce6ba1bc7..a415db88e8e5 100644 > --- a/net/xdp/xsk.c > +++ b/net/xdp/xsk.c > @@ -946,8 +946,7 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len) > /* Share the umem with another socket on another qid > * and/or device. > */ > - xs->pool = xp_create_and_assign_umem(xs, > - umem_xs->umem); > + xs->pool = xp_create_and_assign_umem_shared(xs, umem_xs); > if (!xs->pool) { > err = -ENOMEM; > sockfd_put(sock); > diff --git a/net/xdp/xsk_buff_pool.c b/net/xdp/xsk_buff_pool.c > index a71a8c6edf55..7d5b0bd8d953 100644 > --- a/net/xdp/xsk_buff_pool.c > +++ b/net/xdp/xsk_buff_pool.c > @@ -112,6 +112,21 @@ struct xsk_buff_pool *xp_create_and_assign_umem(struct xdp_sock *xs, > return NULL; > } > > +struct xsk_buff_pool *xp_create_and_assign_umem_shared(struct xdp_sock *xs, > + struct xdp_sock *umem_xs) > +{ > + struct xdp_umem *umem = umem_xs->umem; > + struct xsk_buff_pool *pool = xp_create_and_assign_umem(xs, umem); > + > + if (!pool) > + goto out; > + > + pool->uses_need_wakeup = umem_xs->pool->uses_need_wakeup; > + > +out: > + return pool; > +} > + > void xp_set_rxq_info(struct xsk_buff_pool *pool, struct xdp_rxq_info *rxq) > { > u32 i; > -- > 2.34.1 >