On Fri, Nov 06, 2020 at 05:01:21PM -0600, Bob Pearson wrote: > @@ -171,6 +197,10 @@ struct rxe_alloc_context_resp { > __aligned_u64 driver_cap; > }; > > +struct rxe_create_cq_cmd { > + __aligned_u64 is_ex; > +}; would be cleaer to call this 'wc_format' or something more specific; u8 wc_format u8 reserved[7] Is fine > @@ -210,15 +352,129 @@ static struct ibv_cq *rxe_create_cq(struct ibv_context *context, int cqe, > cq->queue = mmap(NULL, resp.mi.size, PROT_READ | PROT_WRITE, MAP_SHARED, > context->cmd_fd, resp.mi.offset); > if ((void *)cq->queue == MAP_FAILED) { > - ibv_cmd_destroy_cq(&cq->ibv_cq); > + ibv_cmd_destroy_cq(&cq->vcq.cq); > + free(cq); > + return NULL; > + } > + > + cq->wc_size = 1ULL << cq->queue->log2_elem_size; > + > + if (cq->wc_size < sizeof(struct ib_uverbs_wc)) { > + fprintf(stderr, "cq wc size too small %ld need %ld\n", > + cq->wc_size, sizeof(struct ib_uverbs_wc)); No prints like this in libraries Seems reasonable other wise Jason