The code has some minor problems:

Roland Dreier wrote:
 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);
here you try to unlock the mutex, but the channel is no longer allocated ...
+
+       return ret;
 }
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);
1) I believe that the cq->context->ops.destroy_cq(cq) free the memory which was allocated to the CQ,
   so the decrease of refcnt and the mutex_unlock causes memory violations
2) optimization suggestion: the mutex should be locked/unlocked only if channel is being used


thanks for finding the time for implement the patch
Dotan
_______________________________________________
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

Reply via email to