aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Ledford <dledford@redhat.com>2015-09-04 17:11:56 -0400
committerDoug Ledford <dledford@redhat.com>2015-09-04 17:59:37 -0400
commit501b53b30752fe89b3f1c4c60c867f61bdcde013 (patch)
tree17541771dbe181eccf46202c2978bda04efd88c2
parent13de38c439943fe2a61a7787aa8ef925041fc4c3 (diff)
downloadlibibverbs-501b53b30752fe89b3f1c4c60c867f61bdcde013.tar.gz
Fix create/destroy flow API
When adding this API, there had been consensus that having separate lib_* and drv_* function pointers in the extended context struct was not needed and should not be done. However, that snuck in anyway. This backs that out and takes us back to a single pointer for each function, but does so in a way as to preserve both back and forward compatibility. Fixes: 389de6a6ef4e (Add receive flow steering support) Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--include/infiniband/verbs.h25
-rw-r--r--src/device.c22
2 files changed, 24 insertions, 23 deletions
diff --git a/include/infiniband/verbs.h b/include/infiniband/verbs.h
index 28e1586..6100f52 100644
--- a/include/infiniband/verbs.h
+++ b/include/infiniband/verbs.h
@@ -977,14 +977,11 @@ enum verbs_context_mask {
struct verbs_context {
/* "grows up" - new fields go here */
- int (*drv_ibv_destroy_flow) (struct ibv_flow *flow);
- int (*lib_ibv_destroy_flow) (struct ibv_flow *flow);
- struct ibv_flow * (*drv_ibv_create_flow) (struct ibv_qp *qp,
- struct ibv_flow_attr
- *flow_attr);
- struct ibv_flow * (*lib_ibv_create_flow) (struct ibv_qp *qp,
- struct ibv_flow_attr
- *flow_attr);
+ int (*ibv_destroy_flow) (struct ibv_flow *flow);
+ void (*ABI_placeholder2) (void); /* DO NOT COPY THIS GARBAGE */
+ struct ibv_flow * (*ibv_create_flow) (struct ibv_qp *qp,
+ struct ibv_flow_attr *flow_attr);
+ void (*ABI_placeholder1) (void); /* DO NOT COPY THIS GARBAGE */
struct ibv_qp *(*open_qp)(struct ibv_context *context,
struct ibv_qp_open_attr *attr);
struct ibv_qp *(*create_qp_ex)(struct ibv_context *context,
@@ -1137,20 +1134,20 @@ static inline struct ibv_flow *ibv_create_flow(struct ibv_qp *qp,
struct ibv_flow_attr *flow)
{
struct verbs_context *vctx = verbs_get_ctx_op(qp->context,
- lib_ibv_create_flow);
- if (!vctx || !vctx->lib_ibv_create_flow)
+ ibv_create_flow);
+ if (!vctx || !vctx->ibv_create_flow)
return NULL;
- return vctx->lib_ibv_create_flow(qp, flow);
+ return vctx->ibv_create_flow(qp, flow);
}
static inline int ibv_destroy_flow(struct ibv_flow *flow_id)
{
struct verbs_context *vctx = verbs_get_ctx_op(flow_id->context,
- lib_ibv_destroy_flow);
- if (!vctx || !vctx->lib_ibv_destroy_flow)
+ ibv_destroy_flow);
+ if (!vctx || !vctx->ibv_destroy_flow)
return -ENOSYS;
- return vctx->lib_ibv_destroy_flow(flow_id);
+ return vctx->ibv_destroy_flow(flow_id);
}
/**
diff --git a/src/device.c b/src/device.c
index 9642ead..f2b889c 100644
--- a/src/device.c
+++ b/src/device.c
@@ -163,16 +163,20 @@ struct ibv_context *__ibv_open_device(struct ibv_device *device)
ret = verbs_device->init_context(verbs_device, context, cmd_fd);
if (ret)
goto verbs_err;
-
- /* initialize *all* library ops to either lib calls or
- * directly to provider calls.
- * context_ex->lib_new_func1 = __verbs_new_func1;
- * context_ex->lib_new_func2 = __verbs_new_func2;
+ /*
+ * In order to maintain backward/forward binary compatibility
+ * with apps compiled against libibverbs-1.1.8 that use the
+ * flow steering addition, we need to set the two
+ * ABI_placeholder entries to match the driver set flow
+ * entries. This is because apps compiled against
+ * libibverbs-1.1.8 use an inline ibv_create_flow and
+ * ibv_destroy_flow function that looks in the placeholder
+ * spots for the proper entry points. For apps compiled
+ * against libibverbs-1.1.9 and later, the inline functions
+ * will be looking in the right place.
*/
- context_ex->lib_ibv_create_flow =
- context_ex->drv_ibv_create_flow;
- context_ex->lib_ibv_destroy_flow =
- context_ex->drv_ibv_destroy_flow;
+ context_ex->ABI_placeholder1 = (void (*)(void)) context_ex->ibv_create_flow;
+ context_ex->ABI_placeholder2 = (void (*)(void)) context_ex->ibv_destroy_flow;
}
context->device = device;