From 9293e042782df38434191de8f3703fe2cb808ad6 Mon Sep 17 00:00:00 2001 From: Md Haris Iqbal Date: Wed, 7 Jan 2026 17:15:10 +0100 Subject: [PATCH] RDMA/rtrs: Add optional support for IB_MR_TYPE_SG_GAPS Support IB_MR_TYPE_SG_GAPS, which has less limitations than standard IB_MR_TYPE_MEM_REG, a few ULP support this. Signed-off-by: Md Haris Iqbal Signed-off-by: Kim Zhu Signed-off-by: Jack Wang Signed-off-by: Grzegorz Prajsner Link: https://patch.msgid.link/20260107161517.56357-4-haris.iqbal@ionos.com Signed-off-by: Leon Romanovsky --- drivers/infiniband/ulp/rtrs/rtrs-clt.c | 10 ++++++++-- drivers/infiniband/ulp/rtrs/rtrs-srv.c | 13 ++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c index ee7d505ff016c..58042d835045f 100644 --- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c +++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c @@ -1359,7 +1359,9 @@ static void free_path_reqs(struct rtrs_clt_path *clt_path) static int alloc_path_reqs(struct rtrs_clt_path *clt_path) { + struct ib_device *ib_dev = clt_path->s.dev->ib_dev; struct rtrs_clt_io_req *req; + enum ib_mr_type mr_type; int i, err = -ENOMEM; clt_path->reqs = kcalloc(clt_path->queue_depth, @@ -1368,6 +1370,11 @@ static int alloc_path_reqs(struct rtrs_clt_path *clt_path) if (!clt_path->reqs) return -ENOMEM; + if (ib_dev->attrs.kernel_cap_flags & IBK_SG_GAPS_REG) + mr_type = IB_MR_TYPE_SG_GAPS; + else + mr_type = IB_MR_TYPE_MEM_REG; + for (i = 0; i < clt_path->queue_depth; ++i) { req = &clt_path->reqs[i]; req->iu = rtrs_iu_alloc(1, clt_path->max_hdr_size, GFP_KERNEL, @@ -1381,8 +1388,7 @@ static int alloc_path_reqs(struct rtrs_clt_path *clt_path) if (!req->sge) goto out; - req->mr = ib_alloc_mr(clt_path->s.dev->ib_pd, - IB_MR_TYPE_MEM_REG, + req->mr = ib_alloc_mr(clt_path->s.dev->ib_pd, mr_type, clt_path->max_pages_per_mr); if (IS_ERR(req->mr)) { err = PTR_ERR(req->mr); diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c index be44fd1b9944c..7ed8910ef7f5a 100644 --- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c +++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c @@ -562,13 +562,15 @@ static void unmap_cont_bufs(struct rtrs_srv_path *srv_path) static int map_cont_bufs(struct rtrs_srv_path *srv_path) { + struct ib_device *ib_dev = srv_path->s.dev->ib_dev; struct rtrs_srv_sess *srv = srv_path->srv; struct rtrs_path *ss = &srv_path->s; int i, err, mrs_num; unsigned int chunk_bits; + enum ib_mr_type mr_type; int chunks_per_mr = 1; - struct ib_mr *mr; struct sg_table *sgt; + struct ib_mr *mr; /* * Here we map queue_depth chunks to MR. Firstly we have to @@ -617,8 +619,13 @@ static int map_cont_bufs(struct rtrs_srv_path *srv_path) err = -EINVAL; goto free_sg; } - mr = ib_alloc_mr(srv_path->s.dev->ib_pd, IB_MR_TYPE_MEM_REG, - nr_sgt); + + if (ib_dev->attrs.kernel_cap_flags & IBK_SG_GAPS_REG) + mr_type = IB_MR_TYPE_SG_GAPS; + else + mr_type = IB_MR_TYPE_MEM_REG; + + mr = ib_alloc_mr(srv_path->s.dev->ib_pd, mr_type, nr_sgt); if (IS_ERR(mr)) { err = PTR_ERR(mr); goto unmap_sg; -- 2.47.3