FYI, this is the API I'd aim for (only SRP and no HW driver converted yet):
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index 0e21367..7ea695c 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c @@ -1484,14 +1484,15 @@ EXPORT_SYMBOL(ib_check_mr_status); int ib_map_mr_sg(struct ib_mr *mr, struct scatterlist *sg, int sg_nents, - unsigned int page_size) + unsigned int page_size, + unsigned int flags) { if (unlikely(!mr->device->map_mr_sg)) return -ENOSYS; mr->page_size = page_size; - return mr->device->map_mr_sg(mr, sg, sg_nents); + return mr->device->map_mr_sg(mr, sg, sg_nents, flags); } EXPORT_SYMBOL(ib_map_mr_sg); diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 62b6cba..d77a5b4 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c @@ -1314,7 +1314,6 @@ static int srp_map_finish_fr(struct srp_map_state *state, struct srp_target_port *target = ch->target; struct srp_device *dev = target->srp_host->srp_dev; struct ib_send_wr *bad_wr; - struct ib_reg_wr wr; struct srp_fr_desc *desc; u32 rkey; int n, err; @@ -1342,20 +1341,17 @@ static int srp_map_finish_fr(struct srp_map_state *state, ib_update_fast_reg_key(desc->mr, rkey); n = ib_map_mr_sg(desc->mr, state->sg, state->sg_nents, - dev->mr_page_size); + dev->mr_page_size, + /* + * XXX: add a bool write argument to this function, + * so that we only need to open up the required + * permissions. + */ + IB_MR_REMOTE | IB_MR_RDMA_READ | IB_MR_RDMA_WRITE); if (unlikely(n < 0)) return n; - wr.wr.next = NULL; - wr.wr.opcode = IB_WR_REG_MR; - wr.wr.wr_id = FAST_REG_WR_ID_MASK; - wr.wr.num_sge = 0; - wr.wr.send_flags = 0; - wr.mr = desc->mr; - wr.key = desc->mr->rkey; - wr.access = (IB_ACCESS_LOCAL_WRITE | - IB_ACCESS_REMOTE_READ | - IB_ACCESS_REMOTE_WRITE); + desc->mr->wr.wr_id = FAST_REG_WR_ID_MASK; *state->fr.next++ = desc; state->nmdesc++; @@ -1363,7 +1359,7 @@ static int srp_map_finish_fr(struct srp_map_state *state, srp_map_desc(state, desc->mr->iova, desc->mr->length, desc->mr->rkey); - err = ib_post_send(ch->qp, &wr.wr, &bad_wr); + err = ib_post_send(ch->qp, &desc->mr->wr, &bad_wr); if (unlikely(err)) return err; diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 83d6ee8..b168b3a 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -1105,18 +1105,6 @@ static inline struct ib_ud_wr *ud_wr(struct ib_send_wr *wr) return container_of(wr, struct ib_ud_wr, wr); } -struct ib_reg_wr { - struct ib_send_wr wr; - struct ib_mr *mr; - u32 key; - int access; -}; - -static inline struct ib_reg_wr *reg_wr(struct ib_send_wr *wr) -{ - return container_of(wr, struct ib_reg_wr, wr); -} - struct ib_bind_mw_wr { struct ib_send_wr wr; struct ib_mw *mw; @@ -1314,7 +1302,18 @@ struct ib_qp { enum ib_qp_type qp_type; }; +enum ib_mr_flags { + /* scope: either remote or local */ + IB_MR_REMOTE, + IB_MR_LOCAL, + + /* direction: one or both can be ORed into the scope above */ + IB_MR_RDMA_READ = (1 << 10), + IB_MR_RDMA_WRITE = (1 << 11) +}; + struct ib_mr { + struct ib_send_wr wr; struct ib_device *device; struct ib_pd *pd; struct ib_uobject *uobject; @@ -1326,6 +1325,11 @@ struct ib_mr { atomic_t usecnt; /* count number of MWs */ }; +static inline struct ib_mr *wr_to_mr(struct ib_send_wr *wr) +{ + return container_of(wr, struct ib_mr, wr); +} + struct ib_mw { struct ib_device *device; struct ib_pd *pd; @@ -1706,7 +1710,8 @@ struct ib_device { u32 max_num_sg); int (*map_mr_sg)(struct ib_mr *mr, struct scatterlist *sg, - int sg_nents); + int sg_nents, + unsigned int flags); int (*rereg_phys_mr)(struct ib_mr *mr, int mr_rereg_mask, struct ib_pd *pd, @@ -3022,17 +3027,19 @@ struct net_device *ib_get_net_dev_by_params(struct ib_device *dev, u8 port, int ib_map_mr_sg(struct ib_mr *mr, struct scatterlist *sg, int sg_nents, - unsigned int page_size); + unsigned int page_size, + unsigned int flags); static inline int ib_map_mr_sg_zbva(struct ib_mr *mr, struct scatterlist *sg, int sg_nents, - unsigned int page_size) + unsigned int page_size, + unsigned int flags) { int n; - n = ib_map_mr_sg(mr, sg, sg_nents, page_size); + n = ib_map_mr_sg(mr, sg, sg_nents, page_size, flags); mr->iova = 0; return n; -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html