@@ -1864,12 +1864,12 @@ static int ib_spec_to_kern_spec(struct ibv_flow_spec *ib_spec,
return 0;
}
-struct ibv_flow *ibv_cmd_create_flow(struct ibv_qp *qp,
- struct ibv_flow_attr *flow_attr)
+int ibv_cmd_create_flow(struct ibv_qp *qp,
+ struct ibv_flow *flow_id,
+ struct ibv_flow_attr *flow_attr)
{
struct ibv_create_flow *cmd;
struct ibv_create_flow_resp resp;
- struct ibv_flow *flow_id;
size_t cmd_size;
size_t written_size;
int i, err;
@@ -1879,9 +1879,6 @@ struct ibv_flow *ibv_cmd_create_flow(struct ibv_qp *qp,
cmd_size = sizeof(*cmd) + (flow_attr->num_of_specs *
sizeof(struct ibv_kern_spec));
cmd = alloca(cmd_size);
- flow_id = malloc(sizeof(*flow_id));
- if (!flow_id)
- return NULL;
memset(cmd, 0, cmd_size);
cmd->qp_handle = qp->handle;
@@ -1916,10 +1913,9 @@ struct ibv_flow *ibv_cmd_create_flow(struct ibv_qp *qp,
flow_id->context = qp->context;
flow_id->handle = resp.flow_handle;
- return flow_id;
+ return 0;
err:
- free(flow_id);
- return NULL;
+ return errno;
}
int ibv_cmd_destroy_flow(struct ibv_flow *flow_id)
@@ -1933,7 +1929,6 @@ int ibv_cmd_destroy_flow(struct ibv_flow *flow_id)
if (write(flow_id->context->cmd_fd, &cmd, sizeof(cmd)) != sizeof(cmd))
ret = errno;
- free(flow_id);
return ret;
}
@@ -355,7 +355,8 @@ int ibv_cmd_destroy_ah(struct ibv_ah *ah);
int ibv_cmd_attach_mcast(struct ibv_qp *qp, const union ibv_gid *gid, uint16_t lid);
int ibv_cmd_detach_mcast(struct ibv_qp *qp, const union ibv_gid *gid, uint16_t lid);
-struct ibv_flow *ibv_cmd_create_flow(struct ibv_qp *qp,
+int ibv_cmd_create_flow(struct ibv_qp *qp,
+ struct ibv_flow *flow_id,
struct ibv_flow_attr *flow_attr);
int ibv_cmd_destroy_flow(struct ibv_flow *flow_id);
int ibv_cmd_create_wq(struct ibv_context *context,
@@ -246,8 +246,8 @@ static int mlx4_init_context(struct verbs_device *v_device,
verbs_set_ctx_op(verbs_ctx, get_srq_num, verbs_get_srq_num);
verbs_set_ctx_op(verbs_ctx, create_qp_ex, mlx4_create_qp_ex);
verbs_set_ctx_op(verbs_ctx, open_qp, mlx4_open_qp);
- verbs_set_ctx_op(verbs_ctx, ibv_create_flow, ibv_cmd_create_flow);
- verbs_set_ctx_op(verbs_ctx, ibv_destroy_flow, ibv_cmd_destroy_flow);
+ verbs_set_ctx_op(verbs_ctx, ibv_create_flow, mlx4_create_flow);
+ verbs_set_ctx_op(verbs_ctx, ibv_destroy_flow, mlx4_destroy_flow);
verbs_set_ctx_op(verbs_ctx, create_cq_ex, mlx4_create_cq_ex);
verbs_set_ctx_op(verbs_ctx, query_device_ex, mlx4_query_device_ex);
verbs_set_ctx_op(verbs_ctx, query_rt_values, mlx4_query_rt_values);
@@ -424,5 +424,7 @@ struct ibv_rwq_ind_table *mlx4_create_rwq_ind_table(struct ibv_context *context,
int mlx4_destroy_rwq_ind_table(struct ibv_rwq_ind_table *rwq_ind_table);
int mlx4_post_wq_recv(struct ibv_wq *ibwq, struct ibv_recv_wr *wr,
struct ibv_recv_wr **bad_wr);
+struct ibv_flow *mlx4_create_flow(struct ibv_qp *qp, struct ibv_flow_attr *flow_attr);
+int mlx4_destroy_flow(struct ibv_flow *flow_id);
#endif /* MLX4_H */
@@ -1519,6 +1519,36 @@ int mlx4_modify_wq(struct ibv_wq *ibwq, struct ibv_wq_attr *attr)
return ret;
}
+struct ibv_flow *mlx4_create_flow(struct ibv_qp *qp, struct ibv_flow_attr *flow_attr)
+{
+ struct ibv_flow *flow_id;
+ int ret;
+
+ flow_id = calloc(1, sizeof *flow_id);
+ if (!flow_id)
+ return NULL;
+
+ ret = ibv_cmd_create_flow(qp, flow_id, flow_attr);
+ if (!ret)
+ return flow_id;
+
+ free(flow_id);
+ return NULL;
+}
+
+int mlx4_destroy_flow(struct ibv_flow *flow_id)
+{
+ int ret;
+
+ ret = ibv_cmd_destroy_flow(flow_id);
+
+ if (ret)
+ return ret;
+
+ free(flow_id);
+ return 0;
+}
+
int mlx4_destroy_wq(struct ibv_wq *ibwq)
{
struct mlx4_context *mcontext = to_mctx(ibwq->context);
@@ -1000,8 +1000,8 @@ static int mlx5_init_context(struct verbs_device *vdev,
verbs_set_ctx_op(v_ctx, get_srq_num, mlx5_get_srq_num);
verbs_set_ctx_op(v_ctx, query_device_ex, mlx5_query_device_ex);
verbs_set_ctx_op(v_ctx, query_rt_values, mlx5_query_rt_values);
- verbs_set_ctx_op(v_ctx, ibv_create_flow, ibv_cmd_create_flow);
- verbs_set_ctx_op(v_ctx, ibv_destroy_flow, ibv_cmd_destroy_flow);
+ verbs_set_ctx_op(v_ctx, ibv_create_flow, mlx5_create_flow);
+ verbs_set_ctx_op(v_ctx, ibv_destroy_flow, mlx5_destroy_flow);
verbs_set_ctx_op(v_ctx, create_cq_ex, mlx5_create_cq_ex);
verbs_set_ctx_op(v_ctx, create_wq, mlx5_create_wq);
verbs_set_ctx_op(v_ctx, modify_wq, mlx5_modify_wq);
@@ -745,6 +745,8 @@ int mlx5_destroy_wq(struct ibv_wq *wq);
struct ibv_rwq_ind_table *mlx5_create_rwq_ind_table(struct ibv_context *context,
struct ibv_rwq_ind_table_init_attr *init_attr);
int mlx5_destroy_rwq_ind_table(struct ibv_rwq_ind_table *rwq_ind_table);
+struct ibv_flow *mlx5_create_flow(struct ibv_qp *qp, struct ibv_flow_attr *flow_attr);
+int mlx5_destroy_flow(struct ibv_flow *flow_id);
struct ibv_srq *mlx5_create_srq_ex(struct ibv_context *context,
struct ibv_srq_init_attr_ex *attr);
int mlx5_post_srq_ops(struct ibv_srq *srq,
@@ -2325,6 +2325,35 @@ int mlx5_destroy_wq(struct ibv_wq *wq)
return 0;
}
+struct ibv_flow *mlx5_create_flow(struct ibv_qp *qp, struct ibv_flow_attr *flow_attr)
+{
+ struct ibv_flow *flow_id;
+ int ret;
+
+ flow_id = calloc(1, sizeof *flow_id);
+ if (!flow_id)
+ return NULL;
+
+ ret = ibv_cmd_create_flow(qp, flow_id, flow_attr);
+ if (!ret)
+ return flow_id;
+
+ free(flow_id);
+ return NULL;
+}
+
+int mlx5_destroy_flow(struct ibv_flow *flow_id)
+{
+ int ret;
+
+ ret = ibv_cmd_destroy_flow(flow_id);
+ if (ret)
+ return ret;
+
+ free(flow_id);
+ return 0;
+}
+
struct ibv_rwq_ind_table *mlx5_create_rwq_ind_table(struct ibv_context *context,
struct ibv_rwq_ind_table_init_attr *init_attr)
{
This patch aligns ibv_cmd_create/destroy_flow with creation/destruction of other objects as of QP/CQ/SRQ,etc. The above APIs expect to issue the commands with the kernel but not to make the allocation/destruction of ibv_flow. This is the logic for other objects around. This change enables in the following patch some specific mlx4 handling around cleanup on fatal in the destroy flow. Note: The change is done in one patch which involves verbs and providers as done in the kernel in such cases when an internal API is changed. Signed-off-by: Yishai Hadas <yishaih@mellanox.com> --- libibverbs/cmd.c | 15 +++++---------- libibverbs/driver.h | 3 ++- providers/mlx4/mlx4.c | 4 ++-- providers/mlx4/mlx4.h | 2 ++ providers/mlx4/verbs.c | 30 ++++++++++++++++++++++++++++++ providers/mlx5/mlx5.c | 4 ++-- providers/mlx5/mlx5.h | 2 ++ providers/mlx5/verbs.c | 29 +++++++++++++++++++++++++++++ 8 files changed, 74 insertions(+), 15 deletions(-)