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