On Thu, Sep 16, 2021 at 01:11:14PM +0800, Mark Zhang wrote: > > @@ -4928,10 +4930,10 @@ static void cma_process_remove(struct cma_device *cma_dev) > > mutex_lock(&lock); > > while (!list_empty(&cma_dev->id_list)) { > > struct rdma_id_private *id_priv = list_first_entry( > > - &cma_dev->id_list, struct rdma_id_private, list); > > + &cma_dev->id_list, struct rdma_id_private, device_item); > > > > - list_del(&id_priv->listen_list); > > - list_del_init(&id_priv->list); > > + list_del_init(&id_priv->listen_item); > > Should it still be > list_del(&id_priv->listen_list); > as it isn't dev_id_priv? Yes, probably should stay here, but it isn't entirely sane The next code block must trigger the list_del or the wait_for_completion() below will block forever. The whole RDMA_CM_EVENT_DEVICE_REMOVAL bit is kind of insane and needs some cleaning. For instance I think it is a bug if any ULP doesn't return 1 from the event. Jason