• Roland Dreier's avatar
    IB/cm: Fix sleeping in atomic when RoCE is used · c7616118
    Roland Dreier authored
    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: default avatarRoland Dreier <roland@purestorage.com>
    Reviewed-by: default avatarSean Hefty <sean.hefty@intel.com>
    Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
    c7616118
cm.c 122 KB