• Jason Gunthorpe's avatar
    RDMA/cm: Make it clearer how concurrency works in cm_req_handler() · c206f8ba
    Jason Gunthorpe authored
    ib_crate_cm_id() immediately places the id in the xarray, and publishes it
    into the remote_id and remote_qpn rbtrees. This makes it visible to other
    threads before it is fully set up.
    
    It appears the thinking here was that the states IB_CM_IDLE and
    IB_CM_REQ_RCVD do not allow any MAD handler or lookup in the remote_id and
    remote_qpn rbtrees to advance.
    
    However, cm_rej_handler() does take an action on IB_CM_REQ_RCVD, which is
    not really expected by the design.
    
    Make the whole thing clearer:
     - Keep the new cm_id out of the xarray until it is completely set up.
       This directly prevents MAD handlers and all rbtree lookups from seeing
       the pointer.
     - Move all the trivial setup right to the top so it is obviously done
       before any concurrency begins
     - Move the mutation of the cm_id_priv out of cm_match_id() and into the
       caller so the state transition is obvious
     - Place the manipulation of the work_list at the end, under lock, after
       the cm_id is placed in the xarray. The work_count cannot change on an
       ID outside the xarray.
     - Add some comments
    
    Link: https://lore.kernel.org/r/20200310092545.251365-9-leon@kernel.orgSigned-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
    c206f8ba
cm.c 129 KB