]> git.baikalelectronics.ru Git - kernel.git/commit
aio: fix reqs_available handling
authorBenjamin LaHaise <bcrl@kvack.org>
Sun, 24 Aug 2014 17:14:05 +0000 (13:14 -0400)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 24 Aug 2014 22:47:27 +0000 (15:47 -0700)
commit4663bc366fb524f0afd345f8bc89e2512fbf5767
tree885097a564287bad1cc32039d89501e5a2e8b867
parent276ae7edbce96895bf103dd30f0b2abfa8575ed1
aio: fix reqs_available handling

As reported by Dan Aloni, commit 545312b8ac31 ("aio: fix aio request
leak when events are reaped by userspace") introduces a regression when
user code attempts to perform io_submit() with more events than are
available in the ring buffer.  Reverting that commit would reintroduce a
regression when user space event reaping is used.

Fixing this bug is a bit more involved than the previous attempts to fix
this regression.  Since we do not have a single point at which we can
count events as being reaped by user space and io_getevents(), we have
to track event completion by looking at the number of events left in the
event ring.  So long as there are as many events in the ring buffer as
there have been completion events generate, we cannot call
put_reqs_available().  The code to check for this is now placed in
refill_reqs_available().

A test program from Dan and modified by me for verifying this bug is available
at http://www.kvack.org/~bcrl/20140824-aio_bug.c .

Reported-by: Dan Aloni <dan@kernelim.com>
Signed-off-by: Benjamin LaHaise <bcrl@kvack.org>
Acked-by: Dan Aloni <dan@kernelim.com>
Cc: Kent Overstreet <kmo@daterainc.com>
Cc: Mateusz Guzik <mguzik@redhat.com>
Cc: Petr Matousek <pmatouse@redhat.com>
Cc: stable@vger.kernel.org # v3.16 and anything that 545312b8ac31 was backported to
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/aio.c