[ofa-general] Re: [PATCH V2 - libibverbs] Added reference count tocompletion event channels
Tang, Changqing
changquing.tang at hp.com
Tue Mar 27 06:53:36 PDT 2007
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: general-bounces at lists.openfabrics.org
> [mailto:general-bounces at lists.openfabrics.org] 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
> general at lists.openfabrics.org
> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
>
> To unsubscribe, please visit
> http://openib.org/mailman/listinfo/openib-general
>
More information about the general
mailing list