]> git.ipfire.org Git - people/ms/linux.git/blobdiff - include/rdma/ib_verbs.h
IB/core: Introduce new fast registration API
[people/ms/linux.git] / include / rdma / ib_verbs.h
index 85103aff909bf38631d521ac9e8d9d3061984cc9..065d37c13aa6a67165a8cd084072b123483e45a6 100644 (file)
@@ -738,6 +738,7 @@ enum ib_wc_opcode {
        IB_WC_LSO,
        IB_WC_LOCAL_INV,
        IB_WC_FAST_REG_MR,
+       IB_WC_REG_MR,
        IB_WC_MASKED_COMP_SWAP,
        IB_WC_MASKED_FETCH_ADD,
 /*
@@ -1025,6 +1026,7 @@ enum ib_wr_opcode {
        IB_WR_RDMA_READ_WITH_INV,
        IB_WR_LOCAL_INV,
        IB_WR_FAST_REG_MR,
+       IB_WR_REG_MR,
        IB_WR_MASKED_ATOMIC_CMP_AND_SWP,
        IB_WR_MASKED_ATOMIC_FETCH_AND_ADD,
        IB_WR_BIND_MW,
@@ -1157,6 +1159,18 @@ static inline struct ib_fast_reg_wr *fast_reg_wr(struct ib_send_wr *wr)
        return container_of(wr, struct ib_fast_reg_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;
@@ -1369,6 +1383,9 @@ struct ib_mr {
        struct ib_uobject *uobject;
        u32                lkey;
        u32                rkey;
+       u64                iova;
+       u32                length;
+       unsigned int       page_size;
        atomic_t           usecnt; /* count number of MWs */
 };
 
@@ -1753,6 +1770,9 @@ struct ib_device {
        struct ib_mr *             (*alloc_mr)(struct ib_pd *pd,
                                               enum ib_mr_type mr_type,
                                               u32 max_num_sg);
+       int                        (*map_mr_sg)(struct ib_mr *mr,
+                                               struct scatterlist *sg,
+                                               int sg_nents);
        struct ib_fast_reg_page_list * (*alloc_fast_reg_page_list)(struct ib_device *device,
                                                                   int page_list_len);
        void                       (*free_fast_reg_page_list)(struct ib_fast_reg_page_list *page_list);
@@ -3059,4 +3079,28 @@ struct net_device *ib_get_net_dev_by_params(struct ib_device *dev, u8 port,
                                            u16 pkey, const union ib_gid *gid,
                                            const struct sockaddr *addr);
 
+int ib_map_mr_sg(struct ib_mr *mr,
+                struct scatterlist *sg,
+                int sg_nents,
+                unsigned int page_size);
+
+static inline int
+ib_map_mr_sg_zbva(struct ib_mr *mr,
+                 struct scatterlist *sg,
+                 int sg_nents,
+                 unsigned int page_size)
+{
+       int n;
+
+       n = ib_map_mr_sg(mr, sg, sg_nents, page_size);
+       mr->iova = 0;
+
+       return n;
+}
+
+int ib_sg_to_pages(struct ib_mr *mr,
+                  struct scatterlist *sgl,
+                  int sg_nents,
+                  int (*set_page)(struct ib_mr *, u64));
+
 #endif /* IB_VERBS_H */