And we actually check that pp->dma_map == true before invoking mp_ops->init(). This code shouldn't be working unless I missed something. Also arguably this check is defensive. The pp should confirm that pp->dma_map is true before invoking any memory provider, you should assume it is true here (and the devmem provider doesn't check it IIRU). > + if (pp->p.order != 0) > + return -EOPNOTSUPP; > + > + percpu_ref_get(&ifq->ctx->refs); > + return 0; > +} > + > +static void io_pp_zc_destroy(struct page_pool *pp) > +{ > + struct io_zcrx_ifq *ifq = pp->mp_priv; > + > + percpu_ref_put(&ifq->ctx->refs); > +} > + > +static int io_pp_nl_fill(void *mp_priv, struct sk_buff *rsp, > + struct netdev_rx_queue *rxq) > +{ > + struct nlattr *nest; > + int type; > + > + type = rxq ? NETDEV_A_QUEUE_IO_URING : NETDEV_A_PAGE_POOL_IO_URING; > + nest = nla_nest_start(rsp, type); > + if (!nest) > + return -EMSGSIZE; > + nla_nest_end(rsp, nest); > + > + return 0; > +} > + > +static void io_pp_uninstall(void *mp_priv, struct netdev_rx_queue *rxq) > +{ > + struct pp_memory_provider_params *p = &rxq->mp_params; > + struct io_zcrx_ifq *ifq = mp_priv; > + > + io_zcrx_drop_netdev(ifq); > + p->mp_ops = NULL; > + p->mp_priv = NULL; > +} > + > +static const struct memory_provider_ops io_uring_pp_zc_ops = { > + .alloc_netmems = io_pp_zc_alloc_netmems, > + .release_netmem = io_pp_zc_release_netmem, > + .init = io_pp_zc_init, > + .destroy = io_pp_zc_destroy, > + .nl_fill = io_pp_nl_fill, > + .uninstall = io_pp_uninstall, > +}; > diff --git a/io_uring/zcrx.h b/io_uring/zcrx.h > index 595bca0001d2..6c808240ac91 100644 > --- a/io_uring/zcrx.h > +++ b/io_uring/zcrx.h > @@ -9,6 +9,7 @@ > struct io_zcrx_area { > struct net_iov_area nia; > struct io_zcrx_ifq *ifq; > + atomic_t *user_refs; > > u16 area_id; > struct page **pages; > @@ -26,6 +27,8 @@ struct io_zcrx_ifq { > struct io_uring *rq_ring; > struct io_uring_zcrx_rqe *rqes; > u32 rq_entries; > + u32 cached_rq_head; > + spinlock_t rq_lock; > > u32 if_rxq; > struct device *dev; > -- > 2.43.5 > -- Thanks, Mina