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);
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,
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,
#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;
}
{
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;
{
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)
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;
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;
}
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;
}
{
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;
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;
}
{
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;