aio: implement io_pgetevents
authorChristoph Hellwig <hch@lst.de>
Wed, 2 May 2018 17:51:00 +0000 (19:51 +0200)
committerChristoph Hellwig <hch@lst.de>
Wed, 2 May 2018 17:57:24 +0000 (19:57 +0200)
commit7a074e96dee62586c935c80cecd931431bfdd0be
treea1a29dad896070e82827d7447cfcc9a064e5a63d
parenta3c0d439e4d92411c2b4b21a526a4de720d0806b
aio: implement io_pgetevents

This is the io_getevents equivalent of ppoll/pselect and allows to
properly mix signals and aio completions (especially with IOCB_CMD_POLL)
and atomically executes the following sequence:

sigset_t origmask;

pthread_sigmask(SIG_SETMASK, &sigmask, &origmask);
ret = io_getevents(ctx, min_nr, nr, events, timeout);
pthread_sigmask(SIG_SETMASK, &origmask, NULL);

Note that unlike many other signal related calls we do not pass a sigmask
size, as that would get us to 7 arguments, which aren't easily supported
by the syscall infrastructure.  It seems a lot less painful to just add a
new syscall variant in the unlikely case we're going to increase the
sigset size.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
arch/x86/entry/syscalls/syscall_32.tbl
arch/x86/entry/syscalls/syscall_64.tbl
fs/aio.c
include/linux/compat.h
include/linux/syscalls.h
include/uapi/asm-generic/unistd.h
include/uapi/linux/aio_abi.h
kernel/sys_ni.c