net/core/page_pool.c

Source file repositories/reference/linux-study-clean/net/core/page_pool.c

File Facts

System
Linux kernel
Corpus path
net/core/page_pool.c
Extension
.c
Size
37241 bytes
Lines
1353
Domain
Networking Core
Bucket
Sockets, Protocols, Packet Path, And Network Policy
Inferred role
Networking Core: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.

Dependency Surface

Detected Declarations

Annotated Snippet

if (!pool->dma_map || !pool->dma_sync) {
			err = -EOPNOTSUPP;
			goto free_ptr_ring;
		}

		if (WARN_ON(!is_kernel_rodata((unsigned long)pool->mp_ops))) {
			err = -EFAULT;
			goto free_ptr_ring;
		}

		err = pool->mp_ops->init(pool);
		if (err) {
			pr_warn("%s() mem-provider init failed %d\n", __func__,
				err);
			goto free_ptr_ring;
		}

		static_branch_inc(&page_pool_mem_providers);
	} else if (pool->p.order > MAX_PAGE_ORDER) {
		err = -EINVAL;
		goto free_ptr_ring;
	}

	return 0;

free_ptr_ring:
	ptr_ring_cleanup(&pool->ring, NULL);
	xa_destroy(&pool->dma_mapped);
#ifdef CONFIG_PAGE_POOL_STATS
	if (!pool->system)
		free_percpu(pool->recycle_stats);
#endif
	return err;
}

static void page_pool_uninit(struct page_pool *pool)
{
	ptr_ring_cleanup(&pool->ring, NULL);
	xa_destroy(&pool->dma_mapped);

#ifdef CONFIG_PAGE_POOL_STATS
	if (!pool->system)
		free_percpu(pool->recycle_stats);
#endif

	if (pool->mp_ops) {
		pool->mp_ops->destroy(pool);
		static_branch_dec(&page_pool_mem_providers);
	}
}

/**
 * page_pool_create_percpu() - create a page pool for a given cpu.
 * @params: parameters, see struct page_pool_params
 * @cpuid: cpu identifier
 */
struct page_pool *
page_pool_create_percpu(const struct page_pool_params *params, int cpuid)
{
	struct page_pool *pool;
	int err;

	pool = kzalloc_node(sizeof(*pool), GFP_KERNEL, params->nid);
	if (!pool)
		return ERR_PTR(-ENOMEM);

	err = page_pool_init(pool, params, cpuid);
	if (err < 0)
		goto err_free;

	err = page_pool_list(pool);
	if (err)
		goto err_uninit;

	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_percpu);

/**
 * page_pool_create() - create a page pool
 * @params: parameters, see struct page_pool_params
 */
struct page_pool *page_pool_create(const struct page_pool_params *params)

Annotation

Implementation Notes