providers/erdma: Allocate CQ buffer with mmap
[ Upstream commit 1d44ad6dbbda13066c4d0d3d64bce512b8884f5e ]
ibv_dontfork_range() and ibv_dofork_range() operate on page-rounded
ranges. Use mmap() for the CQ buffer so the fork advice is applied to a
separate page-aligned mapping.
mmap() also returns zeroed memory, so remove the explicit memset().
Fixes: 235333a1d072 ("providers/erdma: Add userspace verbs implementation")
Signed-off-by: Cheng Xu <chengyou@linux.alibaba.com>
Signed-off-by: Nicolas Morey <nmorey@suse.com>
diff --git a/providers/erdma/erdma_verbs.c b/providers/erdma/erdma_verbs.c
index 2190e9f..b868692 100644
--- a/providers/erdma/erdma_verbs.c
+++ b/providers/erdma/erdma_verbs.c
@@ -176,25 +176,23 @@
num_cqe = 64;
num_cqe = roundup_pow_of_two(num_cqe);
- cq_size = align(num_cqe * sizeof(struct erdma_cqe), ERDMA_PAGE_SIZE);
+ cq_size = align(num_cqe * sizeof(struct erdma_cqe), ectx->page_size);
- rv = posix_memalign((void **)&cq->queue, ERDMA_PAGE_SIZE, cq_size);
- if (rv) {
- errno = rv;
+ cq->qbuf_size = cq_size;
+ cq->queue = mmap(NULL, cq->qbuf_size, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (cq->queue == MAP_FAILED) {
free(cq);
return NULL;
}
- rv = ibv_dontfork_range(cq->queue, cq_size);
+ rv = ibv_dontfork_range(cq->queue, cq->qbuf_size);
if (rv) {
- free(cq->queue);
+ munmap(cq->queue, cq->qbuf_size);
cq->queue = NULL;
goto error_alloc;
}
- memset(cq->queue, 0, cq_size);
- cq->qbuf_size = cq_size;
-
db_records = erdma_alloc_dbrecords(ectx);
if (!db_records) {
errno = ENOMEM;
@@ -235,8 +233,8 @@
erdma_dealloc_dbrecords(ectx, db_records);
if (cq->queue) {
- ibv_dofork_range(cq->queue, cq_size);
- free(cq->queue);
+ ibv_dofork_range(cq->queue, cq->qbuf_size);
+ munmap(cq->queue, cq->qbuf_size);
}
free(cq);
@@ -264,7 +262,7 @@
if (cq->queue) {
ibv_dofork_range(cq->queue, cq->qbuf_size);
- free(cq->queue);
+ munmap(cq->queue, cq->qbuf_size);
}
free(cq);