@@ -144,6 +144,12 @@ int ibv_cmd_rereg_mr(struct ibv_mr *mr, uint32_t flags, void *addr,
size_t cmd_sz, struct ibv_rereg_mr_resp *resp,
size_t resp_sz);
int ibv_cmd_dereg_mr(struct ibv_mr *mr);
+int ibv_cmd_alloc_mw(struct ibv_pd *pd, enum ibv_mw_type type,
+ struct ibv_mw *mw, struct ibv_alloc_mw *cmd,
+ size_t cmd_size,
+ struct ibv_alloc_mw_resp *resp, size_t resp_size);
+int ibv_cmd_dealloc_mw(struct ibv_mw *mw,
+ struct ibv_dealloc_mw *cmd, size_t cmd_size);
int ibv_cmd_create_cq(struct ibv_context *context, int cqe,
struct ibv_comp_channel *channel,
int comp_vector, struct ibv_cq *cq,
@@ -389,6 +389,29 @@ struct ibv_dereg_mr {
__u32 mr_handle;
};
+struct ibv_alloc_mw {
+ __u32 command;
+ __u16 in_words;
+ __u16 out_words;
+ __u64 response;
+ __u32 pd_handle;
+ __u8 mw_type;
+ __u8 reserved[3];
+};
+
+struct ibv_alloc_mw_resp {
+ __u32 mw_handle;
+ __u32 rkey;
+};
+
+struct ibv_dealloc_mw {
+ __u32 command;
+ __u16 in_words;
+ __u16 out_words;
+ __u32 mw_handle;
+ __u32 reserved;
+};
+
struct ibv_create_comp_channel {
__u32 command;
__u16 in_words;
@@ -434,6 +434,8 @@ struct ibv_mw {
struct ibv_context *context;
struct ibv_pd *pd;
uint32_t rkey;
+ uint32_t handle;
+ enum ibv_mw_type type;
};
struct ibv_global_route {
@@ -1240,6 +1242,31 @@ int ibv_rereg_mr(struct ibv_mr *mr, int flags,
int ibv_dereg_mr(struct ibv_mr *mr);
/**
+ * ibv_alloc_mw - Allocate a memory window
+ */
+static inline struct ibv_mw *ibv_alloc_mw(struct ibv_pd *pd,
+ enum ibv_mw_type type)
+{
+ struct ibv_mw *mw;
+
+ if (!pd->context->ops.alloc_mw) {
+ errno = ENOSYS;
+ return NULL;
+ }
+
+ mw = pd->context->ops.alloc_mw(pd, type);
+ return mw;
+}
+
+/**
+ * ibv_dealloc_mw - Free a memory window
+ */
+static inline int ibv_dealloc_mw(struct ibv_mw *mw)
+{
+ return mw->context->ops.dealloc_mw(mw);
+}
+
+/**
* ibv_create_comp_channel - Create a completion event channel
*/
struct ibv_comp_channel *ibv_create_comp_channel(struct ibv_context *context);
@@ -376,6 +376,43 @@ int ibv_cmd_dereg_mr(struct ibv_mr *mr)
return 0;
}
+int ibv_cmd_alloc_mw(struct ibv_pd *pd, enum ibv_mw_type type,
+ struct ibv_mw *mw, struct ibv_alloc_mw *cmd,
+ size_t cmd_size,
+ struct ibv_alloc_mw_resp *resp, size_t resp_size)
+{
+ IBV_INIT_CMD_RESP(cmd, cmd_size, ALLOC_MW, resp, resp_size);
+ cmd->pd_handle = pd->handle;
+ cmd->mw_type = type;
+ memset(cmd->reserved, 0, sizeof(cmd->reserved));
+
+ if (write(pd->context->cmd_fd, cmd, cmd_size) != cmd_size)
+ return errno;
+
+ (void) VALGRIND_MAKE_MEM_DEFINED(resp, resp_size);
+
+ mw->context = pd->context;
+ mw->pd = pd;
+ mw->rkey = resp->rkey;
+ mw->handle = resp->mw_handle;
+ mw->type = type;
+
+ return 0;
+}
+
+int ibv_cmd_dealloc_mw(struct ibv_mw *mw,
+ struct ibv_dealloc_mw *cmd, size_t cmd_size)
+{
+ IBV_INIT_CMD(cmd, cmd_size, DEALLOC_MW);
+ cmd->mw_handle = mw->handle;
+ cmd->reserved = 0;
+
+ if (write(mw->context->cmd_fd, cmd, cmd_size) != cmd_size)
+ return errno;
+
+ return 0;
+}
+
int ibv_cmd_create_cq(struct ibv_context *context, int cqe,
struct ibv_comp_channel *channel,
int comp_vector, struct ibv_cq *cq,
@@ -102,6 +102,9 @@ IBVERBS_1.1 {
ibv_event_type_str;
ibv_wc_status_str;
+ ibv_cmd_alloc_mw;
+ ibv_cmd_dealloc_mw;
+
ibv_rate_to_mbps;
mbps_to_ibv_rate;
Add alloc/dealloc Memory Window verbs, those verbs are used by both MW types one and two. Signed-off-by: Yishai Hadas <yishaih@mellanox.com> --- include/infiniband/driver.h | 6 ++++++ include/infiniband/kern-abi.h | 23 +++++++++++++++++++++++ include/infiniband/verbs.h | 27 +++++++++++++++++++++++++++ src/cmd.c | 37 +++++++++++++++++++++++++++++++++++++ src/libibverbs.map | 3 +++ 5 files changed, 96 insertions(+)