Commit f17c6964 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by Paolo Abeni

net: page_pool: id the page pools

To give ourselves the flexibility of creating netlink commands
and ability to refer to page pool instances in uAPIs create
IDs for page pools.
Reviewed-by: default avatarIlias Apalodimas <ilias.apalodimas@linaro.org>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Acked-by: default avatarJesper Dangaard Brouer <hawk@kernel.org>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Reviewed-by: default avatarShakeel Butt <shakeelb@google.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 23cfaf67
...@@ -187,6 +187,10 @@ struct page_pool { ...@@ -187,6 +187,10 @@ struct page_pool {
/* Slow/Control-path information follows */ /* Slow/Control-path information follows */
struct page_pool_params_slow slow; struct page_pool_params_slow slow;
/* User-facing fields, protected by page_pools_lock */
struct {
u32 id;
} user;
}; };
struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp); struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp);
......
...@@ -18,7 +18,7 @@ obj-y += dev.o dev_addr_lists.o dst.o netevent.o \ ...@@ -18,7 +18,7 @@ obj-y += dev.o dev_addr_lists.o dst.o netevent.o \
obj-$(CONFIG_NETDEV_ADDR_LIST_TEST) += dev_addr_lists_test.o obj-$(CONFIG_NETDEV_ADDR_LIST_TEST) += dev_addr_lists_test.o
obj-y += net-sysfs.o obj-y += net-sysfs.o
obj-$(CONFIG_PAGE_POOL) += page_pool.o obj-$(CONFIG_PAGE_POOL) += page_pool.o page_pool_user.o
obj-$(CONFIG_PROC_FS) += net-procfs.o obj-$(CONFIG_PROC_FS) += net-procfs.o
obj-$(CONFIG_NET_PKTGEN) += pktgen.o obj-$(CONFIG_NET_PKTGEN) += pktgen.o
obj-$(CONFIG_NETPOLL) += netpoll.o obj-$(CONFIG_NETPOLL) += netpoll.o
......
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
#include <trace/events/page_pool.h> #include <trace/events/page_pool.h>
#include "page_pool_priv.h"
#define DEFER_TIME (msecs_to_jiffies(1000)) #define DEFER_TIME (msecs_to_jiffies(1000))
#define DEFER_WARN_INTERVAL (60 * HZ) #define DEFER_WARN_INTERVAL (60 * HZ)
...@@ -264,13 +266,21 @@ struct page_pool *page_pool_create(const struct page_pool_params *params) ...@@ -264,13 +266,21 @@ struct page_pool *page_pool_create(const struct page_pool_params *params)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
err = page_pool_init(pool, params); err = page_pool_init(pool, params);
if (err < 0) { if (err < 0)
pr_warn("%s() gave up with errno %d\n", __func__, err); goto err_free;
kfree(pool);
return ERR_PTR(err); err = page_pool_list(pool);
} if (err)
goto err_uninit;
return pool; return pool;
err_uninit:
page_pool_uninit(pool);
err_free:
pr_warn("%s() gave up with errno %d\n", __func__, err);
kfree(pool);
return ERR_PTR(err);
} }
EXPORT_SYMBOL(page_pool_create); EXPORT_SYMBOL(page_pool_create);
...@@ -833,6 +843,7 @@ static void __page_pool_destroy(struct page_pool *pool) ...@@ -833,6 +843,7 @@ static void __page_pool_destroy(struct page_pool *pool)
if (pool->disconnect) if (pool->disconnect)
pool->disconnect(pool); pool->disconnect(pool);
page_pool_unlist(pool);
page_pool_uninit(pool); page_pool_uninit(pool);
kfree(pool); kfree(pool);
} }
......
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __PAGE_POOL_PRIV_H
#define __PAGE_POOL_PRIV_H
int page_pool_list(struct page_pool *pool);
void page_pool_unlist(struct page_pool *pool);
#endif
// SPDX-License-Identifier: GPL-2.0
#include <linux/mutex.h>
#include <linux/xarray.h>
#include <net/page_pool/types.h>
#include "page_pool_priv.h"
static DEFINE_XARRAY_FLAGS(page_pools, XA_FLAGS_ALLOC1);
static DEFINE_MUTEX(page_pools_lock);
int page_pool_list(struct page_pool *pool)
{
static u32 id_alloc_next;
int err;
mutex_lock(&page_pools_lock);
err = xa_alloc_cyclic(&page_pools, &pool->user.id, pool, xa_limit_32b,
&id_alloc_next, GFP_KERNEL);
if (err < 0)
goto err_unlock;
mutex_unlock(&page_pools_lock);
return 0;
err_unlock:
mutex_unlock(&page_pools_lock);
return err;
}
void page_pool_unlist(struct page_pool *pool)
{
mutex_lock(&page_pools_lock);
xa_erase(&page_pools, pool->user.id);
mutex_unlock(&page_pools_lock);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment