On 3/6/24 02:42, Mina Almasry wrote:
On Tue, Mar 5, 2024 at 6:28 PM David Wei dw@davidwei.uk wrote:
On 2024-03-04 18:01, Mina Almasry wrote:
if (pool->p.queue)
binding = READ_ONCE(pool->p.queue->binding);
if (binding) {
pool->mp_ops = &dmabuf_devmem_ops;
pool->mp_priv = binding;
}
This is specific to TCP devmem. For ZC Rx we will need something more generic to let us pass our own memory provider backend down to the page pool.
What about storing ops and priv void ptr in struct netdev_rx_queue instead? Then we can both use it.
Yes, this is dmabuf specific, I was thinking you'd define your own member of netdev_rx_queue, and then add something like this to page_pool_init:
That would be quite annoying, there are 3 expected users together with huge pages, each would need a field and check all others are disabled as you mentioned and so on. It should be cleaner to pass a generic {pp_ops,pp_private} pair instead.
If header dependencies is a problem, you it can probably be
struct pp_provider_param { struct pp_ops ops; void *private; };
# netdev_rx_queue.h
// definition is not included here struct pp_provider_params;
struct netdev_rx_queue { ... struct pp_provider_params *pp_params; };