Skip to content

Commit f17c696

Browse files
kuba-mooPaolo Abeni
authored andcommitted
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: Ilias Apalodimas <[email protected]> Reviewed-by: Eric Dumazet <[email protected]> Acked-by: Jesper Dangaard Brouer <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]> Reviewed-by: Shakeel Butt <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent 23cfaf6 commit f17c696

File tree

5 files changed

+66
-6
lines changed

5 files changed

+66
-6
lines changed

include/net/page_pool/types.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,10 @@ struct page_pool {
187187

188188
/* Slow/Control-path information follows */
189189
struct page_pool_params_slow slow;
190+
/* User-facing fields, protected by page_pools_lock */
191+
struct {
192+
u32 id;
193+
} user;
190194
};
191195

192196
struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp);

net/core/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ obj-y += dev.o dev_addr_lists.o dst.o netevent.o \
1818
obj-$(CONFIG_NETDEV_ADDR_LIST_TEST) += dev_addr_lists_test.o
1919

2020
obj-y += net-sysfs.o
21-
obj-$(CONFIG_PAGE_POOL) += page_pool.o
21+
obj-$(CONFIG_PAGE_POOL) += page_pool.o page_pool_user.o
2222
obj-$(CONFIG_PROC_FS) += net-procfs.o
2323
obj-$(CONFIG_NET_PKTGEN) += pktgen.o
2424
obj-$(CONFIG_NETPOLL) += netpoll.o

net/core/page_pool.c

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
#include <trace/events/page_pool.h>
2525

26+
#include "page_pool_priv.h"
27+
2628
#define DEFER_TIME (msecs_to_jiffies(1000))
2729
#define DEFER_WARN_INTERVAL (60 * HZ)
2830

@@ -264,13 +266,21 @@ struct page_pool *page_pool_create(const struct page_pool_params *params)
264266
return ERR_PTR(-ENOMEM);
265267

266268
err = page_pool_init(pool, params);
267-
if (err < 0) {
268-
pr_warn("%s() gave up with errno %d\n", __func__, err);
269-
kfree(pool);
270-
return ERR_PTR(err);
271-
}
269+
if (err < 0)
270+
goto err_free;
271+
272+
err = page_pool_list(pool);
273+
if (err)
274+
goto err_uninit;
272275

273276
return pool;
277+
278+
err_uninit:
279+
page_pool_uninit(pool);
280+
err_free:
281+
pr_warn("%s() gave up with errno %d\n", __func__, err);
282+
kfree(pool);
283+
return ERR_PTR(err);
274284
}
275285
EXPORT_SYMBOL(page_pool_create);
276286

@@ -833,6 +843,7 @@ static void __page_pool_destroy(struct page_pool *pool)
833843
if (pool->disconnect)
834844
pool->disconnect(pool);
835845

846+
page_pool_unlist(pool);
836847
page_pool_uninit(pool);
837848
kfree(pool);
838849
}

net/core/page_pool_priv.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
3+
#ifndef __PAGE_POOL_PRIV_H
4+
#define __PAGE_POOL_PRIV_H
5+
6+
int page_pool_list(struct page_pool *pool);
7+
void page_pool_unlist(struct page_pool *pool);
8+
9+
#endif

net/core/page_pool_user.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
3+
#include <linux/mutex.h>
4+
#include <linux/xarray.h>
5+
#include <net/page_pool/types.h>
6+
7+
#include "page_pool_priv.h"
8+
9+
static DEFINE_XARRAY_FLAGS(page_pools, XA_FLAGS_ALLOC1);
10+
static DEFINE_MUTEX(page_pools_lock);
11+
12+
int page_pool_list(struct page_pool *pool)
13+
{
14+
static u32 id_alloc_next;
15+
int err;
16+
17+
mutex_lock(&page_pools_lock);
18+
err = xa_alloc_cyclic(&page_pools, &pool->user.id, pool, xa_limit_32b,
19+
&id_alloc_next, GFP_KERNEL);
20+
if (err < 0)
21+
goto err_unlock;
22+
23+
mutex_unlock(&page_pools_lock);
24+
return 0;
25+
26+
err_unlock:
27+
mutex_unlock(&page_pools_lock);
28+
return err;
29+
}
30+
31+
void page_pool_unlist(struct page_pool *pool)
32+
{
33+
mutex_lock(&page_pools_lock);
34+
xa_erase(&page_pools, pool->user.id);
35+
mutex_unlock(&page_pools_lock);
36+
}

0 commit comments

Comments
 (0)