• Valentin Schneider's avatar
    net: tcp/dccp: prepare for tw_timer un-pinning · b334b924
    Valentin Schneider authored
    The TCP timewait timer is proving to be problematic for setups where
    scheduler CPU isolation is achieved at runtime via cpusets (as opposed to
    statically via isolcpus=domains).
    
    What happens there is a CPU goes through tcp_time_wait(), arming the
    time_wait timer, then gets isolated. TCP_TIMEWAIT_LEN later, the timer
    fires, causing interference for the now-isolated CPU. This is conceptually
    similar to the issue described in commit e02b9312 ("workqueue: Unbind
    kworkers before sending them to exit()")
    
    Move inet_twsk_schedule() to within inet_twsk_hashdance(), with the ehash
    lock held. Expand the lock's critical section from inet_twsk_kill() to
    inet_twsk_deschedule_put(), serializing the scheduling vs descheduling of
    the timer. IOW, this prevents the following race:
    
    			     tcp_time_wait()
    			       inet_twsk_hashdance()
      inet_twsk_deschedule_put()
        del_timer_sync()
    			       inet_twsk_schedule()
    
    Thanks to Paolo Abeni for suggesting to leverage the ehash lock.
    
    This also restores a comment from commit ec94c269 ("tcp/dccp: avoid
    one atomic operation for timewait hashdance") as inet_twsk_hashdance() had
    a "Step 1" and "Step 3" comment, but the "Step 2" had gone missing.
    
    inet_twsk_deschedule_put() now acquires the ehash spinlock to synchronize
    with inet_twsk_hashdance_schedule().
    
    To ease possible regression search, actual un-pin is done in next patch.
    
    Link: https://lore.kernel.org/all/ZPhpfMjSiHVjQkTk@localhost.localdomain/Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarValentin Schneider <vschneid@redhat.com>
    Co-developed-by: default avatarFlorian Westphal <fw@strlen.de>
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b334b924
tcp_minisocks.c 29.1 KB