HomeFreeBSD

MFC r341532:

Description

MFC r341532:
ibcore: Fix sleeping in atomic when RoCE is used

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.

Linux commit:
c76161181193985087cd716fdf69b5cb6cf9ee85

Sponsored by: Mellanox Technologies

Details

Provenance
hselaskyAuthored on
Parents
rS341876: MFC r341531:
Branches
Unknown
Tags
Unknown