Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

epoll: avoid double-inserts in case of EFAULT

In commit f337b9c58332bdecde965b436e47ea4c94d30da0 ("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: Davide Libenzi <davidel@xmailserver.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Davide Libenzi and committed by
Linus Torvalds
9ce209d6 4d36a9e6

+9 -2
+9 -2
fs/eventpoll.c
··· 930 930 * inside the main ready-list here. 931 931 */ 932 932 for (nepi = ep->ovflist; (epi = nepi) != NULL; 933 - nepi = epi->next, epi->next = EP_UNACTIVE_PTR) 934 - list_add_tail(&epi->rdllink, &ep->rdllist); 933 + nepi = epi->next, epi->next = EP_UNACTIVE_PTR) { 934 + /* 935 + * If the above loop quit with errors, the epoll item might still 936 + * be linked to "txlist", and the list_splice() done below will 937 + * take care of those cases. 938 + */ 939 + if (!ep_is_linked(&epi->rdllink)) 940 + list_add_tail(&epi->rdllink, &ep->rdllist); 941 + } 935 942 /* 936 943 * We need to set back ep->ovflist to EP_UNACTIVE_PTR, so that after 937 944 * releasing the lock, events will be queued in the normal way inside