diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-27 09:12:36 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-27 09:12:36 -0700 |
commit | c0fe5dcb91f75204e34f63269ea72b913b0923d1 (patch) | |
tree | 0e7cf0df48f172f99b65bb152b0cbfff3c5636a1 /fs | |
parent | 68e370289c29e3beac99d59c6d840d470af9dfcf (diff) | |
parent | 4ce97dbf50245227add17c83d87dc838e7ca79d0 (diff) | |
download | op-kernel-dev-c0fe5dcb91f75204e34f63269ea72b913b0923d1.zip op-kernel-dev-c0fe5dcb91f75204e34f63269ea72b913b0923d1.tar.gz |
Merge tag 'trace-fixes-v3.17-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
Pull trace buffer epoll hang fix from Steven Rostedt:
"Josef Bacik found a bug in the ring_buffer_poll_wait() where the
condition variable (waiters_pending) was set before being added to the
poll queue via poll_wait(). This allowed for a small race window to
happen where an event could come in, check the condition variable see
it set to true, clear it, and then wake all the waiters. But because
the waiter set the variable before adding itself to the queue, the
waker could have cleared the variable after it was set and then miss
waking it up as it wasn't added to the queue yet.
Discussing this bug, we realized that a memory barrier needed to be
added too, for the rare case that something polls for a single trace
event to happen (and just one, no more to come in), and miss the
wakeup due to memory ordering. Ideally, a memory barrier needs to be
added on the writer side too, but as that will kill tracing
performance and this is for a situation that tracing wasn't even
designed for (who traces one instance of an event, use a printk
instead!), this isn't worth adding the barrier. But we can in the
future add the barrier for when the buffer goes from empty to the
first event, as that would cover this case"
* tag 'trace-fixes-v3.17-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
trace: Fix epoll hang when we race with new entries
Diffstat (limited to 'fs')
0 files changed, 0 insertions, 0 deletions