• Ian Lance Taylor's avatar
    runtime: release timersLock while running timer · 2d8c1995
    Ian Lance Taylor authored
    Dan Scales pointed out a theoretical deadlock in the runtime.
    
    The timer code runs timer functions while holding the timers lock for a P.
    The scavenger queues up a timer function that calls wakeScavenger,
    which acquires the scavenger lock.
    
    The scavengeSleep function acquires the scavenger lock,
    then calls resetTimer which can call addInitializedTimer
    which acquires the timers lock for the current P.
    
    So there is a potential deadlock, in that the scavenger lock and
    the timers lock for some P may both be acquired in different order.
    It's not clear to me whether this deadlock can ever actually occur.
    
    Issue 35532 describes another possible deadlock.
    
    The pollSetDeadline function acquires pd.lock for some poll descriptor,
    and in some cases calls resettimer which can in some cases acquire
    the timers lock for the current P.
    
    The timer code runs timer functions while holding the timers lock for a P.
    The timer function for poll descriptors winds up in netpolldeadlineimpl
    which acquires pd.lock.
    
    So again there is a potential deadlock, in that the pd lock for some
    poll descriptor and the timers lock for some P may both be acquired in
    different order. I think this can happen if we change the deadline
    for a network connection exactly as the former deadline expires.
    
    Looking at the code, I don't see any reason why we have to hold
    the timers lock while running a timer function.
    This CL implements that change.
    
    Updates #6239
    Updates #27707
    Fixes #35532
    
    Change-Id: I17792f5a0120e01ea07cf1b2de8434d5c10704dd
    Reviewed-on: https://go-review.googlesource.com/c/go/+/207348
    Run-TryBot: Ian Lance Taylor <iant@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarMichael Knyszek <mknyszek@google.com>
    2d8c1995
proc.go 150 KB