--- x/drivers/infiniband/core/ucma.c +++ y/drivers/infiniband/core/ucma.c @@ -272,8 +272,24 @@ static struct ucma_event *ucma_create_ue case RDMA_CM_EVENT_MULTICAST_ERROR: uevent->mc = (struct ucma_multicast *) event->param.ud.private_data; - uevent->resp.uid = uevent->mc->uid; - uevent->resp.id = uevent->mc->id; + do { + struct ucma_multicast *mc; + int err = 1; + + xa_lock(&multicast_table); + list_for_each_entry(mc, &ctx->mc_list, list) + if (mc == uevent->mc) { + uevent->resp.uid = uevent->mc->uid; + uevent->resp.id = uevent->mc->id; + err = 0; + break; + } + xa_unlock(&multicast_table); + if (err) { + kfree(uevent); + return NULL; + } + } while (0); break; default: uevent->resp.uid = ctx->uid;