aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Dreier <roland@topspin.com>2005-06-21 21:27:34 +0000
committerRoland Dreier <rolandd@cisco.com>2006-11-09 11:35:56 -0800
commitf05ba1df99c676bd5ba4c50d0e8b85fae76ea8e2 (patch)
tree7586831e7b060fd80101a617aa25705a4b2c096d
parent52d61d7989ae1633318d5ac593ac7a58e9108787 (diff)
downloadlibibverbs-f05ba1df99c676bd5ba4c50d0e8b85fae76ea8e2.tar.gz
Update for kernel ABI changes
Update userspace verbs libraries to match kernel ABI changes (required for using "struct ib_udata *" interface). Signed-off-by: Roland Dreier <roland@topspin.com>
-rw-r--r--include/infiniband/driver.h9
-rw-r--r--include/infiniband/kern-abi.h3
-rw-r--r--src/cmd.c45
-rw-r--r--src/device.c2
-rw-r--r--src/ibverbs.h4
5 files changed, 34 insertions, 29 deletions
diff --git a/include/infiniband/driver.h b/include/infiniband/driver.h
index ed96cdb..40f660d 100644
--- a/include/infiniband/driver.h
+++ b/include/infiniband/driver.h
@@ -65,7 +65,8 @@
typedef struct ibv_device *(*ibv_driver_init_func)(struct sysfs_class_device *);
extern int ibv_cmd_get_context(int num_comp, struct ibv_context *context,
- struct ibv_get_context *cmd, size_t cmd_size);
+ struct ibv_get_context *cmd, size_t cmd_size,
+ struct ibv_get_context_resp *resp, size_t resp_size);
extern int ibv_cmd_query_device(struct ibv_context *context,
struct ibv_device_attr *device_attr,
struct ibv_query_device *cmd, size_t cmd_size);
@@ -77,7 +78,8 @@ extern int ibv_cmd_query_gid(struct ibv_context *context, uint8_t port_num,
extern int ibv_cmd_query_pkey(struct ibv_context *context, uint8_t port_num,
int index, uint16_t *pkey);
extern int ibv_cmd_alloc_pd(struct ibv_context *context, struct ibv_pd *pd,
- struct ibv_alloc_pd *cmd, size_t cmd_size);
+ struct ibv_alloc_pd *cmd, size_t cmd_size,
+ struct ibv_alloc_pd_resp *resp, size_t resp_size);
extern int ibv_cmd_dealloc_pd(struct ibv_pd *pd);
extern int ibv_cmd_reg_mr(struct ibv_pd *pd, void *addr, size_t length,
uint64_t hca_va, enum ibv_access_flags access,
@@ -86,7 +88,8 @@ extern int ibv_cmd_reg_mr(struct ibv_pd *pd, void *addr, size_t length,
extern int ibv_cmd_dereg_mr(struct ibv_mr *mr);
extern int ibv_cmd_create_cq(struct ibv_context *context, int cqe,
struct ibv_cq *cq,
- struct ibv_create_cq *cmd, size_t cmd_size);
+ struct ibv_create_cq *cmd, size_t cmd_size,
+ struct ibv_create_cq_resp *resp, size_t resp_size);
extern int ibv_cmd_destroy_cq(struct ibv_cq *cq);
extern int ibv_cmd_create_qp(struct ibv_pd *pd,
diff --git a/include/infiniband/kern-abi.h b/include/infiniband/kern-abi.h
index cf76ec8..f314233 100644
--- a/include/infiniband/kern-abi.h
+++ b/include/infiniband/kern-abi.h
@@ -128,12 +128,13 @@ struct ibv_get_context {
__u16 in_words;
__u16 out_words;
__u64 response;
+ __u64 cq_fd_tab;
__u64 driver_data[0];
};
struct ibv_get_context_resp {
__u32 async_fd;
- __u32 cq_fd[1];
+ __u32 reserved;
};
struct ibv_query_device {
diff --git a/src/cmd.c b/src/cmd.c
index 14f4c7c..35b36e4 100644
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -44,20 +44,23 @@
#include "ibverbs.h"
int ibv_cmd_get_context(int num_comp, struct ibv_context *context,
- struct ibv_get_context *cmd, size_t cmd_size)
+ struct ibv_get_context *cmd, size_t cmd_size,
+ struct ibv_get_context_resp *resp, size_t resp_size)
{
- struct ibv_get_context_resp *resp;
+ uint32_t *cq_fd_tab;
int i;
- resp = alloca(sizeof *resp + num_comp * sizeof (int));
- IBV_INIT_CMD_RESP(cmd, cmd_size, GET_CONTEXT, resp);
+ cq_fd_tab = alloca(num_comp * sizeof (uint32_t));
+ IBV_INIT_CMD_RESP(cmd, cmd_size, GET_CONTEXT, resp, resp_size);
+
+ cmd->cq_fd_tab = (uintptr_t) cq_fd_tab;
if (write(context->cmd_fd, cmd, cmd_size) != cmd_size)
return errno;
context->async_fd = resp->async_fd;
for (i = 0; i < num_comp; ++i)
- context->cq_fd[i] = resp->cq_fd[i];
+ context->cq_fd[i] = cq_fd_tab[i];
return 0;
}
@@ -68,7 +71,7 @@ int ibv_cmd_query_device(struct ibv_context *context,
{
struct ibv_query_device_resp resp;
- IBV_INIT_CMD_RESP(cmd, cmd_size, QUERY_DEVICE, &resp);
+ IBV_INIT_CMD_RESP(cmd, cmd_size, QUERY_DEVICE, &resp, sizeof resp);
if (write(context->cmd_fd, cmd, cmd_size) != cmd_size)
return errno;
@@ -123,7 +126,7 @@ int ibv_cmd_query_port(struct ibv_context *context, uint8_t port_num,
{
struct ibv_query_port_resp resp;
- IBV_INIT_CMD_RESP(cmd, cmd_size, QUERY_PORT, &resp);
+ IBV_INIT_CMD_RESP(cmd, cmd_size, QUERY_PORT, &resp, sizeof resp);
cmd->port_num = port_num;
if (write(context->cmd_fd, cmd, cmd_size) != cmd_size)
@@ -158,7 +161,7 @@ int ibv_cmd_query_gid(struct ibv_context *context, uint8_t port_num,
struct ibv_query_gid cmd;
struct ibv_query_gid_resp resp;
- IBV_INIT_CMD_RESP(&cmd, sizeof cmd, QUERY_GID, &resp);
+ IBV_INIT_CMD_RESP(&cmd, sizeof cmd, QUERY_GID, &resp, sizeof resp);
cmd.port_num = port_num;
cmd.index = index;
@@ -176,7 +179,7 @@ int ibv_cmd_query_pkey(struct ibv_context *context, uint8_t port_num,
struct ibv_query_pkey cmd;
struct ibv_query_pkey_resp resp;
- IBV_INIT_CMD_RESP(&cmd, sizeof cmd, QUERY_PKEY, &resp);
+ IBV_INIT_CMD_RESP(&cmd, sizeof cmd, QUERY_PKEY, &resp, sizeof resp);
cmd.port_num = port_num;
cmd.index = index;
@@ -189,16 +192,15 @@ int ibv_cmd_query_pkey(struct ibv_context *context, uint8_t port_num,
}
int ibv_cmd_alloc_pd(struct ibv_context *context, struct ibv_pd *pd,
- struct ibv_alloc_pd *cmd, size_t cmd_size)
+ struct ibv_alloc_pd *cmd, size_t cmd_size,
+ struct ibv_alloc_pd_resp *resp, size_t resp_size)
{
- struct ibv_alloc_pd_resp resp;
-
- IBV_INIT_CMD_RESP(cmd, cmd_size, ALLOC_PD, &resp);
+ IBV_INIT_CMD_RESP(cmd, cmd_size, ALLOC_PD, resp, resp_size);
if (write(context->cmd_fd, cmd, cmd_size) != cmd_size)
return errno;
- pd->handle = resp.pd_handle;
+ pd->handle = resp->pd_handle;
return 0;
}
@@ -223,7 +225,7 @@ int ibv_cmd_reg_mr(struct ibv_pd *pd, void *addr, size_t length,
{
struct ibv_reg_mr_resp resp;
- IBV_INIT_CMD_RESP(cmd, cmd_size, REG_MR, &resp);
+ IBV_INIT_CMD_RESP(cmd, cmd_size, REG_MR, &resp, sizeof resp);
cmd->start = (uintptr_t) addr;
cmd->length = length;
@@ -256,19 +258,18 @@ int ibv_cmd_dereg_mr(struct ibv_mr *mr)
int ibv_cmd_create_cq(struct ibv_context *context, int cqe,
struct ibv_cq *cq,
- struct ibv_create_cq *cmd, size_t cmd_size)
+ struct ibv_create_cq *cmd, size_t cmd_size,
+ struct ibv_create_cq_resp *resp, size_t resp_size)
{
- struct ibv_create_cq_resp resp;
-
- IBV_INIT_CMD_RESP(cmd, cmd_size, CREATE_CQ, &resp);
+ IBV_INIT_CMD_RESP(cmd, cmd_size, CREATE_CQ, resp, resp_size);
cmd->user_handle = (uintptr_t) cq;
cmd->cqe = cqe;
if (write(context->cmd_fd, cmd, cmd_size) != cmd_size)
return errno;
- cq->handle = resp.cq_handle;
- cq->cqe = resp.cqe;
+ cq->handle = resp->cq_handle;
+ cq->cqe = resp->cqe;
return 0;
}
@@ -292,7 +293,7 @@ int ibv_cmd_create_qp(struct ibv_pd *pd,
{
struct ibv_create_qp_resp resp;
- IBV_INIT_CMD_RESP(cmd, cmd_size, CREATE_QP, &resp);
+ IBV_INIT_CMD_RESP(cmd, cmd_size, CREATE_QP, &resp, sizeof resp);
cmd->user_handle = (uintptr_t) qp;
cmd->pd_handle = pd->handle;
cmd->send_cq_handle = attr->send_cq->handle;
diff --git a/src/device.c b/src/device.c
index 3b38b85..be16ea8 100644
--- a/src/device.c
+++ b/src/device.c
@@ -94,7 +94,7 @@ struct ibv_context *ibv_open_device(struct ibv_device *device)
if (cmd_fd < 0)
return NULL;
- IBV_INIT_CMD_RESP(&cmd, sizeof cmd, QUERY_PARAMS, &resp);
+ IBV_INIT_CMD_RESP(&cmd, sizeof cmd, QUERY_PARAMS, &resp, sizeof resp);
if (write(cmd_fd, &cmd, sizeof cmd) != sizeof cmd)
goto err;
diff --git a/src/ibverbs.h b/src/ibverbs.h
index 0d0fec1..1f754f3 100644
--- a/src/ibverbs.h
+++ b/src/ibverbs.h
@@ -63,11 +63,11 @@ extern int ibv_unlock_range(void *base, size_t size);
(cmd)->out_words = 0; \
} while (0)
-#define IBV_INIT_CMD_RESP(cmd, size, opcode, out) \
+#define IBV_INIT_CMD_RESP(cmd, size, opcode, out, outsize) \
do { \
(cmd)->command = IB_USER_VERBS_CMD_##opcode; \
(cmd)->in_words = (size) / 4; \
- (cmd)->out_words = sizeof (*(out)) / 4; \
+ (cmd)->out_words = (outsize) / 4; \
(cmd)->response = (uintptr_t) (out); \
} while (0)