Al Viro fe0a916c1e epoll: EPOLL_CTL_ADD: close the race in decision to take fast path
Checking for the lack of epitems refering to the epoll we want to insert into
is not enough; we might have an insertion of that epoll into another one that
has already collected the set of files to recheck for excessive reverse paths,
but hasn't gotten to creating/inserting the epitem for it.

However, any such insertion in progress can be detected - it will update the
generation count in our epoll when it's done looking through it for files
to check.  That gets done under ->mtx of our epoll and that allows us to
detect that safely.

We are *not* holding epmutex here, so the generation count is not stable.
However, since both the update of ep->gen by loop check and (later)
insertion into ->f_ep_link are done with ep->mtx held, we are fine -
the sequence is
	grab epmutex
	bump loop_check_gen
	...
	grab tep->mtx		// 1
	tep->gen = loop_check_gen
	...
	drop tep->mtx		// 2
	...
	grab tep->mtx		// 3
	...
	insert into ->f_ep_link
	...
	drop tep->mtx		// 4
	bump loop_check_gen
	drop epmutex
and if the fastpath check in another thread happens for that
eventpoll, it can come
	* before (1) - in that case fastpath is just fine
	* after (4) - we'll see non-empty ->f_ep_link, slow path
taken
	* between (2) and (3) - loop_check_gen is stable,
with ->mtx providing barriers and we end up taking slow path.

Note that ->f_ep_link emptiness check is slightly racy - we are protected
against insertions into that list, but removals can happen right under us.
Not a problem - in the worst case we'll end up taking a slow path for
no good reason.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2020-09-10 17:14:44 -04:00
..
2020-08-13 12:26:18 -07:00
2020-08-06 19:44:25 -07:00
2020-08-06 19:22:51 -07:00
2020-08-06 19:35:12 -07:00
2020-08-10 18:33:22 -07:00
2020-08-11 14:34:17 -07:00
2020-08-10 18:22:43 -07:00
2020-08-15 08:26:55 -07:00
2020-08-09 13:58:04 -07:00
\n
2020-08-06 19:28:26 -07:00
\n
2020-08-06 19:28:26 -07:00
2020-06-05 14:05:57 -07:00
\n
2020-08-06 19:28:26 -07:00
2020-08-13 12:22:19 -07:00
2020-08-11 17:42:24 +09:00
2020-07-27 14:29:23 -04:00
2020-08-03 13:01:22 -07:00
2020-08-03 11:57:03 -07:00
2020-05-14 16:44:25 +02:00
2020-02-07 14:48:35 -05:00
2020-08-04 21:02:38 -04:00
2020-06-05 16:26:36 -07:00
2020-07-25 09:47:44 -06:00
2020-07-31 08:16:01 +02:00
2020-08-07 11:33:24 -07:00
2020-08-09 13:58:04 -07:00
2020-07-31 08:17:51 +02:00
2020-05-14 16:44:24 +02:00
2020-08-12 10:58:01 -07:00
2020-07-31 08:16:00 +02:00
2020-06-02 19:45:12 -07:00
2020-06-09 15:40:50 -07:00
2020-07-31 08:16:01 +02:00