• Parthasarathy Bhuvaragan's avatar
    tipc: fix nametbl_lock soft lockup at node/link events · 93f955aa
    Parthasarathy Bhuvaragan authored
    We trigger a soft lockup as we grab nametbl_lock twice if the node
    has a pending node up/down or link up/down event while:
    - we process an incoming named message in tipc_named_rcv() and
      perform an tipc_update_nametbl().
    - we have pending backlog items in the name distributor queue
      during a nametable update using tipc_nametbl_publish() or
      tipc_nametbl_withdraw().
    
    The following are the call chain associated:
    tipc_named_rcv() Grabs nametbl_lock
       tipc_update_nametbl() (publish/withdraw)
         tipc_node_subscribe()/unsubscribe()
           tipc_node_write_unlock()
              << lockup occurs if an outstanding node/link event
                 exits, as we grabs nametbl_lock again >>
    
    tipc_nametbl_withdraw() Grab nametbl_lock
      tipc_named_process_backlog()
        tipc_update_nametbl()
          << rest as above >>
    
    The function tipc_node_write_unlock(), in addition to releasing the
    lock processes the outstanding node/link up/down events. To do this,
    we need to grab the nametbl_lock again leading to the lockup.
    
    In this commit we fix the soft lockup by introducing a fast variant of
    node_unlock(), where we just release the lock. We adapt the
    node_subscribe()/node_unsubscribe() to use the fast variants.
    Reported-and-Tested-by: default avatarJohn Thompson <thompa.atl@gmail.com>
    Acked-by: default avatarYing Xue <ying.xue@windriver.com>
    Acked-by: default avatarJon Maloy <jon.maloy@ericsson.com>
    Signed-off-by: default avatarParthasarathy Bhuvaragan <parthasarathy.bhuvaragan@ericsson.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    93f955aa
node.c 53.6 KB