> From: Roland Dreier <roland@xxxxxxxxxxxxxxx> > > A couple of places in the CM do > > spin_lock_irq(&cm_id_priv->lock); > ... > if (cm_alloc_response_msg(work->port, work->mad_recv_wc, &msg)) > > However when the underlying transport is RoCE, this leads to a > sleeping function being called with the lock held - the callchain is > > cm_alloc_response_msg() -> > ib_create_ah_from_wc() -> > ib_init_ah_from_wc() -> > rdma_addr_find_l2_eth_by_grh() -> > rdma_resolve_ip() > > and rdma_resolve_ip() starts out by doing > > req = kzalloc(sizeof *req, GFP_KERNEL); > > not to mention rdma_addr_find_l2_eth_by_grh() doing > > wait_for_completion(&ctx.comp); > > to wait for the task that rdma_resolve_ip() queues up. > > Fix this by moving the AH creation out of the lock. > > Signed-off-by: Roland Dreier <roland@xxxxxxxxxxxxxxx> Reviewed-by: Sean Hefty <sean.hefty@xxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html