• Davide Libenzi's avatar
    epoll: avoid double-inserts in case of EFAULT · 9ce209d6
    Davide Libenzi authored
    In commit f337b9c5 ("epoll: drop
    unnecessary test") Thomas found that there is an unnecessary (always
    true) test in ep_send_events().  The callback never inserts into
    ->rdllink while the send loop is performed, and also does the
    ~EP_PRIVATE_BITS test.  Given we're holding the mutex during this time,
    the conditions tested inside the loop are always true.
    
    HOWEVER.
    
    The test "!ep_is_linked(&epi->rdllink)" wasn't there because we insert
    into ->rdllink, but because the send-events loop might terminate before
    the whole list is scanned (-EFAULT).
    
    In such cases, when the loop terminates early, and when a (leftover)
    file received an event while we're performing the lockless loop, we need
    such test to avoid to double insert the epoll items.  The list_splice()
    done a few steps below, will correctly re-insert the ones that were left
    on "txlist".
    
    This should fix the kenrel.org bugzilla entry 11831.
    Signed-off-by: default avatarDavide Libenzi <davidel@xmailserver.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    9ce209d6
eventpoll.c 36 KB