diff options
author | Doug Ledford <dledford@redhat.com> | 2015-09-04 17:11:56 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2015-09-04 17:59:37 -0400 |
commit | 501b53b30752fe89b3f1c4c60c867f61bdcde013 (patch) | |
tree | 17541771dbe181eccf46202c2978bda04efd88c2 | |
parent | 13de38c439943fe2a61a7787aa8ef925041fc4c3 (diff) | |
download | libibverbs-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.h | 25 | ||||
-rw-r--r-- | src/device.c | 22 |
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; |