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