|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
epoll can acquire multiple ep->mutex on multiple "struct eventpoll"s
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
at once in the case where one epoll fd is monitoring another epoll
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
fd. This is perfectly OK, since we're careful about the lock ordering,
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
but causes spurious lockdep warnings. Annotate the recursion using
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
mutex_lock_nested, and add a comment explaining the nesting rules for
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
good measure.
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
Reported-by: Paul Bolle <pebolle@tiscali.nl>
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
Signed-off-by: Nelson Elhage <nelhage@nelhage.com>
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
---
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
I've tested this on a synthetic epoll test case, that just adds e1 to
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
e2 and then does an epoll_wait(). I verified that it caused lockdep
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
problems on 3.0 and that this patch fixed it, but I haven't done more
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
extensive testing. Paul, are you able to test systemd against this?
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
fs/eventpoll.c | 25 ++++++++++++++++++-------
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
1 files changed, 18 insertions(+), 7 deletions(-)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
index f9cfd16..0cb7bc6 100644
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
--- a/fs/eventpoll.c
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+++ b/fs/eventpoll.c
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
@@ -76,6 +76,15 @@
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
* Events that require holding "epmutex" are very rare, while for
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
* normal operations the epoll private "ep->mtx" will guarantee
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
* a better scalability.
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ * It is possible to acquire multiple "ep->mtx"es at once in the case
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ * when one epoll fd is added to another. In this case, we always
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ * acquire the locks in the order of nesting (i.e. after epoll_ctl(e1,
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ * EPOLL_CTL_ADD, e2), e1->mtx will always be acquired before
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ * e2->mtx). Since we disallow cycles of epoll file descriptors, this
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ * ensures that the mutexes are well-ordered. In order to communicate
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ * this nesting to lockdep, when walking a tree of epoll file
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ * descriptors, we use the current recursion depth as the lockdep
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ * subkey.
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
*/
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
/* Epoll private bits inside the event mask */
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
@@ -464,13 +473,15 @@ static void ep_unregister_pollwait(struct eventpoll *ep, struct epitem *epi)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
* @ep: Pointer to the epoll private data structure.
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
* @sproc: Pointer to the scan callback.
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
* @priv: Private opaque data passed to the @sproc callback.
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ * @depth: The current depth of recursive f_op->poll calls.
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
*
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
* Returns: The same integer error code returned by the @sproc callback.
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
*/
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
static int ep_scan_ready_list(struct eventpoll *ep,
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
int (*sproc)(struct eventpoll *,
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
struct list_head *, void *),
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
- void *priv)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ void *priv,
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ int depth)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
{
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
int error, pwake = 0;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
unsigned long flags;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
@@ -481,7 +492,7 @@ static int ep_scan_ready_list(struct eventpoll *ep,
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
* We need to lock this because we could be hit by
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
* eventpoll_release_file() and epoll_ctl().
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
*/
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
- mutex_lock(&ep->mtx);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ mutex_lock_nested(&ep->mtx, depth);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
/*
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
* Steal the ready list, and re-init the original one to the
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
@@ -670,7 +681,7 @@ static int ep_read_events_proc(struct eventpoll *ep, struct list_head *head,
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
static int ep_poll_readyevents_proc(void *priv, void *cookie, int call_nests)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
{
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
- return ep_scan_ready_list(priv, ep_read_events_proc, NULL);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ return ep_scan_ready_list(priv, ep_read_events_proc, NULL, call_nests + 1);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
}
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
static unsigned int ep_eventpoll_poll(struct file *file, poll_table *wait)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
@@ -737,7 +748,7 @@ void eventpoll_release_file(struct file *file)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
ep = epi->ep;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
list_del_init(&epi->fllink);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
- mutex_lock(&ep->mtx);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ mutex_lock_nested(&ep->mtx, 0);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
ep_remove(ep, epi);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
mutex_unlock(&ep->mtx);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
}
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
@@ -1134,7 +1145,7 @@ static int ep_send_events(struct eventpoll *ep,
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
esed.maxevents = maxevents;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
esed.events = events;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
- return ep_scan_ready_list(ep, ep_send_events_proc, &esed);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ return ep_scan_ready_list(ep, ep_send_events_proc, &esed, 0);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
}
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
static inline struct timespec ep_set_mstimeout(long ms)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
@@ -1267,7 +1278,7 @@ static int ep_loop_check_proc(void *priv, void *cookie, int call_nests)
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
struct rb_node *rbp;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
struct epitem *epi;
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
- mutex_lock(&ep->mtx);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ mutex_lock_nested(&ep->mtx, call_nests + 1);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
for (rbp = rb_first(&ep->rbr); rbp; rbp = rb_next(rbp)) {
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
epi = rb_entry(rbp, struct epitem, rbn);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
if (unlikely(is_file_epoll(epi->ffd.file))) {
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
@@ -1409,7 +1420,7 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd,
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
}
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
- mutex_lock(&ep->mtx);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
+ mutex_lock_nested(&ep->mtx, 0);
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
/*
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
* Try to lookup the file inside our RB tree, Since we grabbed "mtx"
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
--
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
1.7.4.1
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
--
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
the body of a message to majordomo@vger.kernel.org
|
|
![](https://seccdn.libravatar.org/avatar/2b3dd3a56b56c16f6e54c1904578f5f0100d27020cdfbf6479a4e47482e712c0?s=16&d=retro) |
8e3ae98 |
More majordomo info at http://vger.kernel.org/majordomo-info.html
|