Revision d856f32a86b2b015ab180ab7a55e455ed8d3ccc5 authored by Benjamin LaHaise on 24 August 2014, 17:14:05 UTC, committed by Linus Torvalds on 24 August 2014, 22:47:27 UTC
As reported by Dan Aloni, commit f8567a3845ac ("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 f8567a3845ac was backported to
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 451fd72
History
File Mode Size
fonts
lz4
lzo
mpi
raid6
reed_solomon
xz
zlib_deflate
zlib_inflate
.gitignore -rw-r--r-- 70 bytes
Kconfig -rw-r--r-- 11.6 KB
Kconfig.debug -rw-r--r-- 56.8 KB
Kconfig.kgdb -rw-r--r-- 3.1 KB
Kconfig.kmemcheck -rw-r--r-- 2.9 KB
Makefile -rw-r--r-- 6.0 KB
argv_split.c -rw-r--r-- 2.1 KB
asn1_decoder.c -rw-r--r-- 12.4 KB
assoc_array.c -rw-r--r-- 52.5 KB
atomic64.c -rw-r--r-- 4.2 KB
atomic64_test.c -rw-r--r-- 3.4 KB
audit.c -rw-r--r-- 1.7 KB
average.c -rw-r--r-- 1.9 KB
bcd.c -rw-r--r-- 261 bytes
bch.c -rw-r--r-- 35.6 KB
bitmap.c -rw-r--r-- 35.1 KB
bitrev.c -rw-r--r-- 2.1 KB
bsearch.c -rw-r--r-- 1.6 KB
btree.c -rw-r--r-- 19.3 KB
bug.c -rw-r--r-- 4.7 KB
build_OID_registry -rwxr-xr-x 4.7 KB
bust_spinlocks.c -rw-r--r-- 660 bytes
check_signature.c -rw-r--r-- 599 bytes
checksum.c -rw-r--r-- 4.9 KB
clz_ctz.c -rw-r--r-- 1.3 KB
clz_tab.c -rw-r--r-- 855 bytes
cmdline.c -rw-r--r-- 3.5 KB
compat_audit.c -rw-r--r-- 796 bytes
cordic.c -rw-r--r-- 2.5 KB
cpu-notifier-error-inject.c -rw-r--r-- 1.2 KB
cpu_rmap.c -rw-r--r-- 7.8 KB
cpumask.c -rw-r--r-- 5.8 KB
crc-ccitt.c -rw-r--r-- 3.0 KB
crc-itu-t.c -rw-r--r-- 2.8 KB
crc-t10dif.c -rw-r--r-- 1.5 KB
crc16.c -rw-r--r-- 2.8 KB
crc32.c -rw-r--r-- 45.4 KB
crc32defs.h -rw-r--r-- 2.0 KB
crc7.c -rw-r--r-- 2.6 KB
crc8.c -rw-r--r-- 2.4 KB
ctype.c -rw-r--r-- 1.4 KB
debug_locks.c -rw-r--r-- 1.2 KB
debugobjects.c -rw-r--r-- 26.1 KB
dec_and_lock.c -rw-r--r-- 784 bytes
decompress.c -rw-r--r-- 1.6 KB
decompress_bunzip2.c -rw-r--r-- 23.4 KB
decompress_inflate.c -rw-r--r-- 3.8 KB
decompress_unlz4.c -rw-r--r-- 4.1 KB
decompress_unlzma.c -rw-r--r-- 15.8 KB
decompress_unlzo.c -rw-r--r-- 6.8 KB
decompress_unxz.c -rw-r--r-- 10.6 KB
devres.c -rw-r--r-- 9.4 KB
digsig.c -rw-r--r-- 5.5 KB
div64.c -rw-r--r-- 4.0 KB
dma-debug.c -rw-r--r-- 41.4 KB
dump_stack.c -rw-r--r-- 1.1 KB
dynamic_debug.c -rw-r--r-- 25.5 KB
dynamic_queue_limits.c -rw-r--r-- 4.3 KB
earlycpio.c -rw-r--r-- 3.9 KB
extable.c -rw-r--r-- 2.4 KB
fault-inject.c -rw-r--r-- 5.5 KB
fdt.c -rw-r--r-- 69 bytes
fdt_empty_tree.c -rw-r--r-- 80 bytes
fdt_ro.c -rw-r--r-- 72 bytes
fdt_rw.c -rw-r--r-- 72 bytes
fdt_strerror.c -rw-r--r-- 78 bytes
fdt_sw.c -rw-r--r-- 72 bytes
fdt_wip.c -rw-r--r-- 73 bytes
find_last_bit.c -rw-r--r-- 1.1 KB
find_next_bit.c -rw-r--r-- 6.4 KB
flex_array.c -rw-r--r-- 11.0 KB
flex_proportions.c -rw-r--r-- 6.8 KB
gcd.c -rw-r--r-- 313 bytes
gen_crc32table.c -rw-r--r-- 3.2 KB
genalloc.c -rw-r--r-- 16.3 KB
glob.c -rw-r--r-- 7.7 KB
halfmd4.c -rw-r--r-- 2.0 KB
hash.c -rw-r--r-- 1.0 KB
hexdump.c -rw-r--r-- 7.2 KB
hweight.c -rw-r--r-- 1.9 KB
idr.c -rw-r--r-- 28.0 KB
inflate.c -rw-r--r-- 38.6 KB
int_sqrt.c -rw-r--r-- 652 bytes
interval_tree.c -rw-r--r-- 495 bytes
interval_tree_test.c -rw-r--r-- 2.3 KB
iomap.c -rw-r--r-- 6.5 KB
iomap_copy.c -rw-r--r-- 2.1 KB
iommu-helper.c -rw-r--r-- 1.0 KB
ioremap.c -rw-r--r-- 2.1 KB
iovec.c -rw-r--r-- 2.2 KB
irq_regs.c -rw-r--r-- 604 bytes
is_single_threaded.c -rw-r--r-- 1.3 KB
jedec_ddr_data.c -rw-r--r-- 3.0 KB
kasprintf.c -rw-r--r-- 717 bytes
kfifo.c -rw-r--r-- 12.7 KB
klist.c -rw-r--r-- 9.3 KB
kobject.c -rw-r--r-- 25.5 KB
kobject_uevent.c -rw-r--r-- 11.4 KB
kstrtox.c -rw-r--r-- 9.4 KB
kstrtox.h -rw-r--r-- 254 bytes
lcm.c -rw-r--r-- 288 bytes
libcrc32c.c -rw-r--r-- 2.1 KB
list_debug.c -rw-r--r-- 2.6 KB
list_sort.c -rw-r--r-- 6.7 KB
llist.c -rw-r--r-- 3.1 KB
locking-selftest-hardirq.h -rw-r--r-- 207 bytes
locking-selftest-mutex.h -rw-r--r-- 120 bytes
locking-selftest-rlock-hardirq.h -rw-r--r-- 74 bytes
locking-selftest-rlock-softirq.h -rw-r--r-- 74 bytes
locking-selftest-rlock.h -rw-r--r-- 158 bytes
locking-selftest-rsem.h -rw-r--r-- 163 bytes
locking-selftest-softirq.h -rw-r--r-- 207 bytes
locking-selftest-spin-hardirq.h -rw-r--r-- 73 bytes
locking-selftest-spin-softirq.h -rw-r--r-- 73 bytes
locking-selftest-spin.h -rw-r--r-- 118 bytes
locking-selftest-wlock-hardirq.h -rw-r--r-- 74 bytes
locking-selftest-wlock-softirq.h -rw-r--r-- 74 bytes
locking-selftest-wlock.h -rw-r--r-- 158 bytes
locking-selftest-wsem.h -rw-r--r-- 163 bytes
locking-selftest.c -rw-r--r-- 40.1 KB
lockref.c -rw-r--r-- 3.6 KB
lru_cache.c -rw-r--r-- 19.4 KB
md5.c -rw-r--r-- 3.7 KB
memory-notifier-error-inject.c -rw-r--r-- 1.1 KB
memweight.c -rw-r--r-- 999 bytes
net_utils.c -rw-r--r-- 604 bytes
nlattr.c -rw-r--r-- 12.5 KB
notifier-error-inject.c -rw-r--r-- 2.7 KB
notifier-error-inject.h -rw-r--r-- 614 bytes
of-reconfig-notifier-error-inject.c -rw-r--r-- 1.3 KB
oid_registry.c -rw-r--r-- 3.8 KB
parser.c -rw-r--r-- 7.1 KB
pci_iomap.c -rw-r--r-- 1.4 KB
percpu-refcount.c -rw-r--r-- 6.3 KB
percpu_counter.c -rw-r--r-- 5.3 KB
percpu_ida.c -rw-r--r-- 9.6 KB
percpu_test.c -rw-r--r-- 3.2 KB
plist.c -rw-r--r-- 5.9 KB
pm-notifier-error-inject.c -rw-r--r-- 1.1 KB
prio_heap.c -rw-r--r-- 1.4 KB
proportions.c -rw-r--r-- 9.3 KB
radix-tree.c -rw-r--r-- 39.3 KB
random32.c -rw-r--r-- 12.6 KB
ratelimit.c -rw-r--r-- 1.5 KB
rational.c -rw-r--r-- 1.5 KB
rbtree.c -rw-r--r-- 15.0 KB
rbtree_test.c -rw-r--r-- 5.5 KB
reciprocal_div.c -rw-r--r-- 492 bytes
rhashtable.c -rw-r--r-- 20.1 KB
scatterlist.c -rw-r--r-- 18.2 KB
sha1.c -rw-r--r-- 6.1 KB
show_mem.c -rw-r--r-- 1.2 KB
smp_processor_id.c -rw-r--r-- 1.3 KB
sort.c -rw-r--r-- 2.5 KB
stmp_device.c -rw-r--r-- 2.1 KB
string.c -rw-r--r-- 16.6 KB
string_helpers.c -rw-r--r-- 3.6 KB
strncpy_from_user.c -rw-r--r-- 2.9 KB
strnlen_user.c -rw-r--r-- 3.6 KB
swiotlb.c -rw-r--r-- 27.1 KB
syscall.c -rw-r--r-- 2.4 KB
test-kstrtox.c -rw-r--r-- 17.4 KB
test-string_helpers.c -rw-r--r-- 2.5 KB
test_bpf.c -rw-r--r-- 53.9 KB
test_firmware.c -rw-r--r-- 2.8 KB
test_module.c -rw-r--r-- 753 bytes
test_user_copy.c -rw-r--r-- 3.1 KB
textsearch.c -rw-r--r-- 9.6 KB
timerqueue.c -rw-r--r-- 3.1 KB
ts_bm.c -rw-r--r-- 5.3 KB
ts_fsm.c -rw-r--r-- 10.6 KB
ts_kmp.c -rw-r--r-- 4.3 KB
ucs2_string.c -rw-r--r-- 1.2 KB
usercopy.c -rw-r--r-- 197 bytes
uuid.c -rw-r--r-- 1.3 KB
vsprintf.c -rw-r--r-- 58.4 KB

back to top