Since you changed the size of structure 'struct ibv_cq', does that mean code compiled with OFED 1.1 can not work with OFED 1.2 ?
--CQ > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of > Roland Dreier > Sent: Monday, March 26, 2007 5:17 PM > To: Dotan Barak > Cc: openib-general > Subject: [ofa-general] Re: [PATCH V2 - libibverbs] Added > reference count tocompletion event channels > > OK, I got bored and tried to implement this using a mutex in > the ibv_context structure. How does this (compile tested > only) patch look? > > - R. > > > diff --git a/include/infiniband/verbs.h > b/include/infiniband/verbs.h index 2ae50ab..acc1b82 100644 > --- a/include/infiniband/verbs.h > +++ b/include/infiniband/verbs.h > @@ -573,11 +573,14 @@ struct ibv_qp { > }; > > struct ibv_comp_channel { > + struct ibv_context *context; > int fd; > + int refcnt; > }; > > struct ibv_cq { > struct ibv_context *context; > + struct ibv_comp_channel *channel; > void *cq_context; > uint32_t handle; > int cqe; > @@ -680,12 +683,13 @@ struct ibv_context_ops { }; > > struct ibv_context { > - struct ibv_device *device; > - struct ibv_context_ops ops; > - int cmd_fd; > - int async_fd; > - int num_comp_vectors; > - void *abi_compat; > + struct ibv_device *device; > + struct ibv_context_ops ops; > + int cmd_fd; > + int async_fd; > + int num_comp_vectors; > + pthread_mutex_t mutex; > + void *abi_compat; > }; > > /** > diff --git a/src/cmd.c b/src/cmd.c > index f7d3fde..a0bfaad 100644 > --- a/src/cmd.c > +++ b/src/cmd.c > @@ -75,7 +75,9 @@ static int ibv_cmd_get_context_v2(struct > ibv_context *context, > > context->async_fd = resp->async_fd; > context->num_comp_vectors = 1; > + t->channel.context = context; > t->channel.fd = cq_fd; > + t->channel.refcnt = 0; > context->abi_compat = t; > > return 0; > diff --git a/src/device.c b/src/device.c index bca1ce9..3abc1eb 100644 > --- a/src/device.c > +++ b/src/device.c > @@ -138,6 +138,7 @@ struct ibv_context > *__ibv_open_device(struct ibv_device *device) > > context->device = device; > context->cmd_fd = cmd_fd; > + pthread_mutex_init(&context->mutex, NULL); > > return context; > > diff --git a/src/verbs.c b/src/verbs.c > index 56513e4..5334af1 100644 > --- a/src/verbs.c > +++ b/src/verbs.c > @@ -226,7 +226,9 @@ struct ibv_comp_channel > *ibv_create_comp_channel(struct ibv_context *context) > return NULL; > } > > - channel->fd = resp.fd; > + channel->context = context; > + channel->fd = resp.fd; > + channel->refcnt = 0; > > return channel; > } > @@ -240,23 +242,44 @@ static int > ibv_destroy_comp_channel_v2(struct ibv_comp_channel *channel) > > int ibv_destroy_comp_channel(struct ibv_comp_channel *channel) { > - if (abi_ver <= 2) > - return ibv_destroy_comp_channel_v2(channel); > + int ret; > + > + pthread_mutex_lock(&channel->context->mutex); > + > + if (channel->refcnt) { > + ret = EBUSY; > + goto out; > + } > + > + if (abi_ver <= 2) { > + ret = ibv_destroy_comp_channel_v2(channel); > + goto out; > + } > > close(channel->fd); > free(channel); > + ret = 0; > > - return 0; > +out: > + pthread_mutex_unlock(&channel->context->mutex); > + > + return ret; > } > > struct ibv_cq *__ibv_create_cq(struct ibv_context *context, > int cqe, void *cq_context, > struct ibv_comp_channel > *channel, int comp_vector) { > - struct ibv_cq *cq = context->ops.create_cq(context, > cqe, channel, > - comp_vector); > + struct ibv_cq *cq; > + > + pthread_mutex_lock(&context->mutex); > + > + cq = context->ops.create_cq(context, cqe, channel, comp_vector); > > if (cq) { > cq->context = context; > + cq->channel = channel; > + if (channel) > + ++channel->refcnt; > cq->cq_context = cq_context; > cq->comp_events_completed = 0; > cq->async_events_completed = 0; > @@ -264,6 +287,8 @@ struct ibv_cq *__ibv_create_cq(struct > ibv_context *context, int cqe, void *cq_co > pthread_cond_init(&cq->cond, NULL); > } > > + pthread_mutex_unlock(&context->mutex); > + > return cq; > } > default_symver(__ibv_create_cq, ibv_create_cq); @@ -279,7 > +304,17 @@ default_symver(__ibv_resize_cq, ibv_resize_cq); > > int __ibv_destroy_cq(struct ibv_cq *cq) { > - return cq->context->ops.destroy_cq(cq); > + int ret; > + > + pthread_mutex_lock(&cq->context->mutex); > + > + ret = cq->context->ops.destroy_cq(cq); > + if (cq->channel && !ret) > + --cq->channel->refcnt; > + > + pthread_mutex_unlock(&cq->context->mutex); > + > + return ret; > } > default_symver(__ibv_destroy_cq, ibv_destroy_cq); > > _______________________________________________ > general mailing list > [email protected] > http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general > > To unsubscribe, please visit > http://openib.org/mailman/listinfo/openib-general > _______________________________________________ general mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
