summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDean Luick <dean.luick@cornelisnetworks.com>2026-03-09 23:44:59 +0300
committerLeon Romanovsky <leon@kernel.org>2026-03-11 22:17:28 +0300
commit6be4ca0ab3a2363a850787079f2342d41d377487 (patch)
tree05e201062a2cbe4da3509aa0c9334854bd6beb5c
parent0fed679e0862b3abd706041be3cc7620318fbee8 (diff)
downloadlinux-6be4ca0ab3a2363a850787079f2342d41d377487.tar.xz
RDMA/rdmavt: Add driver mmap callback
Add a reserved range and a driver callback to allow the driver to have custom mmaps. Generated mmap offsets are cookies and are not related to the size of the mmap. Advance the mmap offset by the minimum, PAGE_SIZE, rather than the size of the mmap. Signed-off-by: Dean Luick <dean.luick@cornelisnetworks.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com> Link: https://patch.msgid.link/177308909972.1279894.15543003811821875042.stgit@awdrv-04.cornelisnetworks.com Signed-off-by: Leon Romanovsky <leon@kernel.org>
-rw-r--r--drivers/infiniband/sw/rdmavt/mmap.c22
-rw-r--r--include/rdma/rdma_vt.h3
2 files changed, 20 insertions, 5 deletions
diff --git a/drivers/infiniband/sw/rdmavt/mmap.c b/drivers/infiniband/sw/rdmavt/mmap.c
index 46e3b3e0643a..473f464f33fa 100644
--- a/drivers/infiniband/sw/rdmavt/mmap.c
+++ b/drivers/infiniband/sw/rdmavt/mmap.c
@@ -9,6 +9,11 @@
#include <rdma/uverbs_ioctl.h>
#include "mmap.h"
+/* number of reserved mmaps for the driver */
+#define MMAP_RESERVED 256
+/* start point for dynamic offsets */
+#define MMAP_OFFSET_START (MMAP_RESERVED * PAGE_SIZE)
+
/**
* rvt_mmap_init - init link list and lock for mem map
* @rdi: rvt dev struct
@@ -17,7 +22,7 @@ void rvt_mmap_init(struct rvt_dev_info *rdi)
{
INIT_LIST_HEAD(&rdi->pending_mmaps);
spin_lock_init(&rdi->pending_lock);
- rdi->mmap_offset = PAGE_SIZE;
+ rdi->mmap_offset = MMAP_OFFSET_START;
spin_lock_init(&rdi->mmap_offset_lock);
}
@@ -73,6 +78,13 @@ int rvt_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
struct rvt_mmap_info *ip, *pp;
int ret = -EINVAL;
+ /* call driver if in reserved range */
+ if (offset < MMAP_OFFSET_START) {
+ if (rdi->driver_f.mmap)
+ return rdi->driver_f.mmap(context, vma);
+ return -EINVAL;
+ }
+
/*
* Search the device's list of objects waiting for a mmap call.
* Normally, this list is very short since a call to create a
@@ -129,9 +141,9 @@ struct rvt_mmap_info *rvt_create_mmap_info(struct rvt_dev_info *rdi, u32 size,
spin_lock_irq(&rdi->mmap_offset_lock);
if (rdi->mmap_offset == 0)
- rdi->mmap_offset = ALIGN(PAGE_SIZE, SHMLBA);
+ rdi->mmap_offset = MMAP_OFFSET_START;
ip->offset = rdi->mmap_offset;
- rdi->mmap_offset += ALIGN(size, SHMLBA);
+ rdi->mmap_offset += PAGE_SIZE;
spin_unlock_irq(&rdi->mmap_offset_lock);
INIT_LIST_HEAD(&ip->pending_mmaps);
@@ -159,9 +171,9 @@ void rvt_update_mmap_info(struct rvt_dev_info *rdi, struct rvt_mmap_info *ip,
spin_lock_irq(&rdi->mmap_offset_lock);
if (rdi->mmap_offset == 0)
- rdi->mmap_offset = PAGE_SIZE;
+ rdi->mmap_offset = MMAP_OFFSET_START;
ip->offset = rdi->mmap_offset;
- rdi->mmap_offset += size;
+ rdi->mmap_offset += PAGE_SIZE;
spin_unlock_irq(&rdi->mmap_offset_lock);
ip->size = size;
diff --git a/include/rdma/rdma_vt.h b/include/rdma/rdma_vt.h
index 8671c6da16bb..7d8de561f71b 100644
--- a/include/rdma/rdma_vt.h
+++ b/include/rdma/rdma_vt.h
@@ -366,6 +366,9 @@ struct rvt_driver_provided {
/* deallocate a ucontext */
void (*dealloc_ucontext)(struct ib_ucontext *context);
+
+ /* driver mmap */
+ int (*mmap)(struct ib_ucontext *context, struct vm_area_struct *vma);
};
struct rvt_dev_info {