xref: /linux/net/core/page_pool_user.c (revision f17c69649c698e4df3cfe0010b7bbf142dec3e40)
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 }
37