• P
    lockdep: annotate epoll · 0ccf831c
    Peter Zijlstra 提交于
    On Sat, 2008-01-05 at 13:35 -0800, Davide Libenzi wrote:
    
    > I remember I talked with Arjan about this time ago. Basically, since 1)
    > you can drop an epoll fd inside another epoll fd 2) callback-based wakeups
    > are used, you can see a wake_up() from inside another wake_up(), but they
    > will never refer to the same lock instance.
    > Think about:
    >
    > 	dfd = socket(...);
    > 	efd1 = epoll_create();
    > 	efd2 = epoll_create();
    > 	epoll_ctl(efd1, EPOLL_CTL_ADD, dfd, ...);
    > 	epoll_ctl(efd2, EPOLL_CTL_ADD, efd1, ...);
    >
    > When a packet arrives to the device underneath "dfd", the net code will
    > issue a wake_up() on its poll wake list. Epoll (efd1) has installed a
    > callback wakeup entry on that queue, and the wake_up() performed by the
    > "dfd" net code will end up in ep_poll_callback(). At this point epoll
    > (efd1) notices that it may have some event ready, so it needs to wake up
    > the waiters on its poll wait list (efd2). So it calls ep_poll_safewake()
    > that ends up in another wake_up(), after having checked about the
    > recursion constraints. That are, no more than EP_MAX_POLLWAKE_NESTS, to
    > avoid stack blasting. Never hit the same queue, to avoid loops like:
    >
    > 	epoll_ctl(efd2, EPOLL_CTL_ADD, efd1, ...);
    > 	epoll_ctl(efd3, EPOLL_CTL_ADD, efd2, ...);
    > 	epoll_ctl(efd4, EPOLL_CTL_ADD, efd3, ...);
    > 	epoll_ctl(efd1, EPOLL_CTL_ADD, efd4, ...);
    >
    > The code "if (tncur->wq == wq || ..." prevents re-entering the same
    > queue/lock.
    
    Since the epoll code is very careful to not nest same instance locks
    allow the recursion.
    Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
    Tested-by: NStefan Richter <stefanr@s5r6.in-berlin.de>
    Acked-by: NDavide Libenzi <davidel@xmailserver.org>
    Cc: <stable@kernel.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    0ccf831c
wait.h 15.7 KB