Hi Sean,
> I don't think that this will work. The issue is that we need to walk a
list of
> IDs associated with a particular device to notify the user that the
device is
> being removed. While we're doing that, the user could try to destroy
the ID,
> which removes the ID from the device list.
>
> The original code takes a reference on the ID before removing it from
the from
> cma_dev's list to ensure that the ID will be valid while we process it.
The
> remove list ensures that the user is only notified once of a device
removal.
> (We don't know where the thread calling rdma_destroy_id() is at.)
Yes, you are right - I missed the parallel rdma_destroy_id's. How about
something
like this then (it is cleaner than dropping/re-getting locks) :
mutex_lock(&lock);
while (!list_empty(&cma_dev->id_list)) {
id_priv = list_entry(cma_dev->id_list.next,
struct rdma_id_private, list);
if (cma_internal_listen(id_priv)) {
cma_destroy_listen(id_priv);
} else {
atomic_inc(&id_priv->refcount);
list_del(&id_priv->list);
list_add_tail(&id_priv->list, &remove_list);
}
}
mutex_unlock(&lock);
list_for_each_entry_safe(id_priv, tmp, &remove_list, list) {
ret = cma_remove_id_dev(id_priv);
cma_deref_id(id_priv);
if (ret)
rdma_destroy_id(&id_priv->id);
}
thanks,
- KK
_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general
To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general