Skip to content
  • Jason Baron's avatar
    epoll: do not take the nested ep->mtx on EPOLL_CTL_DEL · 4ff36ee9
    Jason Baron authored
    The EPOLL_CTL_DEL path of epoll contains a classic, ab-ba deadlock.
    That is, epoll_ctl(a, EPOLL_CTL_DEL, b, x), will deadlock with
    epoll_ctl(b, EPOLL_CTL_DEL, a, x).  The deadlock was introduced with
    commmit 67347fe4
    
     ("epoll: do not take global 'epmutex' for simple
    topologies").
    
    The acquistion of the ep->mtx for the destination 'ep' was added such
    that a concurrent EPOLL_CTL_ADD operation would see the correct state of
    the ep (Specifically, the check for '!list_empty(&f.file->f_ep_links')
    
    However, by simply not acquiring the lock, we do not serialize behind
    the ep->mtx from the add path, and thus may perform a full path check
    when if we had waited a little longer it may not have been necessary.
    However, this is a transient state, and performing the full loop
    checking in this case is not harmful.
    
    The important point is that we wouldn't miss doing the full loop
    checking when required, since EPOLL_CTL_ADD always locks any 'ep's that
    its operating upon.  The reason we don't need to do lock ordering in the
    add path, is that we are already are holding the global 'epmutex'
    whenever we do the double lock.  Further, the original posting of this
    patch, which was tested for the intended performance gains, did not
    perform this additional locking.
    
    Signed-off-by: default avatarJason Baron <jbaron@akamai.com>
    Cc: Nathan Zimmer <nzimmer@sgi.com>
    Cc: Eric Wong <normalperson@yhbt.net>
    Cc: Nelson Elhage <nelhage@nelhage.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Davide Libenzi <davidel@xmailserver.org>
    Cc: "Paul E. McKenney" <paulmck@us.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    4ff36ee9