net/core/hwbm.c

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

File Facts

System
Linux kernel
Corpus path
net/core/hwbm.c
Extension
.c
Size
1926 bytes
Lines
86
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 (bm_pool->construct(bm_pool, buf)) {
			hwbm_buf_free(bm_pool, buf);
			return -ENOMEM;
		}

	return 0;
}
EXPORT_SYMBOL_GPL(hwbm_pool_refill);

int hwbm_pool_add(struct hwbm_pool *bm_pool, unsigned int buf_num)
{
	int err, i;

	mutex_lock(&bm_pool->buf_lock);
	if (bm_pool->buf_num == bm_pool->size) {
		pr_warn("pool already filled\n");
		mutex_unlock(&bm_pool->buf_lock);
		return bm_pool->buf_num;
	}

	if (buf_num + bm_pool->buf_num > bm_pool->size) {
		pr_warn("cannot allocate %d buffers for pool\n",
			buf_num);
		mutex_unlock(&bm_pool->buf_lock);
		return 0;
	}

	if ((buf_num + bm_pool->buf_num) < bm_pool->buf_num) {
		pr_warn("Adding %d buffers to the %d current buffers will overflow\n",
			buf_num,  bm_pool->buf_num);
		mutex_unlock(&bm_pool->buf_lock);
		return 0;
	}

	for (i = 0; i < buf_num; i++) {
		err = hwbm_pool_refill(bm_pool, GFP_KERNEL);
		if (err < 0)
			break;
	}

	/* Update BM driver with number of buffers added to pool */
	bm_pool->buf_num += i;

	pr_debug("hwpm pool: %d of %d buffers added\n", i, buf_num);
	mutex_unlock(&bm_pool->buf_lock);

	return i;
}
EXPORT_SYMBOL_GPL(hwbm_pool_add);

Annotation

Implementation Notes