• Ying Xue's avatar
    tipc: introduce new spinlock to protect struct link_req · f9a2c80b
    Ying Xue authored
    Currently, only 'bearer_lock' is used to protect struct link_req in
    the function disc_timeout(). This is unsafe, since the member fields
    'num_nodes' and 'timer_intv' might be accessed by below three different
    threads simultaneously, none of them grabbing bearer_lock in the
    critical region:
    
    link_activate()
      tipc_bearer_add_dest()
        tipc_disc_add_dest()
          req->num_nodes++;
    
    tipc_link_reset()
      tipc_bearer_remove_dest()
        tipc_disc_remove_dest()
          req->num_nodes--
          disc_update()
            read req->num_nodes
    	write req->timer_intv
    
    disc_timeout()
      read req->num_nodes
      read/write req->timer_intv
    
    Without lock protection, the only symptom of a race is that discovery
    messages occasionally may not be sent out. This is not fatal, since such
    messages are best-effort anyway. On the other hand, since discovery
    messages are not time critical, adding a protecting lock brings no
    serious overhead either. So we add a new, dedicated spinlock in
    order to guarantee absolute data consistency in link_req objects.
    This also helps reduce the overall role of the bearer_lock, which
    we want to remove completely in a later commit series.
    Signed-off-by: default avatarYing Xue <ying.xue@windriver.com>
    Reviewed-by: default avatarPaul Gortmaker <paul.gortmaker@windriver.com>
    Signed-off-by: default avatarJon Maloy <jon.maloy@ericsson.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f9a2c80b
discover.c 11.4 KB