Hi Max- > On Mar 17, 2020, at 9:40 AM, Max Gurtovoy <maxg@xxxxxxxxxxxx> wrote: > > In some cases, e.g. when using ib_alloc_cq_any, one would like to know > the completion vector that eventually assigned to the CQ. Cache this > value during CQ creation. I'm confused by the mention of the ib_alloc_cq_any() API here. Is your design somehow dependent on the way the current ib_alloc_cq_any() selects comp_vectors? The contract for _any() is that it is an API for callers that simply do not care about what comp_vector is chosen. There's no guarantee that the _any() comp_vector allocator will continue to use round-robin in the future, for instance. If you want to guarantee that there is an SRQ for each comp_vector and a comp_vector for each SRQ, stick with a CQ allocation API that enables explicit selection of the comp_vector value, and cache that value in the caller, not in the core data structures. > Signed-off-by: Max Gurtovoy <maxg@xxxxxxxxxxxx> > --- > drivers/infiniband/core/cq.c | 1 + > include/rdma/ib_verbs.h | 1 + > 2 files changed, 2 insertions(+) > > diff --git a/drivers/infiniband/core/cq.c b/drivers/infiniband/core/cq.c > index 4f25b24..a7cbf52 100644 > --- a/drivers/infiniband/core/cq.c > +++ b/drivers/infiniband/core/cq.c > @@ -217,6 +217,7 @@ struct ib_cq *__ib_alloc_cq_user(struct ib_device *dev, void *private, > cq->device = dev; > cq->cq_context = private; > cq->poll_ctx = poll_ctx; > + cq->comp_vector = comp_vector; > atomic_set(&cq->usecnt, 0); > > cq->wc = kmalloc_array(IB_POLL_BATCH, sizeof(*cq->wc), GFP_KERNEL); > diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h > index fc8207d..0d61772 100644 > --- a/include/rdma/ib_verbs.h > +++ b/include/rdma/ib_verbs.h > @@ -1558,6 +1558,7 @@ struct ib_cq { > struct ib_device *device; > struct ib_ucq_object *uobject; > ib_comp_handler comp_handler; > + u32 comp_vector; > void (*event_handler)(struct ib_event *, void *); > void *cq_context; > int cqe; > -- > 1.8.3.1 > -- Chuck Lever chucklever@xxxxxxxxx