diff mbox

nptl: Rewrite cancellation macros

Message ID 555C95DD.1050705@linaro.org
State New
Headers show

Commit Message

Adhemerval Zanella Netto May 20, 2015, 2:10 p.m. UTC
Hi

This patch is another of the required adjustments for the fix for bz12683
(Race conditions in pthread cancellation) and the idea is to remove
LIBC_CANCEL_ASYNC/LIBC_CANCEL_RESET explicit usage.

This patch changes the way cancellation entrypoints are defined to
instead call the macro SYSCALL_CANCEL.  An usual cancellation definition
is defined as:

  if (SINGLE_THREAD_P)
    return INLINE_SYSCALL (syscall, NARGS, args...)

  int oldtype = LIBC_CANCEL_ASYNC ();

  return INLINE_SYSCALL (syscall, NARGS, args...)

  LIBC_CANCEL_RESET (oldtype);

And it is rewrited as just:

  SYSCALL_CANCEL (syscall, args...)

Tested on i386, x86_64, powerpc32, powerpc64le, arm, and aarch64.

--

	* sysdeps/unix/sysdep.h [SYSCALL_CANCEL]: New macro: define
	cancellable syscalls.
	(SYS_ify): Add guard to no redefine it.
	(INLINE_SYSCALL): Likewise.
	* sysdeps/unix/sysv/linux/accept4.c (accept4): Remove
	LIBC_CANCEL_ASYNC/INLINE_SYSCALL/LIBC_CANCEL_RESET and use
	SYSCALL_CANCEL instead.
	* sysdeps/unix/sysv/linux/alpha/fdatasync.c (__fdatasync): Likewise.
	* sysdeps/unix/sysv/linux/arm/pread.c (__libc_pread): Likewise.
	* sysdeps/unix/sysv/linux/arm/pread64.c (__libc_pread64): Likewise.
	* sysdeps/unix/sysv/linux/arm/pwrite.c (__libc_pwrite): Likewise.
	* sysdeps/unix/sysv/linux/arm/pwrite64.c (__libc_pwrite64): Likewise.
	* sysdeps/unix/sysv/linux/epoll_pwait.c (epoll_pwait): Likewise.
	* sysdeps/unix/sysv/linux/fallocate.c (fallocate): Likewise.
	* sysdeps/unix/sysv/linux/fallocate64.c (fallocate64): Likewise.
	* sysdeps/unix/sysv/linux/generic/open.c (__libc_open): Likewise.
	* sysdeps/unix/sysv/linux/generic/open64.c (__libc_open64): Likewise.
	* sysdeps/unix/sysv/linux/generic/pause.c (__libc_pause): Likewise.
	* sysdeps/unix/sysv/linux/generic/poll.c (__poll): Likewise.
	* sysdeps/unix/sysv/linux/generic/recv.c (__libc_recv): Likewise.
	* sysdeps/unix/sysv/linux/generic/select.c (__select): Likewise.
	* sysdeps/unix/sysv/linux/generic/send.c (__libc_send): Likewise.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c (__libc_pread):
	Likewise.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
	(__libc_pread64): Likewise.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
	(__libc_preadv): Likewise.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
	(__libc_readv64): Likewise.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c
	(__libc_pwrite): Likewise.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c
	(__libc_pwrite64): Likewise.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
	(__libc_pwritev): Likewise.
	* sysdeps/sysv/linux/generic/wordsize-32/pwritev64.c
	(__libc_pwritev64): Likewise.
	* sysdeps/unix/sysv/linux/i386/fcntl.c (__libc_fcntl): Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c
	(sync_file_range): Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c (fallocate):
	Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c (fallocate64):
	Likewise.
	* sysdeps/unix/sysv/linux/mips/pread.c (__libc_pread): Likewise.
	* sysdeps/unix/sysv/linux/mips/pread64.c (__libc_pread64): Likewise.
	* sysdeps/unix/sysv/linux/mips/pwrite.c (__libc_pwrite): Likewise.
	* sysdeps/unix/sysv/linux/mips/pwrite64.c (__libc_pwrite64): Likewise.
	* sysdeps/unix/sysv/linux/msgrcv.c (__libc_msgrcv): Likewise.
	* sysdeps/unix/sysv/linux/msgsnd.c (__libc_msgsnd): Likewise.
	* sysdeps/unix/sysv/linux/open64.c (__libc_open64): Likewise.
	* sysdeps/unix/sysv/linux/openat.c (__libc_openat): Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c (__libc_pread):
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
	(__libc_read64): Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c (__libc_write):
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c (__libc_write64):
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c (__libc_fcntl):
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/pread.c (__libc_pread):
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/pread64.c
	(__libc_pread64): Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/pwrite.c (__libc_pwrite):
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/pwrite64.c
	(__libc_pwrite64): Likewise.
	* sysdeps/sysv/linux/powerpc/powerpc64/sync_file_range.c
	(sync_file_range): Likewise.
	* sysdeps/unix/sysv/linux/ppoll.c (ppoll): Likewise.
	* sysdeps/unix/sysv/linux/pread.c (__libc_pread): Likewise.
	* sysdeps/unix/sysv/linux/pread64.c (__libc_pread64): Likewise.
	* sysdeps/unix/sysv/linux/preadv.c (__libc_preadv): Likewise.
	* sysdeps/unix/sysv/linux/pselect.c (__pselect): Likewise.
	* sysdeps/unix/sysv/linux/pwrite.c (__libc_pwrite): Likewise.
	* sysdeps/unix/sysv/linux/pwrite64.c (__libc_pwrite64): Likewise.
	* sysdeps/unix/sysv/linux/pwritev.c (PWRITEV): Likewise.
	* sysdeps/unix/sysv/linux/readv.c (__libc_readv): Likewise.
	* sysdeps/unix/sysv/linux/recvmmsg.c (recvmmsg): Likewise.
	* sysdeps/unix/sysv/linux/sendmmsg.c (sendmmsg): Likewise.
	* sysdeps/unix/sysv/linux/sh/pread.c (__libc_pread): Likewise.
	* sysdeps/unix/sysv/linux/sh/pread64.c (__libc_pread64): Likewise.
	* sysdeps/unix/sysv/linux/sh/pwrite.c (__libc_pwrite): Likewise.
	* sysdeps/unix/sysv/linux/sh/pwrite64.c (__libc_pwrite64): Likewise.
	* sysdeps/unix/sysv/linux/sigsuspend.c (__sigsuspend): Likewise.
	* sysdeps/unix/sysv/linux/sigtimedwait.c (__sigtimedwait): Likewise.
	* sysdeps/unix/sysv/linux/sigwaitinfo.c (__sigwaitinfo): Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c (__libc_msgrcv):
	Likewise.
	* sysdeps/unix/sysv/linux/sync_file_range.c (sync_file_range):
	Likewise.
	* sysdeps/unix/sysv/linux/tcdrain.c (__libc_tcdrain): Likewise.
	* sysdeps/unix/sysv/linux/timer_routines.c (timer_helper_thread):
	Likewise.
	* sysdeps/unix/sysv/linux/wait.c (__libc_wait): Likewise.
	* sysdeps/unix/sysv/linux/waitid.c (__waitid): Likewise.
	* sysdeps/unix/sysv/linux/waitpid.c (__libc_waitpid): Likewise.
	* sysdeps/unix/sysv/linux/wordsize-64/fallocate.c (fallocate):
	Likewise.
	* sysdeps/unix/sysv/linux/wordsize-64/preadv.c (preadv): Likewise.
	* sysdeps/unix/sysv/linux/wordsize-64/pwritev.c (pwritev): Likewise.
	* sysdeps/unix/sysv/linux/writev.c (__libc_writev): Likewise.
	* sysdeps/unix/sysv/linux/x86_64/recv.c (__libc_recv): Likewise.
	* sysdeps/unix/sysv/linux/x86_64/send.c (__libc_send): Likewise.

--

Comments

Adhemerval Zanella Netto June 4, 2015, 6:19 p.m. UTC | #1
Ping (this is a refactor patch).

On 20-05-2015 11:10, Adhemerval Zanella wrote:
> Hi
> 
> This patch is another of the required adjustments for the fix for bz12683
> (Race conditions in pthread cancellation) and the idea is to remove
> LIBC_CANCEL_ASYNC/LIBC_CANCEL_RESET explicit usage.
> 
> This patch changes the way cancellation entrypoints are defined to
> instead call the macro SYSCALL_CANCEL.  An usual cancellation definition
> is defined as:
> 
>   if (SINGLE_THREAD_P)
>     return INLINE_SYSCALL (syscall, NARGS, args...)
> 
>   int oldtype = LIBC_CANCEL_ASYNC ();
> 
>   return INLINE_SYSCALL (syscall, NARGS, args...)
> 
>   LIBC_CANCEL_RESET (oldtype);
> 
> And it is rewrited as just:
> 
>   SYSCALL_CANCEL (syscall, args...)
> 
> Tested on i386, x86_64, powerpc32, powerpc64le, arm, and aarch64.
> 
> --
> 
> 	* sysdeps/unix/sysdep.h [SYSCALL_CANCEL]: New macro: define
> 	cancellable syscalls.
> 	(SYS_ify): Add guard to no redefine it.
> 	(INLINE_SYSCALL): Likewise.
> 	* sysdeps/unix/sysv/linux/accept4.c (accept4): Remove
> 	LIBC_CANCEL_ASYNC/INLINE_SYSCALL/LIBC_CANCEL_RESET and use
> 	SYSCALL_CANCEL instead.
> 	* sysdeps/unix/sysv/linux/alpha/fdatasync.c (__fdatasync): Likewise.
> 	* sysdeps/unix/sysv/linux/arm/pread.c (__libc_pread): Likewise.
> 	* sysdeps/unix/sysv/linux/arm/pread64.c (__libc_pread64): Likewise.
> 	* sysdeps/unix/sysv/linux/arm/pwrite.c (__libc_pwrite): Likewise.
> 	* sysdeps/unix/sysv/linux/arm/pwrite64.c (__libc_pwrite64): Likewise.
> 	* sysdeps/unix/sysv/linux/epoll_pwait.c (epoll_pwait): Likewise.
> 	* sysdeps/unix/sysv/linux/fallocate.c (fallocate): Likewise.
> 	* sysdeps/unix/sysv/linux/fallocate64.c (fallocate64): Likewise.
> 	* sysdeps/unix/sysv/linux/generic/open.c (__libc_open): Likewise.
> 	* sysdeps/unix/sysv/linux/generic/open64.c (__libc_open64): Likewise.
> 	* sysdeps/unix/sysv/linux/generic/pause.c (__libc_pause): Likewise.
> 	* sysdeps/unix/sysv/linux/generic/poll.c (__poll): Likewise.
> 	* sysdeps/unix/sysv/linux/generic/recv.c (__libc_recv): Likewise.
> 	* sysdeps/unix/sysv/linux/generic/select.c (__select): Likewise.
> 	* sysdeps/unix/sysv/linux/generic/send.c (__libc_send): Likewise.
> 	* sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c (__libc_pread):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
> 	(__libc_pread64): Likewise.
> 	* sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
> 	(__libc_preadv): Likewise.
> 	* sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
> 	(__libc_readv64): Likewise.
> 	* sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c
> 	(__libc_pwrite): Likewise.
> 	* sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c
> 	(__libc_pwrite64): Likewise.
> 	* sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
> 	(__libc_pwritev): Likewise.
> 	* sysdeps/sysv/linux/generic/wordsize-32/pwritev64.c
> 	(__libc_pwritev64): Likewise.
> 	* sysdeps/unix/sysv/linux/i386/fcntl.c (__libc_fcntl): Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c
> 	(sync_file_range): Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c (fallocate):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c (fallocate64):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/mips/pread.c (__libc_pread): Likewise.
> 	* sysdeps/unix/sysv/linux/mips/pread64.c (__libc_pread64): Likewise.
> 	* sysdeps/unix/sysv/linux/mips/pwrite.c (__libc_pwrite): Likewise.
> 	* sysdeps/unix/sysv/linux/mips/pwrite64.c (__libc_pwrite64): Likewise.
> 	* sysdeps/unix/sysv/linux/msgrcv.c (__libc_msgrcv): Likewise.
> 	* sysdeps/unix/sysv/linux/msgsnd.c (__libc_msgsnd): Likewise.
> 	* sysdeps/unix/sysv/linux/open64.c (__libc_open64): Likewise.
> 	* sysdeps/unix/sysv/linux/openat.c (__libc_openat): Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c (__libc_pread):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
> 	(__libc_read64): Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c (__libc_write):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c (__libc_write64):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c (__libc_fcntl):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc64/pread.c (__libc_pread):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc64/pread64.c
> 	(__libc_pread64): Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc64/pwrite.c (__libc_pwrite):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc64/pwrite64.c
> 	(__libc_pwrite64): Likewise.
> 	* sysdeps/sysv/linux/powerpc/powerpc64/sync_file_range.c
> 	(sync_file_range): Likewise.
> 	* sysdeps/unix/sysv/linux/ppoll.c (ppoll): Likewise.
> 	* sysdeps/unix/sysv/linux/pread.c (__libc_pread): Likewise.
> 	* sysdeps/unix/sysv/linux/pread64.c (__libc_pread64): Likewise.
> 	* sysdeps/unix/sysv/linux/preadv.c (__libc_preadv): Likewise.
> 	* sysdeps/unix/sysv/linux/pselect.c (__pselect): Likewise.
> 	* sysdeps/unix/sysv/linux/pwrite.c (__libc_pwrite): Likewise.
> 	* sysdeps/unix/sysv/linux/pwrite64.c (__libc_pwrite64): Likewise.
> 	* sysdeps/unix/sysv/linux/pwritev.c (PWRITEV): Likewise.
> 	* sysdeps/unix/sysv/linux/readv.c (__libc_readv): Likewise.
> 	* sysdeps/unix/sysv/linux/recvmmsg.c (recvmmsg): Likewise.
> 	* sysdeps/unix/sysv/linux/sendmmsg.c (sendmmsg): Likewise.
> 	* sysdeps/unix/sysv/linux/sh/pread.c (__libc_pread): Likewise.
> 	* sysdeps/unix/sysv/linux/sh/pread64.c (__libc_pread64): Likewise.
> 	* sysdeps/unix/sysv/linux/sh/pwrite.c (__libc_pwrite): Likewise.
> 	* sysdeps/unix/sysv/linux/sh/pwrite64.c (__libc_pwrite64): Likewise.
> 	* sysdeps/unix/sysv/linux/sigsuspend.c (__sigsuspend): Likewise.
> 	* sysdeps/unix/sysv/linux/sigtimedwait.c (__sigtimedwait): Likewise.
> 	* sysdeps/unix/sysv/linux/sigwaitinfo.c (__sigwaitinfo): Likewise.
> 	* sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c (__libc_msgrcv):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/sync_file_range.c (sync_file_range):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/tcdrain.c (__libc_tcdrain): Likewise.
> 	* sysdeps/unix/sysv/linux/timer_routines.c (timer_helper_thread):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/wait.c (__libc_wait): Likewise.
> 	* sysdeps/unix/sysv/linux/waitid.c (__waitid): Likewise.
> 	* sysdeps/unix/sysv/linux/waitpid.c (__libc_waitpid): Likewise.
> 	* sysdeps/unix/sysv/linux/wordsize-64/fallocate.c (fallocate):
> 	Likewise.
> 	* sysdeps/unix/sysv/linux/wordsize-64/preadv.c (preadv): Likewise.
> 	* sysdeps/unix/sysv/linux/wordsize-64/pwritev.c (pwritev): Likewise.
> 	* sysdeps/unix/sysv/linux/writev.c (__libc_writev): Likewise.
> 	* sysdeps/unix/sysv/linux/x86_64/recv.c (__libc_recv): Likewise.
> 	* sysdeps/unix/sysv/linux/x86_64/send.c (__libc_send): Likewise.
> 
> --
> 
> diff --git a/sysdeps/unix/sysdep.h b/sysdeps/unix/sysdep.h
> index 5fa6580..52dad58 100644
> --- a/sysdeps/unix/sysdep.h
> +++ b/sysdeps/unix/sysdep.h
> @@ -24,6 +24,27 @@
>  #define	SYSCALL__(name, args)	PSEUDO (__##name, name, args)
>  #define	SYSCALL(name, args)	PSEUDO (name, name, args)
>  
> +/* Cancellation macros.  */
> +#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,n,...) n
> +#define __SYSCALL_NARGS(...) \
> +  __SYSCALL_NARGS_X (__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0,)
> +
> +#define SYSCALL_CANCEL(name, ...) \
> +  ({									     \
> +    long int sc_ret;							     \
> +    if (SINGLE_THREAD_P) 						     \
> +      sc_ret = INLINE_SYSCALL (name, __SYSCALL_NARGS(__VA_ARGS__),	     \
> +			       __VA_ARGS__);				     \
> +    else								     \
> +      {									     \
> +	int sc_cancel_oldtype = LIBC_CANCEL_ASYNC ();			     \
> +	sc_ret = INLINE_SYSCALL (name, __SYSCALL_NARGS (__VA_ARGS__),	     \
> +				 __VA_ARGS__);				     \
> +        LIBC_CANCEL_RESET (sc_cancel_oldtype);				     \
> +      }									     \
> +    sc_ret;								     \
> +  })
> +
>  /* Machine-dependent sysdep.h files are expected to define the macro
>     PSEUDO (function_name, syscall_name) to emit assembly code to define the
>     C-callable function FUNCTION_NAME to do system call SYSCALL_NAME.
> @@ -31,7 +52,9 @@
>     an instruction such that "MOVE(r1, r0)" works.  ret should be defined
>     as the return instruction.  */
>  
> +#ifndef SYS_ify
>  #define SYS_ify(syscall_name) SYS_##syscall_name
> +#endif
>  
>  /* Terminate a system call named SYM.  This is used on some platforms
>     to generate correct debugging information.  */
> @@ -47,4 +70,6 @@
>  
>  /* Wrappers around system calls should normally inline the system call code.
>     But sometimes it is not possible or implemented and we use this code.  */
> +#ifndef INLINE_SYSCALL
>  #define INLINE_SYSCALL(name, nr, args...) __syscall_##name (args)
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/accept4.c b/sysdeps/unix/sysv/linux/accept4.c
> index 8e70b81..59293f9 100644
> --- a/sysdeps/unix/sysv/linux/accept4.c
> +++ b/sysdeps/unix/sysv/linux/accept4.c
> @@ -37,17 +37,7 @@
>  int
>  accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags)
>  {
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (accept4, 4, fd, addr.__sockaddr__, addr_len, flags);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = INLINE_SYSCALL (accept4, 4, fd, addr.__sockaddr__, addr_len,
> -			       flags);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (accept4, fd, addr.__sockaddr__, addr_len, flags);
>  }
>  #elif defined __NR_socketcall
>  # include <socketcall.h>
> diff --git a/sysdeps/unix/sysv/linux/alpha/fdatasync.c b/sysdeps/unix/sysv/linux/alpha/fdatasync.c
> index c9424e2..c8b711e 100644
> --- a/sysdeps/unix/sysv/linux/alpha/fdatasync.c
> +++ b/sysdeps/unix/sysv/linux/alpha/fdatasync.c
> @@ -26,39 +26,23 @@
>  
>  #include <kernel-features.h>
>  
> -static int
> -do_fdatasync (int fd)
> +int
> +__fdatasync (int fd)
>  {
>  #ifdef __ASSUME_FDATASYNC
> -  return INLINE_SYSCALL (fdatasync, 1, fd);
> +  return SYSCALL_CANCEL (fdatasync, fd);
>  #elif defined __NR_fdatasync
>    static int __have_no_fdatasync;
>  
>    if (!__builtin_expect (__have_no_fdatasync, 0))
>      {
> -      int result = INLINE_SYSCALL (fdatasync, 1, fd);
> +      int result = SYSCALL_CANCEL (fdatasync, fd);
>        if (__builtin_expect (result, 0) != -1 || errno != ENOSYS)
>  	return result;
>  
>        __have_no_fdatasync = 1;
>      }
>  #endif
> -  return INLINE_SYSCALL (fsync, 1, fd);
> -}
> -
> -int
> -__fdatasync (int fd)
> -{
> -  if (SINGLE_THREAD_P)
> -    return do_fdatasync (fd);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = do_fdatasync (fd);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (fsync, fd);
>  }
> -
>  weak_alias (__fdatasync, fdatasync)
> diff --git a/sysdeps/unix/sysv/linux/arm/pread.c b/sysdeps/unix/sysv/linux/arm/pread.c
> index 64bc0a1..91b3c66 100644
> --- a/sysdeps/unix/sysv/linux/arm/pread.c
> +++ b/sysdeps/unix/sysv/linux/arm/pread.c
> @@ -26,28 +26,10 @@
>  ssize_t
>  __libc_pread (int fd, void *buf, size_t count, off_t offset)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    {
> -      /* In the ARM EABI, 64-bit values are aligned to even/odd register
> -	 pairs for syscalls.  */
> -      result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
> -			       __LONG_LONG_PAIR (offset >> 31, offset));
> -
> -      return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
>    /* In the ARM EABI, 64-bit values are aligned to even/odd register
>       pairs for syscalls.  */
> -  result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
> -			   __LONG_LONG_PAIR (offset >> 31, offset));
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pread64, fd, buf, count, 0,
> +			 __LONG_LONG_PAIR (offset >> 31, offset));
>  }
>  
>  strong_alias (__libc_pread, __pread)
> diff --git a/sysdeps/unix/sysv/linux/arm/pread64.c b/sysdeps/unix/sysv/linux/arm/pread64.c
> index 7860699..ca71feb 100644
> --- a/sysdeps/unix/sysv/linux/arm/pread64.c
> +++ b/sysdeps/unix/sysv/linux/arm/pread64.c
> @@ -26,30 +26,11 @@
>  ssize_t
>  __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    {
> -      /* In the ARM EABI, 64-bit values are aligned to even/odd register
> -	 pairs for syscalls.  */
> -      result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
> -			       __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -						 (off_t) (offset & 0xffffffff)));
> -
> -      return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
>    /* In the ARM EABI, 64-bit values are aligned to even/odd register
>       pairs for syscalls.  */
> -  result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
> -			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -					     (off_t) (offset & 0xffffffff)));
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pread64, fd, buf, count, 0,
> +			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
> +					   (off_t) (offset & 0xffffffff)));
>  }
>  
>  weak_alias (__libc_pread64, __pread64)
> diff --git a/sysdeps/unix/sysv/linux/arm/pwrite.c b/sysdeps/unix/sysv/linux/arm/pwrite.c
> index 11a963c..e22e112 100644
> --- a/sysdeps/unix/sysv/linux/arm/pwrite.c
> +++ b/sysdeps/unix/sysv/linux/arm/pwrite.c
> @@ -26,28 +26,10 @@
>  ssize_t
>  __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    {
> -      /* In the ARM EABI, 64-bit values are aligned to even/odd register
> -	 pairs for syscalls.  */
> -      result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
> -			       __LONG_LONG_PAIR (offset >> 31, offset));
> -
> -      return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
>    /* In the ARM EABI, 64-bit values are aligned to even/odd register
>       pairs for syscalls.  */
> -  result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
> -			   __LONG_LONG_PAIR (offset >> 31, offset));
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pwrite64, fd, buf, count, 0,
> +			 __LONG_LONG_PAIR (offset >> 31, offset));
>  }
>  
>  strong_alias (__libc_pwrite, __pwrite)
> diff --git a/sysdeps/unix/sysv/linux/arm/pwrite64.c b/sysdeps/unix/sysv/linux/arm/pwrite64.c
> index 9cb67ff..b63fbc8 100644
> --- a/sysdeps/unix/sysv/linux/arm/pwrite64.c
> +++ b/sysdeps/unix/sysv/linux/arm/pwrite64.c
> @@ -26,30 +26,11 @@
>  ssize_t
>  __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    {
> -      /* In the ARM EABI, 64-bit values are aligned to even/odd register
> -	 pairs for syscalls.  */
> -      result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
> -			       __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -						 (off_t) (offset & 0xffffffff)));
> -
> -      return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
>    /* In the ARM EABI, 64-bit values are aligned to even/odd register
>       pairs for syscalls.  */
> -  result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
> -			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -					     (off_t) (offset & 0xffffffff)));
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pwrite64, fd, buf, count, 0,
> +			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
> +					   (off_t) (offset & 0xffffffff)));
>  }
>  
>  weak_alias (__libc_pwrite64, __pwrite64)
> diff --git a/sysdeps/unix/sysv/linux/epoll_pwait.c b/sysdeps/unix/sysv/linux/epoll_pwait.c
> index 65fefec..0e39013 100644
> --- a/sysdeps/unix/sysv/linux/epoll_pwait.c
> +++ b/sysdeps/unix/sysv/linux/epoll_pwait.c
> @@ -39,18 +39,8 @@ int epoll_pwait (int epfd, struct epoll_event *events,
>  		 int maxevents, int timeout,
>  		 const sigset_t *set)
>  {
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (epoll_pwait, 6, epfd, events, maxevents, timeout,
> -			   set, _NSIG / 8);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = INLINE_SYSCALL (epoll_pwait, 6, epfd, events, maxevents,
> -			       timeout, set, _NSIG / 8);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (epoll_pwait, epfd, events, maxevents,
> +			 timeout, set, _NSIG / 8);
>  }
>  
>  #else
> diff --git a/sysdeps/unix/sysv/linux/fallocate.c b/sysdeps/unix/sysv/linux/fallocate.c
> index e9668bf..f3de90c 100644
> --- a/sysdeps/unix/sysv/linux/fallocate.c
> +++ b/sysdeps/unix/sysv/linux/fallocate.c
> @@ -25,21 +25,9 @@ int
>  fallocate (int fd, int mode, __off_t offset, __off_t len)
>  {
>  #ifdef __NR_fallocate
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (fallocate, 6, fd, mode,
> -			   __LONG_LONG_PAIR (offset >> 31, offset),
> -			   __LONG_LONG_PAIR (len >> 31, len));
> -
> -  int result;
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  result = INLINE_SYSCALL (fallocate, 6, fd, mode,
> -			   __LONG_LONG_PAIR (offset >> 31, offset),
> -			   __LONG_LONG_PAIR (len >> 31, len));
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (fallocate, fd, mode,
> +			 __LONG_LONG_PAIR (offset >> 31, offset),
> +			 __LONG_LONG_PAIR (len >> 31, len));
>  #else
>    __set_errno (ENOSYS);
>    return -1;
> diff --git a/sysdeps/unix/sysv/linux/fallocate64.c b/sysdeps/unix/sysv/linux/fallocate64.c
> index 96acb28..191fa57 100644
> --- a/sysdeps/unix/sysv/linux/fallocate64.c
> +++ b/sysdeps/unix/sysv/linux/fallocate64.c
> @@ -25,25 +25,11 @@ int
>  fallocate64 (int fd, int mode, __off64_t offset, __off64_t len)
>  {
>  #ifdef __NR_fallocate
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (fallocate, 6, fd, mode,
> -			   __LONG_LONG_PAIR ((long int) (offset >> 32),
> -					     (long int) offset),
> -			   __LONG_LONG_PAIR ((long int) (len >> 32),
> -					     (long int) len));
> -
> -  int result;
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  result = INLINE_SYSCALL (fallocate, 6, fd, mode,
> -			   __LONG_LONG_PAIR ((long int) (offset >> 32),
> -					     (long int) offset),
> -			   __LONG_LONG_PAIR ((long int) (len >> 32),
> -					     (long int) len));
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (fallocate, fd, mode,
> +			 __LONG_LONG_PAIR ((long int) (offset >> 32),
> +					   (long int) offset),
> +			 __LONG_LONG_PAIR ((long int) (len >> 32),
> +					   (long int) len));
>  #else
>    __set_errno (ENOSYS);
>    return -1;
> diff --git a/sysdeps/unix/sysv/linux/generic/open.c b/sysdeps/unix/sysv/linux/generic/open.c
> index 289f57a..66cc2ed 100644
> --- a/sysdeps/unix/sysv/linux/generic/open.c
> +++ b/sysdeps/unix/sysv/linux/generic/open.c
> @@ -37,16 +37,7 @@ __libc_open (const char *file, int oflag, ...)
>        va_end (arg);
>      }
>  
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (openat, 4, AT_FDCWD, file, oflag, mode);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = INLINE_SYSCALL (openat, 4, AT_FDCWD, file, oflag, mode);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (openat, AT_FDCWD, file, oflag, mode);
>  }
>  libc_hidden_def (__libc_open)
>  
> diff --git a/sysdeps/unix/sysv/linux/generic/open64.c b/sysdeps/unix/sysv/linux/generic/open64.c
> index 374e41c..402bc7c 100644
> --- a/sysdeps/unix/sysv/linux/generic/open64.c
> +++ b/sysdeps/unix/sysv/linux/generic/open64.c
> @@ -37,18 +37,7 @@ __libc_open64 (const char *file, int oflag, ...)
>        va_end (arg);
>      }
>  
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (openat, 4, AT_FDCWD, file,
> -                           oflag | O_LARGEFILE, mode);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = INLINE_SYSCALL (openat, 4, AT_FDCWD, file,
> -                               oflag | O_LARGEFILE, mode);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (openat, AT_FDCWD, file, oflag | O_LARGEFILE, mode);
>  }
>  weak_alias (__libc_open64, __open64)
>  libc_hidden_weak (__open64)
> diff --git a/sysdeps/unix/sysv/linux/generic/pause.c b/sysdeps/unix/sysv/linux/generic/pause.c
> index 7966df2..45d3a0e 100644
> --- a/sysdeps/unix/sysv/linux/generic/pause.c
> +++ b/sysdeps/unix/sysv/linux/generic/pause.c
> @@ -23,41 +23,17 @@
>  /* Suspend the process until a signal arrives.
>     This always returns -1 and sets errno to EINTR.  */
>  
> -static int
> -__syscall_pause (void)
> +int
> +__libc_pause (void)
>  {
>    sigset_t set;
>  
>    int rc =
> -    INLINE_SYSCALL (rt_sigprocmask, 4, SIG_BLOCK, NULL, &set, _NSIG / 8);
> +    SYSCALL_CANCEL (rt_sigprocmask, SIG_BLOCK, NULL, &set, _NSIG / 8);
>    if (rc == 0)
> -    rc = INLINE_SYSCALL (rt_sigsuspend, 2, &set, _NSIG / 8);
> +    rc = SYSCALL_CANCEL (rt_sigsuspend, &set, _NSIG / 8);
>  
>    return rc;
>  }
>  
> -int
> -__libc_pause (void)
> -{
> -  if (SINGLE_THREAD_P)
> -    return __syscall_pause ();
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = __syscall_pause ();
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> -}
>  weak_alias (__libc_pause, pause)
> -
> -#ifndef NO_CANCELLATION
> -# include <not-cancel.h>
> -
> -int
> -__pause_nocancel (void)
> -{
> -  return __syscall_pause ();
> -}
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/generic/poll.c b/sysdeps/unix/sysv/linux/generic/poll.c
> index 7ef42f3..2a95796 100644
> --- a/sysdeps/unix/sysv/linux/generic/poll.c
> +++ b/sysdeps/unix/sysv/linux/generic/poll.c
> @@ -35,16 +35,7 @@ __poll (struct pollfd *fds, nfds_t nfds, int timeout)
>        timeout_ts_p = &timeout_ts;
>      }
>  
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout_ts_p, NULL, 0);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout_ts_p, NULL, 0);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (ppoll, fds, nfds, timeout_ts_p, NULL, 0);
>  }
>  libc_hidden_def (__poll)
>  weak_alias (__poll, poll)
> diff --git a/sysdeps/unix/sysv/linux/generic/recv.c b/sysdeps/unix/sysv/linux/generic/recv.c
> index d827b3e..3786172 100644
> --- a/sysdeps/unix/sysv/linux/generic/recv.c
> +++ b/sysdeps/unix/sysv/linux/generic/recv.c
> @@ -24,22 +24,8 @@
>  ssize_t
>  __libc_recv (int sockfd, void *buffer, size_t len, int flags)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    result = INLINE_SYSCALL (recvfrom, 6, sockfd, buffer, len, flags,
> -                             NULL, NULL);
> -  else
> -    {
> -      int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -      result = INLINE_SYSCALL (recvfrom, 6, sockfd, buffer, len, flags,
> -                               NULL, NULL);
> -
> -      LIBC_CANCEL_RESET (oldtype);
> -    }
> -
> -  return result;
> +  return SYSCALL_CANCEL (recvfrom, sockfd, buffer, len, flags,
> +			 NULL, NULL);
>  }
>  strong_alias (__libc_recv, __recv)
>  weak_alias (__libc_recv, recv)
> diff --git a/sysdeps/unix/sysv/linux/generic/select.c b/sysdeps/unix/sysv/linux/generic/select.c
> index 455c308..f7f1e18 100644
> --- a/sysdeps/unix/sysv/linux/generic/select.c
> +++ b/sysdeps/unix/sysv/linux/generic/select.c
> @@ -42,20 +42,8 @@ __select(int nfds, fd_set *readfds,
>        tsp = &ts;
>      }
>  
> -  if (SINGLE_THREAD_P)
> -    {
> -      result = INLINE_SYSCALL (pselect6, 6, nfds, readfds, writefds, exceptfds,
> -                               tsp, NULL);
> -    }
> -  else
> -    {
> -      int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -      result = INLINE_SYSCALL (pselect6, 6, nfds, readfds, writefds, exceptfds,
> -                               tsp, NULL);
> -
> -      LIBC_CANCEL_RESET (oldtype);
> -    }
> +  result = SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds, tsp,
> +			   NULL);
>  
>    if (timeout)
>      {
> diff --git a/sysdeps/unix/sysv/linux/generic/send.c b/sysdeps/unix/sysv/linux/generic/send.c
> index dfbdc09..fed6961 100644
> --- a/sysdeps/unix/sysv/linux/generic/send.c
> +++ b/sysdeps/unix/sysv/linux/generic/send.c
> @@ -24,20 +24,7 @@
>  ssize_t
>  __libc_send (int sockfd, const void *buffer, size_t len, int flags)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    result = INLINE_SYSCALL (sendto, 6, sockfd, buffer, len, flags, NULL, 0);
> -  else
> -    {
> -      int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -      result = INLINE_SYSCALL (sendto, 6, sockfd, buffer, len, flags, NULL, 0);
> -
> -      LIBC_CANCEL_RESET (oldtype);
> -    }
> -
> -  return result;
> +  return SYSCALL_CANCEL (sendto, sockfd, buffer, len, flags, NULL, 0);
>  }
>  strong_alias (__libc_send, __send)
>  weak_alias (__libc_send, send)
> diff --git a/sysdeps/unix/sysv/linux/generic/sysdep.h b/sysdeps/unix/sysv/linux/generic/sysdep.h
> index 160804c..11da9d2 100644
> --- a/sysdeps/unix/sysv/linux/generic/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/generic/sysdep.h
> @@ -18,6 +18,7 @@
>  
>  #include <bits/wordsize.h>
>  #include <kernel-features.h>
> +#include <sysdeps/unix/sysdep.h>
>  
>  /* Provide the common name to allow more code reuse.  */
>  #define __NR__llseek __NR_llseek
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c
> index ad97e97..6f9703c 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c
> @@ -25,28 +25,13 @@
>  #include <sysdep-cancel.h>
>  #include <sys/syscall.h>
>  
> -static ssize_t
> -do_pread (int fd, void *buf, size_t count, off_t offset)
> +ssize_t
> +__libc_pread (int fd, void *buf, size_t count, off_t offset)
>  {
>    assert (sizeof (offset) == 4);
> -  return INLINE_SYSCALL (pread64, __ALIGNMENT_COUNT (5, 6), fd,
> +  return SYSCALL_CANCEL (pread64, fd,
>                           buf, count, __ALIGNMENT_ARG
>                           __LONG_LONG_PAIR (offset >> 31, offset));
>  }
> -
> -ssize_t
> -__libc_pread (int fd, void *buf, size_t count, off_t offset)
> -{
> -  if (SINGLE_THREAD_P)
> -    return do_pread (fd, buf, count, offset);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = do_pread (fd, buf, count, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> -}
>  strong_alias (__libc_pread, __pread)
>  weak_alias (__libc_pread, pread)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
> index 7250893..a3f8ec1 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
> @@ -24,29 +24,11 @@
>  #include <sysdep-cancel.h>
>  #include <sys/syscall.h>
>  
> -static ssize_t
> -do_pread64 (int fd, void *buf, size_t count, off64_t offset)
> -{
> -  return INLINE_SYSCALL (pread64, __ALIGNMENT_COUNT (5, 6), fd,
> -                         buf, count, __ALIGNMENT_ARG
> -                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -                                           (off_t) (offset & 0xffffffff)));
> -}
> -
> -
>  ssize_t
>  __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
>  {
> -  if (SINGLE_THREAD_P)
> -    return do_pread64 (fd, buf, count, offset);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = do_pread64 (fd, buf, count, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pread64, fd, buf, count, __ALIGNMENT_ARG
> +                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
> +                                           (off_t) (offset & 0xffffffff)));
>  }
> -
>  weak_alias (__libc_pread64, __pread64) weak_alias (__libc_pread64, pread64)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
> index 9a1832a..d127fee 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
> @@ -26,28 +26,13 @@
>  #include <sysdep-cancel.h>
>  #include <sys/syscall.h>
>  
> -static ssize_t
> -do_preadv (int fd, const struct iovec *vector, int count, off_t offset)
> +ssize_t
> +__libc_preadv (int fd, const struct iovec *vector, int count, off_t offset)
>  {
>    assert (sizeof (offset) == 4);
> -  return INLINE_SYSCALL (preadv, __ALIGNMENT_COUNT (5, 6), fd,
> +  return SYSCALL_CANCEL (preadv, fd,
>                           vector, count, __ALIGNMENT_ARG
>                           __LONG_LONG_PAIR (offset >> 31, offset));
>  }
> -
> -ssize_t
> -__libc_preadv (int fd, const struct iovec *vector, int count, off_t offset)
> -{
> -  if (SINGLE_THREAD_P)
> -    return do_preadv (fd, vector, count, offset);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = do_preadv (fd, vector, count, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> -}
>  strong_alias (__libc_preadv, __preadv)
>  weak_alias (__libc_preadv, preadv)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
> index df1c010..7e7ebf7 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
> @@ -25,30 +25,14 @@
>  #include <sysdep-cancel.h>
>  #include <sys/syscall.h>
>  
> -static ssize_t
> -do_preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
> +ssize_t
> +__libc_preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
>  {
> -  return INLINE_SYSCALL (preadv, __ALIGNMENT_COUNT (5, 6), fd,
> +  return SYSCALL_CANCEL (preadv, fd,
>                           vector, count, __ALIGNMENT_ARG
>                           __LONG_LONG_PAIR ((off_t) (offset >> 32),
>                                             (off_t) (offset & 0xffffffff)));
>  }
>  
> -
> -ssize_t
> -__libc_preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
> -{
> -  if (SINGLE_THREAD_P)
> -    return do_preadv64 (fd, vector, count, offset);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = do_preadv64 (fd, vector, count, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> -}
> -
>  strong_alias (__libc_preadv64, __preadv64)
>  weak_alias (__libc_preadv64, preadv64)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c
> index e897c7d..2f0f7a1 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c
> @@ -25,29 +25,12 @@
>  #include <sysdep-cancel.h>
>  #include <sys/syscall.h>
>  
> -static ssize_t
> -do_pwrite (int fd, const void *buf, size_t count, off_t offset)
> -{
> -  assert (sizeof (offset) == 4);
> -  return INLINE_SYSCALL (pwrite64, __ALIGNMENT_COUNT (5, 6), fd,
> -                         buf, count, __ALIGNMENT_ARG
> -                         __LONG_LONG_PAIR (offset >> 31, offset));
> -}
> -
> -
>  ssize_t
>  __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
>  {
> -  if (SINGLE_THREAD_P)
> -    return do_pwrite (fd, buf, count, offset);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = do_pwrite (fd, buf, count, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  assert (sizeof (offset) == 4);
> +  return SYSCALL_CANCEL (pwrite64, fd, buf, count, __ALIGNMENT_ARG
> +                         __LONG_LONG_PAIR (offset >> 31, offset));
>  }
>  strong_alias (__libc_pwrite, __pwrite)
>  weak_alias (__libc_pwrite, pwrite)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c
> index 3ac1339..f222016 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c
> @@ -24,30 +24,12 @@
>  #include <sysdep-cancel.h>
>  #include <sys/syscall.h>
>  
> -static ssize_t
> -do_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
> -{
> -  return INLINE_SYSCALL (pwrite64, __ALIGNMENT_COUNT (5, 6), fd,
> -                         buf, count, __ALIGNMENT_ARG
> -                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -                                           (off_t) (offset & 0xffffffff)));
> -}
> -
> -
>  ssize_t
>  __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
>  {
> -  if (SINGLE_THREAD_P)
> -    return do_pwrite64 (fd, buf, count, offset);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = do_pwrite64 (fd, buf, count, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pwrite64, fd, buf, count, __ALIGNMENT_ARG
> +                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
> +                                           (off_t) (offset & 0xffffffff)));
>  }
> -
>  weak_alias (__libc_pwrite64, __pwrite64)
>  libc_hidden_weak (__pwrite64) weak_alias (__libc_pwrite64, pwrite64)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
> index db1e4cb..273b0ff 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
> @@ -26,29 +26,12 @@
>  #include <sysdep-cancel.h>
>  #include <sys/syscall.h>
>  
> -static ssize_t
> -do_pwritev (int fd, const struct iovec *vector, int count, off_t offset)
> -{
> -  assert (sizeof (offset) == 4);
> -  return INLINE_SYSCALL (pwritev, __ALIGNMENT_COUNT (5, 6), fd,
> -                         vector, count, __ALIGNMENT_ARG
> -                         __LONG_LONG_PAIR (offset >> 31, offset));
> -}
> -
> -
>  ssize_t
>  __libc_pwritev (int fd, const struct iovec *vector, int count, off_t offset)
>  {
> -  if (SINGLE_THREAD_P)
> -    return do_pwritev (fd, vector, count, offset);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = do_pwritev (fd, vector, count, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  assert (sizeof (offset) == 4);
> +  return SYSCALL_CANCEL (pwritev, fd, vector, count, __ALIGNMENT_ARG
> +                         __LONG_LONG_PAIR (offset >> 31, offset));
>  }
>  strong_alias (__libc_pwritev, __pwritev)
>  weak_alias (__libc_pwritev, pwritev)
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c
> index eb85e07..9d3fa75 100644
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c
> +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c
> @@ -25,31 +25,14 @@
>  #include <sysdep-cancel.h>
>  #include <sys/syscall.h>
>  
> -static ssize_t
> -do_pwritev64 (int fd, const struct iovec *vector, int count, off64_t offset)
> -{
> -  return INLINE_SYSCALL (pwritev, __ALIGNMENT_COUNT (5, 6), fd,
> -                         vector, count, __ALIGNMENT_ARG
> -                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -                                           (off_t) (offset & 0xffffffff)));
> -}
> -
> -
>  ssize_t
>  __libc_pwritev64 (int fd, const struct iovec *vector, int count,
>                    off64_t offset)
>  {
> -  if (SINGLE_THREAD_P)
> -    return do_pwritev64 (fd, vector, count, offset);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = do_pwritev64 (fd, vector, count, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pwritev, fd,
> +                         vector, count, __ALIGNMENT_ARG
> +                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
> +                                           (off_t) (offset & 0xffffffff)));
>  }
> -
>  strong_alias (__libc_pwritev64, pwritev64)
>  weak_alias (__libc_pwritev64, __pwritev64)
> diff --git a/sysdeps/unix/sysv/linux/i386/fcntl.c b/sysdeps/unix/sysv/linux/i386/fcntl.c
> index 9132c5a..56f4bd1 100644
> --- a/sysdeps/unix/sysv/linux/i386/fcntl.c
> +++ b/sysdeps/unix/sysv/linux/i386/fcntl.c
> @@ -49,16 +49,10 @@ __libc_fcntl (int fd, int cmd, ...)
>    arg = va_arg (ap, void *);
>    va_end (ap);
>  
> -  if (SINGLE_THREAD_P || (cmd != F_SETLKW && cmd != F_SETLKW64))
> +  if ((cmd != F_SETLKW) && (cmd != F_SETLKW64))
>      return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
>  
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (fcntl64, fd, cmd, arg);
>  }
>  libc_hidden_def (__libc_fcntl)
>  
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c b/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c
> index 3c91d15..b79e44d 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c
> @@ -28,23 +28,10 @@
>  int
>  sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
>  {
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (sync_file_range, 7, fd, 0,
> -			   __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> -			   __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
> -			   flags);
> -
> -  int result;
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  result = INLINE_SYSCALL (sync_file_range, 7, fd, 0,
> -			   __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> -			   __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
> -			   flags);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (sync_file_range, fd, 0,
> +			 __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> +			 __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
> +			 flags);
>  }
>  #else
>  int
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c
> index 2331cec..ce29a0e 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c
> @@ -25,17 +25,7 @@ int
>  fallocate (int fd, int mode, __off_t offset, __off_t len)
>  {
>  #ifdef __NR_fallocate
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
> -
> -  int result;
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (fallocate, fd, mode, offset, len);
>  #else
>    __set_errno (ENOSYS);
>    return -1;
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c
> index d3ed5d1..077127e 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c
> @@ -25,17 +25,7 @@ int
>  fallocate64 (int fd, int mode, __off64_t offset, __off64_t len)
>  {
>  #ifdef __NR_fallocate
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
> -
> -  int result;
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (fallocate, fd, mode, offset, len);
>  #else
>    __set_errno (ENOSYS);
>    return -1;
> diff --git a/sysdeps/unix/sysv/linux/mips/pread.c b/sysdeps/unix/sysv/linux/mips/pread.c
> index a7b1618..0bd712d 100644
> --- a/sysdeps/unix/sysv/linux/mips/pread.c
> +++ b/sysdeps/unix/sysv/linux/mips/pread.c
> @@ -38,35 +38,16 @@
>  ssize_t
>  __libc_pread (int fd, void *buf, size_t count, off_t offset)
>  {
> -  ssize_t result;
> -
>  #if _MIPS_SIM != _ABI64
>    assert (sizeof (offset) == 4);
>  #endif
>  
> -  if (SINGLE_THREAD_P)
> -    {
> -#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> -      result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
> -#else
> -      result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> -			       __LONG_LONG_PAIR (offset >> 31, offset));
> -#endif
> -      return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
>  #if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> -  result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
> +  return SYSCALL_CANCEL (pread, fd, buf, count, offset);
>  #else
> -  result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> -			   __LONG_LONG_PAIR (offset >> 31, offset));
> +  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
> +			 __LONG_LONG_PAIR (offset >> 31, offset));
>  #endif
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
>  }
>  
>  strong_alias (__libc_pread, __pread)
> diff --git a/sysdeps/unix/sysv/linux/mips/pread64.c b/sysdeps/unix/sysv/linux/mips/pread64.c
> index ad948aa..3ed100b 100644
> --- a/sysdeps/unix/sysv/linux/mips/pread64.c
> +++ b/sysdeps/unix/sysv/linux/mips/pread64.c
> @@ -37,34 +37,13 @@
>  ssize_t
>  __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
>  {
> -  ssize_t result;
> -
> -
> -  if (SINGLE_THREAD_P)
> -    {
>  #if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> -      result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
> +  return SYSCALL_CANCEL (pread, fd, buf, count, offset);
>  #else
> -     result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> -			      __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -			      (off_t) (offset & 0xffffffff)));
> +  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
> +			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
> +					   (off_t) (offset & 0xffffffff)));
>  #endif
> -     return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> -  result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
> -#else
> -  result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> -			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -					     (off_t) (offset & 0xffffffff)));
> -#endif
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
>  }
>  
>  weak_alias (__libc_pread64, __pread64)
> diff --git a/sysdeps/unix/sysv/linux/mips/pwrite.c b/sysdeps/unix/sysv/linux/mips/pwrite.c
> index 2c38e04..f4d71d4 100644
> --- a/sysdeps/unix/sysv/linux/mips/pwrite.c
> +++ b/sysdeps/unix/sysv/linux/mips/pwrite.c
> @@ -38,35 +38,16 @@
>  ssize_t
>  __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
>  {
> -  ssize_t result;
> -
>  #if _MIPS_SIM != _ABI64
>    assert (sizeof (offset) == 4);
>  #endif
>  
> -  if (SINGLE_THREAD_P)
> -    {
> -#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> -      result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
> -#else
> -      result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> -			       __LONG_LONG_PAIR (offset >> 31, offset));
> -#endif
> -      return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
>  #if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> -  result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
> +  return SYSCALL_CANCEL (pwrite, fd, buf, count, offset);
>  #else
> -  result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> -			   __LONG_LONG_PAIR (offset >> 31, offset));
> +  return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
> +			 __LONG_LONG_PAIR (offset >> 31, offset));
>  #endif
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
>  }
>  
>  strong_alias (__libc_pwrite, __pwrite)
> diff --git a/sysdeps/unix/sysv/linux/mips/pwrite64.c b/sysdeps/unix/sysv/linux/mips/pwrite64.c
> index 504c88a..ac0dc40 100644
> --- a/sysdeps/unix/sysv/linux/mips/pwrite64.c
> +++ b/sysdeps/unix/sysv/linux/mips/pwrite64.c
> @@ -37,34 +37,13 @@
>  ssize_t
>  __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    {
>  #if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> -      result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
> +  return SYSCALL_CANCEL (pwrite, fd, buf, count, offset);
>  #else
> -     result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> -			      __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -			     (off_t) (offset & 0xffffffff)));
> +  return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
> +			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
> +					   (off_t) (offset & 0xffffffff)));
>  #endif
> -
> -     return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
> -  result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
> -#else
> -  result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> -			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -					     (off_t) (offset & 0xffffffff)));
> -#endif
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
>  }
>  
>  weak_alias (__libc_pwrite64, __pwrite64)
> diff --git a/sysdeps/unix/sysv/linux/msgrcv.c b/sysdeps/unix/sysv/linux/msgrcv.c
> index 1c3698c..660ff29 100644
> --- a/sysdeps/unix/sysv/linux/msgrcv.c
> +++ b/sysdeps/unix/sysv/linux/msgrcv.c
> @@ -43,16 +43,6 @@ __libc_msgrcv (int msqid, void *msgp, size_t msgsz, long int msgtyp,
>    tmp.msgp = msgp;
>    tmp.msgtyp = msgtyp;
>  
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (ipc, 5, IPCOP_msgrcv, msqid, msgsz, msgflg, &tmp);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = INLINE_SYSCALL (ipc, 5, IPCOP_msgrcv, msqid, msgsz, msgflg,
> -				   &tmp);
> -
> -   LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (ipc, IPCOP_msgrcv, msqid, msgsz, msgflg, &tmp);
>  }
>  weak_alias (__libc_msgrcv, msgrcv)
> diff --git a/sysdeps/unix/sysv/linux/msgsnd.c b/sysdeps/unix/sysv/linux/msgsnd.c
> index d548aab..dfed539 100644
> --- a/sysdeps/unix/sysv/linux/msgsnd.c
> +++ b/sysdeps/unix/sysv/linux/msgsnd.c
> @@ -26,17 +26,7 @@
>  int
>  __libc_msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg)
>  {
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (ipc, 5, IPCOP_msgsnd, msqid, msgsz,
> -			   msgflg, (void *) msgp);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = INLINE_SYSCALL (ipc, 5, IPCOP_msgsnd, msqid, msgsz,
> -			       msgflg, (void *) msgp);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (ipc, IPCOP_msgsnd, msqid, msgsz, msgflg,
> +			 (void *) msgp);
>  }
>  weak_alias (__libc_msgsnd, msgsnd)
> diff --git a/sysdeps/unix/sysv/linux/open64.c b/sysdeps/unix/sysv/linux/open64.c
> index d3ab813..b90294a 100644
> --- a/sysdeps/unix/sysv/linux/open64.c
> +++ b/sysdeps/unix/sysv/linux/open64.c
> @@ -36,16 +36,7 @@ __libc_open64 (const char *file, int oflag, ...)
>        va_end (arg);
>      }
>  
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (open, 3, file, oflag | O_LARGEFILE, mode);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = INLINE_SYSCALL (open, 3, file, oflag | O_LARGEFILE, mode);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (open, file, oflag | O_LARGEFILE, mode);
>  }
>  weak_alias (__libc_open64, __open64)
>  libc_hidden_weak (__open64)
> diff --git a/sysdeps/unix/sysv/linux/openat.c b/sysdeps/unix/sysv/linux/openat.c
> index 30d8e6e..6777123 100644
> --- a/sysdeps/unix/sysv/linux/openat.c
> +++ b/sysdeps/unix/sysv/linux/openat.c
> @@ -68,16 +68,7 @@ __OPENAT (int fd, const char *file, int oflag, ...)
>        va_end (arg);
>      }
>  
> -  if (SINGLE_THREAD_P)
> -    return OPENAT_NOT_CANCEL (fd, file, oflag, mode);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int res = OPENAT_NOT_CANCEL (fd, file, oflag, mode);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return res;
> +  return SYSCALL_CANCEL (openat, fd, file, oflag, mode);
>  }
>  libc_hidden_def (__OPENAT)
>  weak_alias (__OPENAT, OPENAT)
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c
> index 10763f5..f6b7f43 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c
> @@ -26,26 +26,8 @@
>  ssize_t
>  __libc_pread (int fd, void *buf, size_t count, off_t offset)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    {
> -      /* On PPC32 64bit values are aligned in odd/even register pairs.  */
> -      result = INLINE_SYSCALL (pread, 6, fd, buf, count,
> -			       0, offset >> 31, offset);
> -
> -      return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
>    /* On PPC32 64bit values are aligned in odd/even register pairs.  */
> -  result = INLINE_SYSCALL (pread, 6, fd, buf, count,
> -			       0, offset >> 31, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pread, fd, buf, count, 0, offset >> 31, offset);
>  }
>  
>  strong_alias (__libc_pread, __pread)
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
> index f3dc7e5..75ee34b 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
> @@ -26,28 +26,9 @@
>  ssize_t
>  __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    {
> -      /* On PPC32 64bit values are aligned in odd/even register pairs.  */
> -      result = INLINE_SYSCALL (pread, 6, fd, buf, count,
> -			       0, (long) (offset >> 32),
> -			       (long) offset);
> -
> -      return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
>    /* On PPC32 64bit values are aligned in odd/even register pairs.  */
> -  result = INLINE_SYSCALL (pread, 6, fd, buf, count,
> -			   0, (long) (offset >> 32),
> -			   (long) offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pread, fd, buf, count, 0, (long) (offset >> 32),
> +			 (long) offset);
>  }
>  
>  weak_alias (__libc_pread64, __pread64)
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c
> index 65109ed..fc822d7 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c
> @@ -27,26 +27,8 @@
>  ssize_t
>  __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    {
> -      /* On PPC32 64bit values are aligned in odd/even register pairs.  */
> -      result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
> -			       0, offset >> 31, offset);
> -
> -      return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
>    /* On PPC32 64bit values are aligned in odd/even register pairs.  */
> -  result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
> -			   0, offset >> 31, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pwrite, fd, buf, count, 0, offset >> 31, offset);
>  }
>  
>  strong_alias (__libc_pwrite, __pwrite)
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c
> index 77749c9..dbeaed8 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c
> @@ -26,28 +26,9 @@
>  ssize_t
>  __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    {
>    /* On PPC32 64bit values are aligned in odd/even register pairs.  */
> -      result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
> -			       0, (long) (offset >> 32),
> -			       (long) offset);
> -
> -      return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  /* On PPC32 64bit values are aligned in odd/even register pairs.  */
> -  result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
> -			   0, (long) (offset >> 32),
> -			   (long) offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pwrite, fd, buf, count, 0, (long) (offset >> 32),
> +			 (long) offset);
>  }
>  
>  weak_alias (__libc_pwrite64, __pwrite64)
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> index a4f90b6..69031ba 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> @@ -53,16 +53,10 @@ __libc_fcntl (int fd, int cmd, ...)
>    if (cmd >= F_GETLK64 && cmd <= F_SETLKW64)
>      cmd -= F_GETLK64 - F_GETLK;
>  
> -  if (SINGLE_THREAD_P || cmd != F_SETLKW)
> +  if (cmd != F_SETLKW)
>      return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
>  
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (fcntl, fd, cmd, arg);
>  }
>  libc_hidden_def (__libc_fcntl)
>  
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sync_file_range.c b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sync_file_range.c
> index 18bb0dd..9f46458 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sync_file_range.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sync_file_range.c
> @@ -28,17 +28,7 @@
>  int
>  sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
>  {
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (sync_file_range2, 4, fd, flags, from, to);
> -
> -  int result;
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  result = INLINE_SYSCALL (sync_file_range2, 4, fd, flags, from, to);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (sync_file_range2, fd, flags, from, to);
>  }
>  #else
>  int
> diff --git a/sysdeps/unix/sysv/linux/ppoll.c b/sysdeps/unix/sysv/linux/ppoll.c
> index 6e83424..77a2e7e 100644
> --- a/sysdeps/unix/sysv/linux/ppoll.c
> +++ b/sysdeps/unix/sysv/linux/ppoll.c
> @@ -47,17 +47,7 @@ ppoll (struct pollfd *fds, nfds_t nfds, const struct timespec *timeout,
>  
>    int result;
>  
> -  if (SINGLE_THREAD_P)
> -    result = INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout, sigmask, _NSIG / 8);
> -  else
> -    {
> -      int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -      result = INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout, sigmask,
> -			       _NSIG / 8);
> -
> -      LIBC_CANCEL_RESET (oldtype);
> -    }
> +  result = SYSCALL_CANCEL (ppoll, fds, nfds, timeout, sigmask, _NSIG / 8);
>  
>  # ifndef __ASSUME_PPOLL
>    if (result == -1 && errno == ENOSYS)
> diff --git a/sysdeps/unix/sysv/linux/pread.c b/sysdeps/unix/sysv/linux/pread.c
> index 5c1b174..09389e4 100644
> --- a/sysdeps/unix/sysv/linux/pread.c
> +++ b/sysdeps/unix/sysv/linux/pread.c
> @@ -32,36 +32,17 @@
>  #endif
>  
>  
> -static ssize_t
> -#ifdef NO_CANCELLATION
> -inline __attribute ((always_inline))
> -#endif
> -do_pread (int fd, void *buf, size_t count, off_t offset)
> +ssize_t
> +__libc_pread (int fd, void *buf, size_t count, off_t offset)
>  {
>    ssize_t result;
>  
>    assert (sizeof (offset) == 4);
> -  result = INLINE_SYSCALL (pread, 5, fd, buf, count,
> +  result = SYSCALL_CANCEL (pread, fd, buf, count,
>  			   __LONG_LONG_PAIR (offset >> 31, offset));
>  
>    return result;
>  }
>  
> -
> -ssize_t
> -__libc_pread (int fd, void *buf, size_t count, off_t offset)
> -{
> -  if (SINGLE_THREAD_P)
> -    return do_pread (fd, buf, count, offset);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = do_pread (fd, buf, count, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> -}
> -
>  strong_alias (__libc_pread, __pread)
>  weak_alias (__libc_pread, pread)
> diff --git a/sysdeps/unix/sysv/linux/pread64.c b/sysdeps/unix/sysv/linux/pread64.c
> index a8cfb5d..baf2355 100644
> --- a/sysdeps/unix/sysv/linux/pread64.c
> +++ b/sysdeps/unix/sysv/linux/pread64.c
> @@ -31,32 +31,12 @@
>  #endif
>  
>  
> -static ssize_t
> -do_pread64 (int fd, void *buf, size_t count, off64_t offset)
> -{
> -  ssize_t result;
> -
> -  result = INLINE_SYSCALL (pread, 5, fd, buf, count,
> -			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -					     (off_t) (offset & 0xffffffff)));
> -
> -  return result;
> -}
> -
> -
>  ssize_t
>  __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
>  {
> -  if (SINGLE_THREAD_P)
> -    return do_pread64 (fd, buf, count, offset);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = do_pread64 (fd, buf, count, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pread, fd, buf, count,
> +			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
> +					   (off_t) (offset & 0xffffffff)));
>  }
>  
>  weak_alias (__libc_pread64, __pread64)
> diff --git a/sysdeps/unix/sysv/linux/preadv.c b/sysdeps/unix/sysv/linux/preadv.c
> index 091f9a7..2d08be4 100644
> --- a/sysdeps/unix/sysv/linux/preadv.c
> +++ b/sysdeps/unix/sysv/linux/preadv.c
> @@ -53,18 +53,8 @@ PREADV (int fd, const struct iovec *vector, int count, OFF_T offset)
>  #ifdef __NR_preadv
>    ssize_t result;
>  
> -  if (SINGLE_THREAD_P)
> -    result = INLINE_SYSCALL (preadv, 5, fd, vector, count,
> -			     LO_HI_LONG (offset));
> -  else
> -    {
> -      int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -      result = INLINE_SYSCALL (preadv, 5, fd, vector, count,
> -			       LO_HI_LONG (offset));
> -
> -      LIBC_CANCEL_RESET (oldtype);
> -    }
> +  result = SYSCALL_CANCEL (preadv, fd, vector, count, LO_HI_LONG (offset));
> +
>  # ifdef __ASSUME_PREADV
>    return result;
>  # endif
> diff --git a/sysdeps/unix/sysv/linux/pselect.c b/sysdeps/unix/sysv/linux/pselect.c
> index f342a13..30d51d7 100644
> --- a/sysdeps/unix/sysv/linux/pselect.c
> +++ b/sysdeps/unix/sysv/linux/pselect.c
> @@ -63,22 +63,11 @@ __pselect (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
>  
>  #ifndef CALL_PSELECT6
>  # define CALL_PSELECT6(nfds, readfds, writefds, exceptfds, timeout, data) \
> -  INLINE_SYSCALL (pselect6, 6, nfds, readfds, writefds, exceptfds,	      \
> -		  timeout, data)
> +  SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds,	timeout, data)
>  #endif
>  
> -  if (SINGLE_THREAD_P)
> -    result = CALL_PSELECT6 (nfds, readfds, writefds, exceptfds, timeout,
> -			    &data);
> -  else
> -    {
> -      int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -      result = CALL_PSELECT6 (nfds, readfds, writefds, exceptfds, timeout,
> -			      &data);
> -
> -      LIBC_CANCEL_RESET (oldtype);
> -    }
> +  result = CALL_PSELECT6 (nfds, readfds, writefds, exceptfds, timeout,
> +			  &data);
>  
>  # ifndef __ASSUME_PSELECT
>    if (result == -1 && errno == ENOSYS)
> diff --git a/sysdeps/unix/sysv/linux/pwrite.c b/sysdeps/unix/sysv/linux/pwrite.c
> index 80c2e22..b77985d 100644
> --- a/sysdeps/unix/sysv/linux/pwrite.c
> +++ b/sysdeps/unix/sysv/linux/pwrite.c
> @@ -32,36 +32,17 @@
>  #endif
>  
>  
> -static ssize_t
> -#ifdef NO_CANCELLATION
> -inline __attribute ((always_inline))
> -#endif
> -do_pwrite (int fd, const void *buf, size_t count, off_t offset)
> +ssize_t
> +__libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
>  {
>    ssize_t result;
>  
>    assert (sizeof (offset) == 4);
> -  result = INLINE_SYSCALL (pwrite, 5, fd, buf, count,
> +  result = SYSCALL_CANCEL (pwrite, fd, buf, count,
>  			   __LONG_LONG_PAIR (offset >> 31, offset));
>  
>    return result;
>  }
>  
> -
> -ssize_t
> -__libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
> -{
> -  if (SINGLE_THREAD_P)
> -    return do_pwrite (fd, buf, count, offset);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = do_pwrite (fd, buf, count, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> -}
> -
>  strong_alias (__libc_pwrite, __pwrite)
>  weak_alias (__libc_pwrite, pwrite)
> diff --git a/sysdeps/unix/sysv/linux/pwrite64.c b/sysdeps/unix/sysv/linux/pwrite64.c
> index 7fce75a..a5d0fb7 100644
> --- a/sysdeps/unix/sysv/linux/pwrite64.c
> +++ b/sysdeps/unix/sysv/linux/pwrite64.c
> @@ -31,34 +31,13 @@
>  #endif
>  
>  
> -static ssize_t
> -do_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
> -{
> -  ssize_t result;
> -
> -  result = INLINE_SYSCALL (pwrite, 5, fd, buf, count,
> -			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -					     (off_t) (offset & 0xffffffff)));
> -
> -  return result;
> -}
> -
> -
>  ssize_t
>  __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
>  {
> -  if (SINGLE_THREAD_P)
> -    return do_pwrite64 (fd, buf, count, offset);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = do_pwrite64 (fd, buf, count, offset);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pwrite, fd, buf, count,
> +			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
> +					   (off_t) (offset & 0xffffffff)));
>  }
> -
>  weak_alias (__libc_pwrite64, __pwrite64)
>  libc_hidden_weak (__pwrite64)
>  weak_alias (__libc_pwrite64, pwrite64)
> diff --git a/sysdeps/unix/sysv/linux/pwritev.c b/sysdeps/unix/sysv/linux/pwritev.c
> index 91e58b5..7aa9238 100644
> --- a/sysdeps/unix/sysv/linux/pwritev.c
> +++ b/sysdeps/unix/sysv/linux/pwritev.c
> @@ -53,18 +53,8 @@ PWRITEV (int fd, const struct iovec *vector, int count, OFF_T offset)
>  #ifdef __NR_pwritev
>    ssize_t result;
>  
> -  if (SINGLE_THREAD_P)
> -    result = INLINE_SYSCALL (pwritev, 5, fd, vector, count,
> -			     LO_HI_LONG (offset));
> -  else
> -    {
> -      int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -      result = INLINE_SYSCALL (pwritev, 5, fd, vector, count,
> -			     LO_HI_LONG (offset));
> -
> -      LIBC_CANCEL_RESET (oldtype);
> -    }
> +  result = SYSCALL_CANCEL (pwritev, fd, vector, count, LO_HI_LONG (offset));
> +
>  # ifdef __ASSUME_PWRITEV
>    return result;
>  # endif
> diff --git a/sysdeps/unix/sysv/linux/recvmmsg.c b/sysdeps/unix/sysv/linux/recvmmsg.c
> index 73b3ee0..4063368 100644
> --- a/sysdeps/unix/sysv/linux/recvmmsg.c
> +++ b/sysdeps/unix/sysv/linux/recvmmsg.c
> @@ -37,16 +37,7 @@ int
>  recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
>  	  struct timespec *tmo)
>  {
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (recvmmsg, 5, fd, vmessages, vlen, flags, tmo);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = INLINE_SYSCALL (recvmmsg, 5, fd, vmessages, vlen, flags, tmo);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, tmo);
>  }
>  #elif defined __NR_socketcall
>  # include <socketcall.h>
> diff --git a/sysdeps/unix/sysv/linux/sendmmsg.c b/sysdeps/unix/sysv/linux/sendmmsg.c
> index 7bad328..dc0aa75 100644
> --- a/sysdeps/unix/sysv/linux/sendmmsg.c
> +++ b/sysdeps/unix/sysv/linux/sendmmsg.c
> @@ -36,16 +36,7 @@
>  int
>  __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
>  {
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (sendmmsg, 4, fd, vmessages, vlen, flags);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = INLINE_SYSCALL (sendmmsg, 4, fd, vmessages, vlen, flags);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags);
>  }
>  libc_hidden_def (__sendmmsg)
>  weak_alias (__sendmmsg, sendmmsg)
> diff --git a/sysdeps/unix/sysv/linux/sh/pread.c b/sysdeps/unix/sysv/linux/sh/pread.c
> index 9d4b5de..2f926b3 100644
> --- a/sysdeps/unix/sysv/linux/sh/pread.c
> +++ b/sysdeps/unix/sysv/linux/sh/pread.c
> @@ -35,23 +35,8 @@
>  ssize_t
>  __libc_pread (int fd, void *buf, size_t count, off_t offset)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    {
> -      result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> -			       __LONG_LONG_PAIR (offset >> 31, offset));
> -      return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> -			   __LONG_LONG_PAIR (offset >> 31, offset));
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
> +			 __LONG_LONG_PAIR (offset >> 31, offset));
>  }
>  
>  strong_alias (__libc_pread, __pread)
> diff --git a/sysdeps/unix/sysv/linux/sh/pread64.c b/sysdeps/unix/sysv/linux/sh/pread64.c
> index 195eacc..697718d 100644
> --- a/sysdeps/unix/sysv/linux/sh/pread64.c
> +++ b/sysdeps/unix/sysv/linux/sh/pread64.c
> @@ -34,25 +34,9 @@
>  ssize_t
>  __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    {
> -     result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> -			      __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -			      (off_t) (offset & 0xffffffff)));
> -     return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
> -			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -					     (off_t) (offset & 0xffffffff)));
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
> +			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
> +					   (off_t) (offset & 0xffffffff)));
>  }
>  
>  weak_alias (__libc_pread64, __pread64)
> diff --git a/sysdeps/unix/sysv/linux/sh/pwrite.c b/sysdeps/unix/sysv/linux/sh/pwrite.c
> index c187d0a..fcbb7fc 100644
> --- a/sysdeps/unix/sysv/linux/sh/pwrite.c
> +++ b/sysdeps/unix/sysv/linux/sh/pwrite.c
> @@ -35,23 +35,8 @@
>  ssize_t
>  __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    {
> -      result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> -			       __LONG_LONG_PAIR (offset >> 31, offset));
> -      return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> -			   __LONG_LONG_PAIR (offset >> 31, offset));
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
> +			 __LONG_LONG_PAIR (offset >> 31, offset));
>  }
>  
>  strong_alias (__libc_pwrite, __pwrite)
> diff --git a/sysdeps/unix/sysv/linux/sh/pwrite64.c b/sysdeps/unix/sysv/linux/sh/pwrite64.c
> index 0d15ca2..0c189fe 100644
> --- a/sysdeps/unix/sysv/linux/sh/pwrite64.c
> +++ b/sysdeps/unix/sysv/linux/sh/pwrite64.c
> @@ -34,26 +34,9 @@
>  ssize_t
>  __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
>  {
> -  ssize_t result;
> -
> -  if (SINGLE_THREAD_P)
> -    {
> -     result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> -			      __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -			     (off_t) (offset & 0xffffffff)));
> -
> -     return result;
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
> -			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -					     (off_t) (offset & 0xffffffff)));
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
> +			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
> +					   (off_t) (offset & 0xffffffff)));
>  }
>  
>  weak_alias (__libc_pwrite64, __pwrite64)
> diff --git a/sysdeps/unix/sysv/linux/sigsuspend.c b/sysdeps/unix/sysv/linux/sigsuspend.c
> index 89c5d65..9047623 100644
> --- a/sysdeps/unix/sysv/linux/sigsuspend.c
> +++ b/sysdeps/unix/sysv/linux/sigsuspend.c
> @@ -22,38 +22,13 @@
>  #include <sysdep-cancel.h>
>  #include <sys/syscall.h>
>  
> -
> -static inline int __attribute__ ((always_inline))
> -do_sigsuspend (const sigset_t *set)
> -{
> -  return INLINE_SYSCALL (rt_sigsuspend, 2, set, _NSIG / 8);
> -}
> -
>  /* Change the set of blocked signals to SET,
>     wait until a signal arrives, and restore the set of blocked signals.  */
>  int
>  __sigsuspend (const sigset_t *set)
>  {
> -  if (SINGLE_THREAD_P)
> -    return do_sigsuspend (set);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = do_sigsuspend (set);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (rt_sigsuspend, set, _NSIG / 8);
>  }
>  libc_hidden_def (__sigsuspend)
>  weak_alias (__sigsuspend, sigsuspend)
>  strong_alias (__sigsuspend, __libc_sigsuspend)
> -
> -#ifndef NO_CANCELLATION
> -int
> -__sigsuspend_nocancel (set)
> -     const sigset_t *set;
> -{
> -  return do_sigsuspend (set);
> -}
> -#endif
> diff --git a/sysdeps/unix/sysv/linux/sigtimedwait.c b/sysdeps/unix/sysv/linux/sigtimedwait.c
> index 209198e..a2e5b41 100644
> --- a/sysdeps/unix/sysv/linux/sigtimedwait.c
> +++ b/sysdeps/unix/sysv/linux/sigtimedwait.c
> @@ -25,9 +25,9 @@
>  
>  #ifdef __NR_rt_sigtimedwait
>  
> -static int
> -do_sigtimedwait (const sigset_t *set, siginfo_t *info,
> -		 const struct timespec *timeout)
> +int
> +__sigtimedwait (const sigset_t *set, siginfo_t *info,
> +		const struct timespec *timeout)
>  {
>  #ifdef SIGCANCEL
>    sigset_t tmpset;
> @@ -51,8 +51,7 @@ do_sigtimedwait (const sigset_t *set, siginfo_t *info,
>  
>      /* XXX The size argument hopefully will have to be changed to the
>         real size of the user-level sigset_t.  */
> -  int result = INLINE_SYSCALL (rt_sigtimedwait, 4, set,
> -			       info, timeout, _NSIG / 8);
> +  int result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, timeout, _NSIG / 8);
>  
>    /* The kernel generates a SI_TKILL code in si_code in case tkill is
>       used.  tkill is transparently used in raise().  Since having
> @@ -63,26 +62,6 @@ do_sigtimedwait (const sigset_t *set, siginfo_t *info,
>  
>    return result;
>  }
> -
> -
> -/* Return any pending signal or wait for one for the given time.  */
> -int
> -__sigtimedwait (const sigset_t *set, siginfo_t *info,
> -		const struct timespec *timeout)
> -{
> -  if (SINGLE_THREAD_P)
> -    return do_sigtimedwait (set, info, timeout);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  /* XXX The size argument hopefully will have to be changed to the
> -     real size of the user-level sigset_t.  */
> -  int result = do_sigtimedwait (set, info, timeout);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> -}
>  libc_hidden_def (__sigtimedwait)
>  weak_alias (__sigtimedwait, sigtimedwait)
>  #else
> diff --git a/sysdeps/unix/sysv/linux/sigwaitinfo.c b/sysdeps/unix/sysv/linux/sigwaitinfo.c
> index fe23c9f..47e6dd6 100644
> --- a/sysdeps/unix/sysv/linux/sigwaitinfo.c
> +++ b/sysdeps/unix/sysv/linux/sigwaitinfo.c
> @@ -27,8 +27,9 @@
>  
>  #ifdef __NR_rt_sigtimedwait
>  
> -static int
> -do_sigwaitinfo (const sigset_t *set, siginfo_t *info)
> +/* Return any pending signal or wait for one for the given time.  */
> +int
> +__sigwaitinfo (const sigset_t *set, siginfo_t *info)
>  {
>  #ifdef SIGCANCEL
>    sigset_t tmpset;
> @@ -52,8 +53,7 @@ do_sigwaitinfo (const sigset_t *set, siginfo_t *info)
>  
>    /* XXX The size argument hopefully will have to be changed to the
>       real size of the user-level sigset_t.  */
> -  int result = INLINE_SYSCALL (rt_sigtimedwait, 4, set,
> -			       info, NULL, _NSIG / 8);
> +  int result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, NULL, _NSIG / 8);
>  
>    /* The kernel generates a SI_TKILL code in si_code in case tkill is
>       used.  tkill is transparently used in raise().  Since having
> @@ -65,24 +65,6 @@ do_sigwaitinfo (const sigset_t *set, siginfo_t *info)
>    return result;
>  }
>  
> -
> -/* Return any pending signal or wait for one for the given time.  */
> -int
> -__sigwaitinfo (const sigset_t *set, siginfo_t *info)
> -{
> -  if (SINGLE_THREAD_P)
> -    return do_sigwaitinfo (set, info);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  /* XXX The size argument hopefully will have to be changed to the
> -     real size of the user-level sigset_t.  */
> -  int result = do_sigwaitinfo (set, info);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> -}
>  libc_hidden_def (__sigwaitinfo)
>  weak_alias (__sigwaitinfo, sigwaitinfo)
>  #else
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c b/sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c
> index 8928060..169ac53 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c
> @@ -26,17 +26,7 @@ ssize_t
>  __libc_msgrcv (int msqid, void *msgp, size_t msgsz, long int msgtyp,
>  	       int msgflg)
>  {
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (ipc, 6, IPCOP_msgrcv, msqid, msgsz, msgflg,
> -			   msgp, msgtyp);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = INLINE_SYSCALL (ipc, 6, IPCOP_msgrcv, msqid, msgsz, msgflg,
> -				   msgp, msgtyp);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (ipc, IPCOP_msgrcv, msqid, msgsz, msgflg,
> +			 msgp, msgtyp);
>  }
>  weak_alias (__libc_msgrcv, msgrcv)
> diff --git a/sysdeps/unix/sysv/linux/sync_file_range.c b/sysdeps/unix/sysv/linux/sync_file_range.c
> index c07ece0..2ea6dcf 100644
> --- a/sysdeps/unix/sysv/linux/sync_file_range.c
> +++ b/sysdeps/unix/sysv/linux/sync_file_range.c
> @@ -28,43 +28,18 @@
>  int
>  sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
>  {
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (sync_file_range, 6, fd,
> -			   __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> -			   __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
> -			   flags);
> -
> -  int result;
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  result = INLINE_SYSCALL (sync_file_range, 6, fd,
> -			   __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> -			   __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
> -			   flags);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (sync_file_range, fd,
> +			 __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> +			 __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
> +			 flags);
>  }
>  #elif defined __NR_sync_file_range2
>  int
>  sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
>  {
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (sync_file_range2, 6, fd, flags,
> -			   __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> -			   __LONG_LONG_PAIR ((long) (to >> 32), (long) to));
> -
> -  int result;
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  result = INLINE_SYSCALL (sync_file_range2, 6, fd, flags,
> -			   __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> -			   __LONG_LONG_PAIR ((long) (to >> 32), (long) to));
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (sync_file_range2, fd, flags,
> +			 __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
> +			 __LONG_LONG_PAIR ((long) (to >> 32), (long) to));
>  }
>  #else
>  int
> diff --git a/sysdeps/unix/sysv/linux/tcdrain.c b/sysdeps/unix/sysv/linux/tcdrain.c
> index c0f2e1d..f60dd4d 100644
> --- a/sysdeps/unix/sysv/linux/tcdrain.c
> +++ b/sysdeps/unix/sysv/linux/tcdrain.c
> @@ -24,17 +24,7 @@
>  int
>  __libc_tcdrain (int fd)
>  {
> -  if (SINGLE_THREAD_P)
> -    /* With an argument of 1, TCSBRK for output to be drain.  */
> -    return INLINE_SYSCALL (ioctl, 3, fd, TCSBRK, 1);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
>    /* With an argument of 1, TCSBRK for output to be drain.  */
> -  int result = INLINE_SYSCALL (ioctl, 3, fd, TCSBRK, 1);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (ioctl, fd, TCSBRK, 1);
>  }
>  weak_alias (__libc_tcdrain, tcdrain)
> diff --git a/sysdeps/unix/sysv/linux/timer_routines.c b/sysdeps/unix/sysv/linux/timer_routines.c
> index 4401a8b..4cf6eca 100644
> --- a/sysdeps/unix/sysv/linux/timer_routines.c
> +++ b/sysdeps/unix/sysv/linux/timer_routines.c
> @@ -20,7 +20,7 @@
>  #include <setjmp.h>
>  #include <signal.h>
>  #include <stdbool.h>
> -#include <sysdep.h>
> +#include <sysdep-cancel.h>
>  #include <nptl/pthreadP.h>
>  #include "kernel-posix-timers.h"
>  
> @@ -84,14 +84,9 @@ timer_helper_thread (void *arg)
>        /* sigwaitinfo cannot be used here, since it deletes
>  	 SIGCANCEL == SIGTIMER from the set.  */
>  
> -      int oldtype = LIBC_CANCEL_ASYNC ();
> -
>        /* XXX The size argument hopefully will have to be changed to the
>  	 real size of the user-level sigset_t.  */
> -      int result = INLINE_SYSCALL (rt_sigtimedwait, 4, &ss, &si, NULL,
> -				   _NSIG / 8);
> -
> -      LIBC_CANCEL_RESET (oldtype);
> +      int result = SYSCALL_CANCEL (rt_sigtimedwait, &ss, &si, NULL, _NSIG / 8);
>  
>        if (result > 0)
>  	{
> diff --git a/sysdeps/unix/sysv/linux/wait.c b/sysdeps/unix/sysv/linux/wait.c
> index 029d975..5b76c7c 100644
> --- a/sysdeps/unix/sysv/linux/wait.c
> +++ b/sysdeps/unix/sysv/linux/wait.c
> @@ -26,17 +26,8 @@
>  pid_t
>  __libc_wait (__WAIT_STATUS_DEFN stat_loc)
>  {
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (wait4, 4, WAIT_ANY, stat_loc, 0,
> -			   (struct rusage *) NULL);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  pid_t result = INLINE_SYSCALL (wait4, 4, WAIT_ANY, stat_loc, 0,
> +  pid_t result = SYSCALL_CANCEL (wait4, WAIT_ANY, stat_loc, 0,
>  				 (struct rusage *) NULL);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
>    return result;
>  }
>  
> diff --git a/sysdeps/unix/sysv/linux/waitid.c b/sysdeps/unix/sysv/linux/waitid.c
> index 12d5702..71d3a5a 100644
> --- a/sysdeps/unix/sysv/linux/waitid.c
> +++ b/sysdeps/unix/sysv/linux/waitid.c
> @@ -19,15 +19,14 @@
>  #include <stddef.h>
>  #include <errno.h>
>  #include <sys/wait.h>
> -#include <sysdep.h>
> +#include <sysdep-cancel.h>
>  
> -static inline int
> -do_waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options)
> +int
> +__waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options)
>  {
>    /* The unused fifth argument is a `struct rusage *' that we could
>       pass if we were using waitid to simulate wait3/wait4.  */
> -  return INLINE_SYSCALL (waitid, 5, idtype, id, infop, options, NULL);
> +  return SYSCALL_CANCEL (waitid, idtype, id, infop, options, NULL);
>  }
> -#define NO_DO_WAITID
> -
> -#include "sysdeps/posix/waitid.c"
> +weak_alias (__waitid, waitid)
> +strong_alias (__waitid, __libc_waitid)
> diff --git a/sysdeps/unix/sysv/linux/waitpid.c b/sysdeps/unix/sysv/linux/waitpid.c
> index 0d780da..59d0c9e 100644
> --- a/sysdeps/unix/sysv/linux/waitpid.c
> +++ b/sysdeps/unix/sysv/linux/waitpid.c
> @@ -23,26 +23,11 @@
>  __pid_t
>  __waitpid (__pid_t pid, int *stat_loc, int options)
>  {
> -  if (SINGLE_THREAD_P)
> -    {
>  #ifdef __NR_waitpid
> -      return INLINE_SYSCALL (waitpid, 3, pid, stat_loc, options);
> +  return SYSCALL_CANCEL (waitpid, pid, stat_loc, options);
>  #else
> -      return INLINE_SYSCALL (wait4, 4, pid, stat_loc, options, NULL);
> +  return SYSCALL_CANCEL (wait4, pid, stat_loc, options, NULL);
>  #endif
> -    }
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -#ifdef __NR_waitpid
> -  int result = INLINE_SYSCALL (waitpid, 3, pid, stat_loc, options);
> -#else
> -  int result = INLINE_SYSCALL (wait4, 4, pid, stat_loc, options, NULL);
> -#endif
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
>  }
>  libc_hidden_def (__waitpid)
>  weak_alias (__waitpid, waitpid)
> diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c b/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c
> index c723fef..627ac2a 100644
> --- a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c
> +++ b/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c
> @@ -25,17 +25,7 @@ int
>  fallocate (int fd, int mode, __off_t offset, __off_t len)
>  {
>  #ifdef __NR_fallocate
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
> -
> -  int result;
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (fallocate, fd, mode, offset, len);
>  #else
>    __set_errno (ENOSYS);
>    return -1;
> diff --git a/sysdeps/unix/sysv/linux/wordsize-64/preadv.c b/sysdeps/unix/sysv/linux/wordsize-64/preadv.c
> index 9b3ae70..5e22c4b 100644
> --- a/sysdeps/unix/sysv/linux/wordsize-64/preadv.c
> +++ b/sysdeps/unix/sysv/linux/wordsize-64/preadv.c
> @@ -38,16 +38,7 @@ preadv (int fd, const struct iovec *vector, int count, off_t offset)
>  #ifdef __NR_preadv
>    ssize_t result;
>  
> -  if (SINGLE_THREAD_P)
> -    result = INLINE_SYSCALL (preadv, 4, fd, vector, count, offset);
> -  else
> -    {
> -      int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -      result = INLINE_SYSCALL (preadv, 4, fd, vector, count, offset);
> -
> -      LIBC_CANCEL_RESET (oldtype);
> -    }
> +  result = SYSCALL_CANCEL (preadv, fd, vector, count, offset);
>  # ifdef __ASSUME_PREADV
>    return result;
>  # endif
> diff --git a/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c b/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c
> index 960c8c0..ccf96dd 100644
> --- a/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c
> +++ b/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c
> @@ -38,16 +38,7 @@ pwritev (int fd, const struct iovec *vector, int count, off_t offset)
>  #ifdef __NR_pwritev
>    ssize_t result;
>  
> -  if (SINGLE_THREAD_P)
> -    result = INLINE_SYSCALL (pwritev, 4, fd, vector, count, offset);
> -  else
> -    {
> -      int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -      result = INLINE_SYSCALL (pwritev, 4, fd, vector, count, offset);
> -
> -      LIBC_CANCEL_RESET (oldtype);
> -    }
> +  result = SYSCALL_CANCEL (pwritev, fd, vector, count, offset);
>  # ifdef __ASSUME_PWRITEV
>    return result;
>  # endif
> diff --git a/sysdeps/unix/sysv/linux/x86_64/recv.c b/sysdeps/unix/sysv/linux/x86_64/recv.c
> index 7b956a5..995d11d 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/recv.c
> +++ b/sysdeps/unix/sysv/linux/x86_64/recv.c
> @@ -25,16 +25,7 @@
>  ssize_t
>  __libc_recv (int fd, void *buf, size_t n, int flags)
>  {
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (recvfrom, 6, fd, buf, n, flags, NULL, NULL);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = INLINE_SYSCALL (recvfrom, 6, fd, buf, n, flags, NULL, NULL);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (recvfrom, fd, buf, n, flags, NULL, NULL);
>  }
>  
>  weak_alias (__libc_recv, __recv)
> diff --git a/sysdeps/unix/sysv/linux/x86_64/send.c b/sysdeps/unix/sysv/linux/x86_64/send.c
> index c8dadfa..864a8d5 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/send.c
> +++ b/sysdeps/unix/sysv/linux/x86_64/send.c
> @@ -23,17 +23,7 @@
>  ssize_t
>  __libc_send (int fd, const void *buf, size_t n, int flags)
>  {
> -  if (SINGLE_THREAD_P)
> -    return INLINE_SYSCALL (sendto, 6, fd, buf, n, flags, NULL, (size_t) 0);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  ssize_t result = INLINE_SYSCALL (sendto, 6, fd, buf, n, flags, NULL,
> -				   (size_t) 0);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> +  return SYSCALL_CANCEL (sendto, fd, buf, n, flags, NULL, (size_t) 0);
>  }
>  
>  weak_alias (__libc_send, __send)
>
Siddhesh Poyarekar June 4, 2015, 7:50 p.m. UTC | #2
On Wed, May 20, 2015 at 11:10:37AM -0300, Adhemerval Zanella wrote:
> Hi
> 
> This patch is another of the required adjustments for the fix for bz12683
> (Race conditions in pthread cancellation) and the idea is to remove
> LIBC_CANCEL_ASYNC/LIBC_CANCEL_RESET explicit usage.
> 
> This patch changes the way cancellation entrypoints are defined to
> instead call the macro SYSCALL_CANCEL.  An usual cancellation definition
> is defined as:
> 
>   if (SINGLE_THREAD_P)
>     return INLINE_SYSCALL (syscall, NARGS, args...)
> 
>   int oldtype = LIBC_CANCEL_ASYNC ();
> 
>   return INLINE_SYSCALL (syscall, NARGS, args...)
> 
>   LIBC_CANCEL_RESET (oldtype);
> 
> And it is rewrited as just:
> 
>   SYSCALL_CANCEL (syscall, args...)

Looks fine to me.

Siddhesh
Rich Felker June 4, 2015, 8:07 p.m. UTC | #3
On Wed, May 20, 2015 at 11:10:37AM -0300, Adhemerval Zanella wrote:
> Hi
> 
> This patch is another of the required adjustments for the fix for bz12683
> (Race conditions in pthread cancellation) and the idea is to remove
> LIBC_CANCEL_ASYNC/LIBC_CANCEL_RESET explicit usage.
> 
> This patch changes the way cancellation entrypoints are defined to
> instead call the macro SYSCALL_CANCEL.  An usual cancellation definition
> is defined as:
> 
>   if (SINGLE_THREAD_P)
>     return INLINE_SYSCALL (syscall, NARGS, args...)
> 
>   int oldtype = LIBC_CANCEL_ASYNC ();
> 
>   return INLINE_SYSCALL (syscall, NARGS, args...)
> 
>   LIBC_CANCEL_RESET (oldtype);
> 
> And it is rewrited as just:
> 
>   SYSCALL_CANCEL (syscall, args...)

I haven't reviewed the patch in detail but it looks exactly right in
concept. Happy to see this moving forward!

Rich
diff mbox

Patch

diff --git a/sysdeps/unix/sysdep.h b/sysdeps/unix/sysdep.h
index 5fa6580..52dad58 100644
--- a/sysdeps/unix/sysdep.h
+++ b/sysdeps/unix/sysdep.h
@@ -24,6 +24,27 @@ 
 #define	SYSCALL__(name, args)	PSEUDO (__##name, name, args)
 #define	SYSCALL(name, args)	PSEUDO (name, name, args)
 
+/* Cancellation macros.  */
+#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,n,...) n
+#define __SYSCALL_NARGS(...) \
+  __SYSCALL_NARGS_X (__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0,)
+
+#define SYSCALL_CANCEL(name, ...) \
+  ({									     \
+    long int sc_ret;							     \
+    if (SINGLE_THREAD_P) 						     \
+      sc_ret = INLINE_SYSCALL (name, __SYSCALL_NARGS(__VA_ARGS__),	     \
+			       __VA_ARGS__);				     \
+    else								     \
+      {									     \
+	int sc_cancel_oldtype = LIBC_CANCEL_ASYNC ();			     \
+	sc_ret = INLINE_SYSCALL (name, __SYSCALL_NARGS (__VA_ARGS__),	     \
+				 __VA_ARGS__);				     \
+        LIBC_CANCEL_RESET (sc_cancel_oldtype);				     \
+      }									     \
+    sc_ret;								     \
+  })
+
 /* Machine-dependent sysdep.h files are expected to define the macro
    PSEUDO (function_name, syscall_name) to emit assembly code to define the
    C-callable function FUNCTION_NAME to do system call SYSCALL_NAME.
@@ -31,7 +52,9 @@ 
    an instruction such that "MOVE(r1, r0)" works.  ret should be defined
    as the return instruction.  */
 
+#ifndef SYS_ify
 #define SYS_ify(syscall_name) SYS_##syscall_name
+#endif
 
 /* Terminate a system call named SYM.  This is used on some platforms
    to generate correct debugging information.  */
@@ -47,4 +70,6 @@ 
 
 /* Wrappers around system calls should normally inline the system call code.
    But sometimes it is not possible or implemented and we use this code.  */
+#ifndef INLINE_SYSCALL
 #define INLINE_SYSCALL(name, nr, args...) __syscall_##name (args)
+#endif
diff --git a/sysdeps/unix/sysv/linux/accept4.c b/sysdeps/unix/sysv/linux/accept4.c
index 8e70b81..59293f9 100644
--- a/sysdeps/unix/sysv/linux/accept4.c
+++ b/sysdeps/unix/sysv/linux/accept4.c
@@ -37,17 +37,7 @@ 
 int
 accept4 (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len, int flags)
 {
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (accept4, 4, fd, addr.__sockaddr__, addr_len, flags);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = INLINE_SYSCALL (accept4, 4, fd, addr.__sockaddr__, addr_len,
-			       flags);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (accept4, fd, addr.__sockaddr__, addr_len, flags);
 }
 #elif defined __NR_socketcall
 # include <socketcall.h>
diff --git a/sysdeps/unix/sysv/linux/alpha/fdatasync.c b/sysdeps/unix/sysv/linux/alpha/fdatasync.c
index c9424e2..c8b711e 100644
--- a/sysdeps/unix/sysv/linux/alpha/fdatasync.c
+++ b/sysdeps/unix/sysv/linux/alpha/fdatasync.c
@@ -26,39 +26,23 @@ 
 
 #include <kernel-features.h>
 
-static int
-do_fdatasync (int fd)
+int
+__fdatasync (int fd)
 {
 #ifdef __ASSUME_FDATASYNC
-  return INLINE_SYSCALL (fdatasync, 1, fd);
+  return SYSCALL_CANCEL (fdatasync, fd);
 #elif defined __NR_fdatasync
   static int __have_no_fdatasync;
 
   if (!__builtin_expect (__have_no_fdatasync, 0))
     {
-      int result = INLINE_SYSCALL (fdatasync, 1, fd);
+      int result = SYSCALL_CANCEL (fdatasync, fd);
       if (__builtin_expect (result, 0) != -1 || errno != ENOSYS)
 	return result;
 
       __have_no_fdatasync = 1;
     }
 #endif
-  return INLINE_SYSCALL (fsync, 1, fd);
-}
-
-int
-__fdatasync (int fd)
-{
-  if (SINGLE_THREAD_P)
-    return do_fdatasync (fd);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = do_fdatasync (fd);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (fsync, fd);
 }
-
 weak_alias (__fdatasync, fdatasync)
diff --git a/sysdeps/unix/sysv/linux/arm/pread.c b/sysdeps/unix/sysv/linux/arm/pread.c
index 64bc0a1..91b3c66 100644
--- a/sysdeps/unix/sysv/linux/arm/pread.c
+++ b/sysdeps/unix/sysv/linux/arm/pread.c
@@ -26,28 +26,10 @@ 
 ssize_t
 __libc_pread (int fd, void *buf, size_t count, off_t offset)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    {
-      /* In the ARM EABI, 64-bit values are aligned to even/odd register
-	 pairs for syscalls.  */
-      result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
-			       __LONG_LONG_PAIR (offset >> 31, offset));
-
-      return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
   /* In the ARM EABI, 64-bit values are aligned to even/odd register
      pairs for syscalls.  */
-  result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
-			   __LONG_LONG_PAIR (offset >> 31, offset));
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pread64, fd, buf, count, 0,
+			 __LONG_LONG_PAIR (offset >> 31, offset));
 }
 
 strong_alias (__libc_pread, __pread)
diff --git a/sysdeps/unix/sysv/linux/arm/pread64.c b/sysdeps/unix/sysv/linux/arm/pread64.c
index 7860699..ca71feb 100644
--- a/sysdeps/unix/sysv/linux/arm/pread64.c
+++ b/sysdeps/unix/sysv/linux/arm/pread64.c
@@ -26,30 +26,11 @@ 
 ssize_t
 __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    {
-      /* In the ARM EABI, 64-bit values are aligned to even/odd register
-	 pairs for syscalls.  */
-      result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
-			       __LONG_LONG_PAIR ((off_t) (offset >> 32),
-						 (off_t) (offset & 0xffffffff)));
-
-      return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
   /* In the ARM EABI, 64-bit values are aligned to even/odd register
      pairs for syscalls.  */
-  result = INLINE_SYSCALL (pread64, 6, fd, buf, count, 0,
-			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
-					     (off_t) (offset & 0xffffffff)));
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pread64, fd, buf, count, 0,
+			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
+					   (off_t) (offset & 0xffffffff)));
 }
 
 weak_alias (__libc_pread64, __pread64)
diff --git a/sysdeps/unix/sysv/linux/arm/pwrite.c b/sysdeps/unix/sysv/linux/arm/pwrite.c
index 11a963c..e22e112 100644
--- a/sysdeps/unix/sysv/linux/arm/pwrite.c
+++ b/sysdeps/unix/sysv/linux/arm/pwrite.c
@@ -26,28 +26,10 @@ 
 ssize_t
 __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    {
-      /* In the ARM EABI, 64-bit values are aligned to even/odd register
-	 pairs for syscalls.  */
-      result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
-			       __LONG_LONG_PAIR (offset >> 31, offset));
-
-      return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
   /* In the ARM EABI, 64-bit values are aligned to even/odd register
      pairs for syscalls.  */
-  result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
-			   __LONG_LONG_PAIR (offset >> 31, offset));
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pwrite64, fd, buf, count, 0,
+			 __LONG_LONG_PAIR (offset >> 31, offset));
 }
 
 strong_alias (__libc_pwrite, __pwrite)
diff --git a/sysdeps/unix/sysv/linux/arm/pwrite64.c b/sysdeps/unix/sysv/linux/arm/pwrite64.c
index 9cb67ff..b63fbc8 100644
--- a/sysdeps/unix/sysv/linux/arm/pwrite64.c
+++ b/sysdeps/unix/sysv/linux/arm/pwrite64.c
@@ -26,30 +26,11 @@ 
 ssize_t
 __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    {
-      /* In the ARM EABI, 64-bit values are aligned to even/odd register
-	 pairs for syscalls.  */
-      result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
-			       __LONG_LONG_PAIR ((off_t) (offset >> 32),
-						 (off_t) (offset & 0xffffffff)));
-
-      return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
   /* In the ARM EABI, 64-bit values are aligned to even/odd register
      pairs for syscalls.  */
-  result = INLINE_SYSCALL (pwrite64, 6, fd, buf, count, 0,
-			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
-					     (off_t) (offset & 0xffffffff)));
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pwrite64, fd, buf, count, 0,
+			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
+					   (off_t) (offset & 0xffffffff)));
 }
 
 weak_alias (__libc_pwrite64, __pwrite64)
diff --git a/sysdeps/unix/sysv/linux/epoll_pwait.c b/sysdeps/unix/sysv/linux/epoll_pwait.c
index 65fefec..0e39013 100644
--- a/sysdeps/unix/sysv/linux/epoll_pwait.c
+++ b/sysdeps/unix/sysv/linux/epoll_pwait.c
@@ -39,18 +39,8 @@  int epoll_pwait (int epfd, struct epoll_event *events,
 		 int maxevents, int timeout,
 		 const sigset_t *set)
 {
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (epoll_pwait, 6, epfd, events, maxevents, timeout,
-			   set, _NSIG / 8);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = INLINE_SYSCALL (epoll_pwait, 6, epfd, events, maxevents,
-			       timeout, set, _NSIG / 8);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (epoll_pwait, epfd, events, maxevents,
+			 timeout, set, _NSIG / 8);
 }
 
 #else
diff --git a/sysdeps/unix/sysv/linux/fallocate.c b/sysdeps/unix/sysv/linux/fallocate.c
index e9668bf..f3de90c 100644
--- a/sysdeps/unix/sysv/linux/fallocate.c
+++ b/sysdeps/unix/sysv/linux/fallocate.c
@@ -25,21 +25,9 @@  int
 fallocate (int fd, int mode, __off_t offset, __off_t len)
 {
 #ifdef __NR_fallocate
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (fallocate, 6, fd, mode,
-			   __LONG_LONG_PAIR (offset >> 31, offset),
-			   __LONG_LONG_PAIR (len >> 31, len));
-
-  int result;
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  result = INLINE_SYSCALL (fallocate, 6, fd, mode,
-			   __LONG_LONG_PAIR (offset >> 31, offset),
-			   __LONG_LONG_PAIR (len >> 31, len));
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (fallocate, fd, mode,
+			 __LONG_LONG_PAIR (offset >> 31, offset),
+			 __LONG_LONG_PAIR (len >> 31, len));
 #else
   __set_errno (ENOSYS);
   return -1;
diff --git a/sysdeps/unix/sysv/linux/fallocate64.c b/sysdeps/unix/sysv/linux/fallocate64.c
index 96acb28..191fa57 100644
--- a/sysdeps/unix/sysv/linux/fallocate64.c
+++ b/sysdeps/unix/sysv/linux/fallocate64.c
@@ -25,25 +25,11 @@  int
 fallocate64 (int fd, int mode, __off64_t offset, __off64_t len)
 {
 #ifdef __NR_fallocate
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (fallocate, 6, fd, mode,
-			   __LONG_LONG_PAIR ((long int) (offset >> 32),
-					     (long int) offset),
-			   __LONG_LONG_PAIR ((long int) (len >> 32),
-					     (long int) len));
-
-  int result;
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  result = INLINE_SYSCALL (fallocate, 6, fd, mode,
-			   __LONG_LONG_PAIR ((long int) (offset >> 32),
-					     (long int) offset),
-			   __LONG_LONG_PAIR ((long int) (len >> 32),
-					     (long int) len));
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (fallocate, fd, mode,
+			 __LONG_LONG_PAIR ((long int) (offset >> 32),
+					   (long int) offset),
+			 __LONG_LONG_PAIR ((long int) (len >> 32),
+					   (long int) len));
 #else
   __set_errno (ENOSYS);
   return -1;
diff --git a/sysdeps/unix/sysv/linux/generic/open.c b/sysdeps/unix/sysv/linux/generic/open.c
index 289f57a..66cc2ed 100644
--- a/sysdeps/unix/sysv/linux/generic/open.c
+++ b/sysdeps/unix/sysv/linux/generic/open.c
@@ -37,16 +37,7 @@  __libc_open (const char *file, int oflag, ...)
       va_end (arg);
     }
 
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (openat, 4, AT_FDCWD, file, oflag, mode);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = INLINE_SYSCALL (openat, 4, AT_FDCWD, file, oflag, mode);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (openat, AT_FDCWD, file, oflag, mode);
 }
 libc_hidden_def (__libc_open)
 
diff --git a/sysdeps/unix/sysv/linux/generic/open64.c b/sysdeps/unix/sysv/linux/generic/open64.c
index 374e41c..402bc7c 100644
--- a/sysdeps/unix/sysv/linux/generic/open64.c
+++ b/sysdeps/unix/sysv/linux/generic/open64.c
@@ -37,18 +37,7 @@  __libc_open64 (const char *file, int oflag, ...)
       va_end (arg);
     }
 
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (openat, 4, AT_FDCWD, file,
-                           oflag | O_LARGEFILE, mode);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = INLINE_SYSCALL (openat, 4, AT_FDCWD, file,
-                               oflag | O_LARGEFILE, mode);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (openat, AT_FDCWD, file, oflag | O_LARGEFILE, mode);
 }
 weak_alias (__libc_open64, __open64)
 libc_hidden_weak (__open64)
diff --git a/sysdeps/unix/sysv/linux/generic/pause.c b/sysdeps/unix/sysv/linux/generic/pause.c
index 7966df2..45d3a0e 100644
--- a/sysdeps/unix/sysv/linux/generic/pause.c
+++ b/sysdeps/unix/sysv/linux/generic/pause.c
@@ -23,41 +23,17 @@ 
 /* Suspend the process until a signal arrives.
    This always returns -1 and sets errno to EINTR.  */
 
-static int
-__syscall_pause (void)
+int
+__libc_pause (void)
 {
   sigset_t set;
 
   int rc =
-    INLINE_SYSCALL (rt_sigprocmask, 4, SIG_BLOCK, NULL, &set, _NSIG / 8);
+    SYSCALL_CANCEL (rt_sigprocmask, SIG_BLOCK, NULL, &set, _NSIG / 8);
   if (rc == 0)
-    rc = INLINE_SYSCALL (rt_sigsuspend, 2, &set, _NSIG / 8);
+    rc = SYSCALL_CANCEL (rt_sigsuspend, &set, _NSIG / 8);
 
   return rc;
 }
 
-int
-__libc_pause (void)
-{
-  if (SINGLE_THREAD_P)
-    return __syscall_pause ();
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = __syscall_pause ();
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
-}
 weak_alias (__libc_pause, pause)
-
-#ifndef NO_CANCELLATION
-# include <not-cancel.h>
-
-int
-__pause_nocancel (void)
-{
-  return __syscall_pause ();
-}
-#endif
diff --git a/sysdeps/unix/sysv/linux/generic/poll.c b/sysdeps/unix/sysv/linux/generic/poll.c
index 7ef42f3..2a95796 100644
--- a/sysdeps/unix/sysv/linux/generic/poll.c
+++ b/sysdeps/unix/sysv/linux/generic/poll.c
@@ -35,16 +35,7 @@  __poll (struct pollfd *fds, nfds_t nfds, int timeout)
       timeout_ts_p = &timeout_ts;
     }
 
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout_ts_p, NULL, 0);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout_ts_p, NULL, 0);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (ppoll, fds, nfds, timeout_ts_p, NULL, 0);
 }
 libc_hidden_def (__poll)
 weak_alias (__poll, poll)
diff --git a/sysdeps/unix/sysv/linux/generic/recv.c b/sysdeps/unix/sysv/linux/generic/recv.c
index d827b3e..3786172 100644
--- a/sysdeps/unix/sysv/linux/generic/recv.c
+++ b/sysdeps/unix/sysv/linux/generic/recv.c
@@ -24,22 +24,8 @@ 
 ssize_t
 __libc_recv (int sockfd, void *buffer, size_t len, int flags)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    result = INLINE_SYSCALL (recvfrom, 6, sockfd, buffer, len, flags,
-                             NULL, NULL);
-  else
-    {
-      int oldtype = LIBC_CANCEL_ASYNC ();
-
-      result = INLINE_SYSCALL (recvfrom, 6, sockfd, buffer, len, flags,
-                               NULL, NULL);
-
-      LIBC_CANCEL_RESET (oldtype);
-    }
-
-  return result;
+  return SYSCALL_CANCEL (recvfrom, sockfd, buffer, len, flags,
+			 NULL, NULL);
 }
 strong_alias (__libc_recv, __recv)
 weak_alias (__libc_recv, recv)
diff --git a/sysdeps/unix/sysv/linux/generic/select.c b/sysdeps/unix/sysv/linux/generic/select.c
index 455c308..f7f1e18 100644
--- a/sysdeps/unix/sysv/linux/generic/select.c
+++ b/sysdeps/unix/sysv/linux/generic/select.c
@@ -42,20 +42,8 @@  __select(int nfds, fd_set *readfds,
       tsp = &ts;
     }
 
-  if (SINGLE_THREAD_P)
-    {
-      result = INLINE_SYSCALL (pselect6, 6, nfds, readfds, writefds, exceptfds,
-                               tsp, NULL);
-    }
-  else
-    {
-      int oldtype = LIBC_CANCEL_ASYNC ();
-
-      result = INLINE_SYSCALL (pselect6, 6, nfds, readfds, writefds, exceptfds,
-                               tsp, NULL);
-
-      LIBC_CANCEL_RESET (oldtype);
-    }
+  result = SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds, tsp,
+			   NULL);
 
   if (timeout)
     {
diff --git a/sysdeps/unix/sysv/linux/generic/send.c b/sysdeps/unix/sysv/linux/generic/send.c
index dfbdc09..fed6961 100644
--- a/sysdeps/unix/sysv/linux/generic/send.c
+++ b/sysdeps/unix/sysv/linux/generic/send.c
@@ -24,20 +24,7 @@ 
 ssize_t
 __libc_send (int sockfd, const void *buffer, size_t len, int flags)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    result = INLINE_SYSCALL (sendto, 6, sockfd, buffer, len, flags, NULL, 0);
-  else
-    {
-      int oldtype = LIBC_CANCEL_ASYNC ();
-
-      result = INLINE_SYSCALL (sendto, 6, sockfd, buffer, len, flags, NULL, 0);
-
-      LIBC_CANCEL_RESET (oldtype);
-    }
-
-  return result;
+  return SYSCALL_CANCEL (sendto, sockfd, buffer, len, flags, NULL, 0);
 }
 strong_alias (__libc_send, __send)
 weak_alias (__libc_send, send)
diff --git a/sysdeps/unix/sysv/linux/generic/sysdep.h b/sysdeps/unix/sysv/linux/generic/sysdep.h
index 160804c..11da9d2 100644
--- a/sysdeps/unix/sysv/linux/generic/sysdep.h
+++ b/sysdeps/unix/sysv/linux/generic/sysdep.h
@@ -18,6 +18,7 @@ 
 
 #include <bits/wordsize.h>
 #include <kernel-features.h>
+#include <sysdeps/unix/sysdep.h>
 
 /* Provide the common name to allow more code reuse.  */
 #define __NR__llseek __NR_llseek
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c
index ad97e97..6f9703c 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c
@@ -25,28 +25,13 @@ 
 #include <sysdep-cancel.h>
 #include <sys/syscall.h>
 
-static ssize_t
-do_pread (int fd, void *buf, size_t count, off_t offset)
+ssize_t
+__libc_pread (int fd, void *buf, size_t count, off_t offset)
 {
   assert (sizeof (offset) == 4);
-  return INLINE_SYSCALL (pread64, __ALIGNMENT_COUNT (5, 6), fd,
+  return SYSCALL_CANCEL (pread64, fd,
                          buf, count, __ALIGNMENT_ARG
                          __LONG_LONG_PAIR (offset >> 31, offset));
 }
-
-ssize_t
-__libc_pread (int fd, void *buf, size_t count, off_t offset)
-{
-  if (SINGLE_THREAD_P)
-    return do_pread (fd, buf, count, offset);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = do_pread (fd, buf, count, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
-}
 strong_alias (__libc_pread, __pread)
 weak_alias (__libc_pread, pread)
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
index 7250893..a3f8ec1 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
@@ -24,29 +24,11 @@ 
 #include <sysdep-cancel.h>
 #include <sys/syscall.h>
 
-static ssize_t
-do_pread64 (int fd, void *buf, size_t count, off64_t offset)
-{
-  return INLINE_SYSCALL (pread64, __ALIGNMENT_COUNT (5, 6), fd,
-                         buf, count, __ALIGNMENT_ARG
-                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
-                                           (off_t) (offset & 0xffffffff)));
-}
-
-
 ssize_t
 __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
 {
-  if (SINGLE_THREAD_P)
-    return do_pread64 (fd, buf, count, offset);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = do_pread64 (fd, buf, count, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pread64, fd, buf, count, __ALIGNMENT_ARG
+                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
+                                           (off_t) (offset & 0xffffffff)));
 }
-
 weak_alias (__libc_pread64, __pread64) weak_alias (__libc_pread64, pread64)
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
index 9a1832a..d127fee 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv.c
@@ -26,28 +26,13 @@ 
 #include <sysdep-cancel.h>
 #include <sys/syscall.h>
 
-static ssize_t
-do_preadv (int fd, const struct iovec *vector, int count, off_t offset)
+ssize_t
+__libc_preadv (int fd, const struct iovec *vector, int count, off_t offset)
 {
   assert (sizeof (offset) == 4);
-  return INLINE_SYSCALL (preadv, __ALIGNMENT_COUNT (5, 6), fd,
+  return SYSCALL_CANCEL (preadv, fd,
                          vector, count, __ALIGNMENT_ARG
                          __LONG_LONG_PAIR (offset >> 31, offset));
 }
-
-ssize_t
-__libc_preadv (int fd, const struct iovec *vector, int count, off_t offset)
-{
-  if (SINGLE_THREAD_P)
-    return do_preadv (fd, vector, count, offset);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = do_preadv (fd, vector, count, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
-}
 strong_alias (__libc_preadv, __preadv)
 weak_alias (__libc_preadv, preadv)
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
index df1c010..7e7ebf7 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/preadv64.c
@@ -25,30 +25,14 @@ 
 #include <sysdep-cancel.h>
 #include <sys/syscall.h>
 
-static ssize_t
-do_preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
+ssize_t
+__libc_preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
 {
-  return INLINE_SYSCALL (preadv, __ALIGNMENT_COUNT (5, 6), fd,
+  return SYSCALL_CANCEL (preadv, fd,
                          vector, count, __ALIGNMENT_ARG
                          __LONG_LONG_PAIR ((off_t) (offset >> 32),
                                            (off_t) (offset & 0xffffffff)));
 }
 
-
-ssize_t
-__libc_preadv64 (int fd, const struct iovec *vector, int count, off64_t offset)
-{
-  if (SINGLE_THREAD_P)
-    return do_preadv64 (fd, vector, count, offset);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = do_preadv64 (fd, vector, count, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
-}
-
 strong_alias (__libc_preadv64, __preadv64)
 weak_alias (__libc_preadv64, preadv64)
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c
index e897c7d..2f0f7a1 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite.c
@@ -25,29 +25,12 @@ 
 #include <sysdep-cancel.h>
 #include <sys/syscall.h>
 
-static ssize_t
-do_pwrite (int fd, const void *buf, size_t count, off_t offset)
-{
-  assert (sizeof (offset) == 4);
-  return INLINE_SYSCALL (pwrite64, __ALIGNMENT_COUNT (5, 6), fd,
-                         buf, count, __ALIGNMENT_ARG
-                         __LONG_LONG_PAIR (offset >> 31, offset));
-}
-
-
 ssize_t
 __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
 {
-  if (SINGLE_THREAD_P)
-    return do_pwrite (fd, buf, count, offset);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = do_pwrite (fd, buf, count, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  assert (sizeof (offset) == 4);
+  return SYSCALL_CANCEL (pwrite64, fd, buf, count, __ALIGNMENT_ARG
+                         __LONG_LONG_PAIR (offset >> 31, offset));
 }
 strong_alias (__libc_pwrite, __pwrite)
 weak_alias (__libc_pwrite, pwrite)
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c
index 3ac1339..f222016 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwrite64.c
@@ -24,30 +24,12 @@ 
 #include <sysdep-cancel.h>
 #include <sys/syscall.h>
 
-static ssize_t
-do_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
-{
-  return INLINE_SYSCALL (pwrite64, __ALIGNMENT_COUNT (5, 6), fd,
-                         buf, count, __ALIGNMENT_ARG
-                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
-                                           (off_t) (offset & 0xffffffff)));
-}
-
-
 ssize_t
 __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
 {
-  if (SINGLE_THREAD_P)
-    return do_pwrite64 (fd, buf, count, offset);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = do_pwrite64 (fd, buf, count, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pwrite64, fd, buf, count, __ALIGNMENT_ARG
+                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
+                                           (off_t) (offset & 0xffffffff)));
 }
-
 weak_alias (__libc_pwrite64, __pwrite64)
 libc_hidden_weak (__pwrite64) weak_alias (__libc_pwrite64, pwrite64)
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
index db1e4cb..273b0ff 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev.c
@@ -26,29 +26,12 @@ 
 #include <sysdep-cancel.h>
 #include <sys/syscall.h>
 
-static ssize_t
-do_pwritev (int fd, const struct iovec *vector, int count, off_t offset)
-{
-  assert (sizeof (offset) == 4);
-  return INLINE_SYSCALL (pwritev, __ALIGNMENT_COUNT (5, 6), fd,
-                         vector, count, __ALIGNMENT_ARG
-                         __LONG_LONG_PAIR (offset >> 31, offset));
-}
-
-
 ssize_t
 __libc_pwritev (int fd, const struct iovec *vector, int count, off_t offset)
 {
-  if (SINGLE_THREAD_P)
-    return do_pwritev (fd, vector, count, offset);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = do_pwritev (fd, vector, count, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  assert (sizeof (offset) == 4);
+  return SYSCALL_CANCEL (pwritev, fd, vector, count, __ALIGNMENT_ARG
+                         __LONG_LONG_PAIR (offset >> 31, offset));
 }
 strong_alias (__libc_pwritev, __pwritev)
 weak_alias (__libc_pwritev, pwritev)
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c
index eb85e07..9d3fa75 100644
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c
+++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/pwritev64.c
@@ -25,31 +25,14 @@ 
 #include <sysdep-cancel.h>
 #include <sys/syscall.h>
 
-static ssize_t
-do_pwritev64 (int fd, const struct iovec *vector, int count, off64_t offset)
-{
-  return INLINE_SYSCALL (pwritev, __ALIGNMENT_COUNT (5, 6), fd,
-                         vector, count, __ALIGNMENT_ARG
-                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
-                                           (off_t) (offset & 0xffffffff)));
-}
-
-
 ssize_t
 __libc_pwritev64 (int fd, const struct iovec *vector, int count,
                   off64_t offset)
 {
-  if (SINGLE_THREAD_P)
-    return do_pwritev64 (fd, vector, count, offset);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = do_pwritev64 (fd, vector, count, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pwritev, fd,
+                         vector, count, __ALIGNMENT_ARG
+                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
+                                           (off_t) (offset & 0xffffffff)));
 }
-
 strong_alias (__libc_pwritev64, pwritev64)
 weak_alias (__libc_pwritev64, __pwritev64)
diff --git a/sysdeps/unix/sysv/linux/i386/fcntl.c b/sysdeps/unix/sysv/linux/i386/fcntl.c
index 9132c5a..56f4bd1 100644
--- a/sysdeps/unix/sysv/linux/i386/fcntl.c
+++ b/sysdeps/unix/sysv/linux/i386/fcntl.c
@@ -49,16 +49,10 @@  __libc_fcntl (int fd, int cmd, ...)
   arg = va_arg (ap, void *);
   va_end (ap);
 
-  if (SINGLE_THREAD_P || (cmd != F_SETLKW && cmd != F_SETLKW64))
+  if ((cmd != F_SETLKW) && (cmd != F_SETLKW64))
     return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
 
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (fcntl64, fd, cmd, arg);
 }
 libc_hidden_def (__libc_fcntl)
 
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c b/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c
index 3c91d15..b79e44d 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c
+++ b/sysdeps/unix/sysv/linux/mips/mips32/sync_file_range.c
@@ -28,23 +28,10 @@ 
 int
 sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
 {
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (sync_file_range, 7, fd, 0,
-			   __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
-			   __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
-			   flags);
-
-  int result;
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  result = INLINE_SYSCALL (sync_file_range, 7, fd, 0,
-			   __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
-			   __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
-			   flags);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (sync_file_range, fd, 0,
+			 __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
+			 __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
+			 flags);
 }
 #else
 int
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c
index 2331cec..ce29a0e 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c
@@ -25,17 +25,7 @@  int
 fallocate (int fd, int mode, __off_t offset, __off_t len)
 {
 #ifdef __NR_fallocate
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
-
-  int result;
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (fallocate, fd, mode, offset, len);
 #else
   __set_errno (ENOSYS);
   return -1;
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c
index d3ed5d1..077127e 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c
@@ -25,17 +25,7 @@  int
 fallocate64 (int fd, int mode, __off64_t offset, __off64_t len)
 {
 #ifdef __NR_fallocate
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
-
-  int result;
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (fallocate, fd, mode, offset, len);
 #else
   __set_errno (ENOSYS);
   return -1;
diff --git a/sysdeps/unix/sysv/linux/mips/pread.c b/sysdeps/unix/sysv/linux/mips/pread.c
index a7b1618..0bd712d 100644
--- a/sysdeps/unix/sysv/linux/mips/pread.c
+++ b/sysdeps/unix/sysv/linux/mips/pread.c
@@ -38,35 +38,16 @@ 
 ssize_t
 __libc_pread (int fd, void *buf, size_t count, off_t offset)
 {
-  ssize_t result;
-
 #if _MIPS_SIM != _ABI64
   assert (sizeof (offset) == 4);
 #endif
 
-  if (SINGLE_THREAD_P)
-    {
-#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
-      result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
-#else
-      result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
-			       __LONG_LONG_PAIR (offset >> 31, offset));
-#endif
-      return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
 #if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
-  result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
+  return SYSCALL_CANCEL (pread, fd, buf, count, offset);
 #else
-  result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
-			   __LONG_LONG_PAIR (offset >> 31, offset));
+  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
+			 __LONG_LONG_PAIR (offset >> 31, offset));
 #endif
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
 }
 
 strong_alias (__libc_pread, __pread)
diff --git a/sysdeps/unix/sysv/linux/mips/pread64.c b/sysdeps/unix/sysv/linux/mips/pread64.c
index ad948aa..3ed100b 100644
--- a/sysdeps/unix/sysv/linux/mips/pread64.c
+++ b/sysdeps/unix/sysv/linux/mips/pread64.c
@@ -37,34 +37,13 @@ 
 ssize_t
 __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
 {
-  ssize_t result;
-
-
-  if (SINGLE_THREAD_P)
-    {
 #if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
-      result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
+  return SYSCALL_CANCEL (pread, fd, buf, count, offset);
 #else
-     result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
-			      __LONG_LONG_PAIR ((off_t) (offset >> 32),
-			      (off_t) (offset & 0xffffffff)));
+  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
+			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
+					   (off_t) (offset & 0xffffffff)));
 #endif
-     return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
-  result = INLINE_SYSCALL (pread, 4, fd, buf, count, offset);
-#else
-  result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
-			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
-					     (off_t) (offset & 0xffffffff)));
-#endif
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
 }
 
 weak_alias (__libc_pread64, __pread64)
diff --git a/sysdeps/unix/sysv/linux/mips/pwrite.c b/sysdeps/unix/sysv/linux/mips/pwrite.c
index 2c38e04..f4d71d4 100644
--- a/sysdeps/unix/sysv/linux/mips/pwrite.c
+++ b/sysdeps/unix/sysv/linux/mips/pwrite.c
@@ -38,35 +38,16 @@ 
 ssize_t
 __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
 {
-  ssize_t result;
-
 #if _MIPS_SIM != _ABI64
   assert (sizeof (offset) == 4);
 #endif
 
-  if (SINGLE_THREAD_P)
-    {
-#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
-      result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
-#else
-      result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
-			       __LONG_LONG_PAIR (offset >> 31, offset));
-#endif
-      return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
 #if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
-  result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
+  return SYSCALL_CANCEL (pwrite, fd, buf, count, offset);
 #else
-  result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
-			   __LONG_LONG_PAIR (offset >> 31, offset));
+  return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
+			 __LONG_LONG_PAIR (offset >> 31, offset));
 #endif
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
 }
 
 strong_alias (__libc_pwrite, __pwrite)
diff --git a/sysdeps/unix/sysv/linux/mips/pwrite64.c b/sysdeps/unix/sysv/linux/mips/pwrite64.c
index 504c88a..ac0dc40 100644
--- a/sysdeps/unix/sysv/linux/mips/pwrite64.c
+++ b/sysdeps/unix/sysv/linux/mips/pwrite64.c
@@ -37,34 +37,13 @@ 
 ssize_t
 __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    {
 #if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
-      result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
+  return SYSCALL_CANCEL (pwrite, fd, buf, count, offset);
 #else
-     result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
-			      __LONG_LONG_PAIR ((off_t) (offset >> 32),
-			     (off_t) (offset & 0xffffffff)));
+  return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
+			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
+					   (off_t) (offset & 0xffffffff)));
 #endif
-
-     return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
-  result = INLINE_SYSCALL (pwrite, 4, fd, buf, count, offset);
-#else
-  result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
-			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
-					     (off_t) (offset & 0xffffffff)));
-#endif
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
 }
 
 weak_alias (__libc_pwrite64, __pwrite64)
diff --git a/sysdeps/unix/sysv/linux/msgrcv.c b/sysdeps/unix/sysv/linux/msgrcv.c
index 1c3698c..660ff29 100644
--- a/sysdeps/unix/sysv/linux/msgrcv.c
+++ b/sysdeps/unix/sysv/linux/msgrcv.c
@@ -43,16 +43,6 @@  __libc_msgrcv (int msqid, void *msgp, size_t msgsz, long int msgtyp,
   tmp.msgp = msgp;
   tmp.msgtyp = msgtyp;
 
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (ipc, 5, IPCOP_msgrcv, msqid, msgsz, msgflg, &tmp);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = INLINE_SYSCALL (ipc, 5, IPCOP_msgrcv, msqid, msgsz, msgflg,
-				   &tmp);
-
-   LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (ipc, IPCOP_msgrcv, msqid, msgsz, msgflg, &tmp);
 }
 weak_alias (__libc_msgrcv, msgrcv)
diff --git a/sysdeps/unix/sysv/linux/msgsnd.c b/sysdeps/unix/sysv/linux/msgsnd.c
index d548aab..dfed539 100644
--- a/sysdeps/unix/sysv/linux/msgsnd.c
+++ b/sysdeps/unix/sysv/linux/msgsnd.c
@@ -26,17 +26,7 @@ 
 int
 __libc_msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg)
 {
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (ipc, 5, IPCOP_msgsnd, msqid, msgsz,
-			   msgflg, (void *) msgp);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = INLINE_SYSCALL (ipc, 5, IPCOP_msgsnd, msqid, msgsz,
-			       msgflg, (void *) msgp);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (ipc, IPCOP_msgsnd, msqid, msgsz, msgflg,
+			 (void *) msgp);
 }
 weak_alias (__libc_msgsnd, msgsnd)
diff --git a/sysdeps/unix/sysv/linux/open64.c b/sysdeps/unix/sysv/linux/open64.c
index d3ab813..b90294a 100644
--- a/sysdeps/unix/sysv/linux/open64.c
+++ b/sysdeps/unix/sysv/linux/open64.c
@@ -36,16 +36,7 @@  __libc_open64 (const char *file, int oflag, ...)
       va_end (arg);
     }
 
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (open, 3, file, oflag | O_LARGEFILE, mode);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = INLINE_SYSCALL (open, 3, file, oflag | O_LARGEFILE, mode);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (open, file, oflag | O_LARGEFILE, mode);
 }
 weak_alias (__libc_open64, __open64)
 libc_hidden_weak (__open64)
diff --git a/sysdeps/unix/sysv/linux/openat.c b/sysdeps/unix/sysv/linux/openat.c
index 30d8e6e..6777123 100644
--- a/sysdeps/unix/sysv/linux/openat.c
+++ b/sysdeps/unix/sysv/linux/openat.c
@@ -68,16 +68,7 @@  __OPENAT (int fd, const char *file, int oflag, ...)
       va_end (arg);
     }
 
-  if (SINGLE_THREAD_P)
-    return OPENAT_NOT_CANCEL (fd, file, oflag, mode);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int res = OPENAT_NOT_CANCEL (fd, file, oflag, mode);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return res;
+  return SYSCALL_CANCEL (openat, fd, file, oflag, mode);
 }
 libc_hidden_def (__OPENAT)
 weak_alias (__OPENAT, OPENAT)
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c
index 10763f5..f6b7f43 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c
@@ -26,26 +26,8 @@ 
 ssize_t
 __libc_pread (int fd, void *buf, size_t count, off_t offset)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    {
-      /* On PPC32 64bit values are aligned in odd/even register pairs.  */
-      result = INLINE_SYSCALL (pread, 6, fd, buf, count,
-			       0, offset >> 31, offset);
-
-      return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
   /* On PPC32 64bit values are aligned in odd/even register pairs.  */
-  result = INLINE_SYSCALL (pread, 6, fd, buf, count,
-			       0, offset >> 31, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pread, fd, buf, count, 0, offset >> 31, offset);
 }
 
 strong_alias (__libc_pread, __pread)
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
index f3dc7e5..75ee34b 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
@@ -26,28 +26,9 @@ 
 ssize_t
 __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    {
-      /* On PPC32 64bit values are aligned in odd/even register pairs.  */
-      result = INLINE_SYSCALL (pread, 6, fd, buf, count,
-			       0, (long) (offset >> 32),
-			       (long) offset);
-
-      return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
   /* On PPC32 64bit values are aligned in odd/even register pairs.  */
-  result = INLINE_SYSCALL (pread, 6, fd, buf, count,
-			   0, (long) (offset >> 32),
-			   (long) offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pread, fd, buf, count, 0, (long) (offset >> 32),
+			 (long) offset);
 }
 
 weak_alias (__libc_pread64, __pread64)
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c
index 65109ed..fc822d7 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite.c
@@ -27,26 +27,8 @@ 
 ssize_t
 __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    {
-      /* On PPC32 64bit values are aligned in odd/even register pairs.  */
-      result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
-			       0, offset >> 31, offset);
-
-      return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
   /* On PPC32 64bit values are aligned in odd/even register pairs.  */
-  result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
-			   0, offset >> 31, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pwrite, fd, buf, count, 0, offset >> 31, offset);
 }
 
 strong_alias (__libc_pwrite, __pwrite)
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c
index 77749c9..dbeaed8 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pwrite64.c
@@ -26,28 +26,9 @@ 
 ssize_t
 __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    {
   /* On PPC32 64bit values are aligned in odd/even register pairs.  */
-      result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
-			       0, (long) (offset >> 32),
-			       (long) offset);
-
-      return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  /* On PPC32 64bit values are aligned in odd/even register pairs.  */
-  result = INLINE_SYSCALL (pwrite, 6, fd, buf, count,
-			   0, (long) (offset >> 32),
-			   (long) offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pwrite, fd, buf, count, 0, (long) (offset >> 32),
+			 (long) offset);
 }
 
 weak_alias (__libc_pwrite64, __pwrite64)
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
index a4f90b6..69031ba 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
@@ -53,16 +53,10 @@  __libc_fcntl (int fd, int cmd, ...)
   if (cmd >= F_GETLK64 && cmd <= F_SETLKW64)
     cmd -= F_GETLK64 - F_GETLK;
 
-  if (SINGLE_THREAD_P || cmd != F_SETLKW)
+  if (cmd != F_SETLKW)
     return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
 
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (fcntl, fd, cmd, arg);
 }
 libc_hidden_def (__libc_fcntl)
 
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sync_file_range.c b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sync_file_range.c
index 18bb0dd..9f46458 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sync_file_range.c
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sync_file_range.c
@@ -28,17 +28,7 @@ 
 int
 sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
 {
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (sync_file_range2, 4, fd, flags, from, to);
-
-  int result;
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  result = INLINE_SYSCALL (sync_file_range2, 4, fd, flags, from, to);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (sync_file_range2, fd, flags, from, to);
 }
 #else
 int
diff --git a/sysdeps/unix/sysv/linux/ppoll.c b/sysdeps/unix/sysv/linux/ppoll.c
index 6e83424..77a2e7e 100644
--- a/sysdeps/unix/sysv/linux/ppoll.c
+++ b/sysdeps/unix/sysv/linux/ppoll.c
@@ -47,17 +47,7 @@  ppoll (struct pollfd *fds, nfds_t nfds, const struct timespec *timeout,
 
   int result;
 
-  if (SINGLE_THREAD_P)
-    result = INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout, sigmask, _NSIG / 8);
-  else
-    {
-      int oldtype = LIBC_CANCEL_ASYNC ();
-
-      result = INLINE_SYSCALL (ppoll, 5, fds, nfds, timeout, sigmask,
-			       _NSIG / 8);
-
-      LIBC_CANCEL_RESET (oldtype);
-    }
+  result = SYSCALL_CANCEL (ppoll, fds, nfds, timeout, sigmask, _NSIG / 8);
 
 # ifndef __ASSUME_PPOLL
   if (result == -1 && errno == ENOSYS)
diff --git a/sysdeps/unix/sysv/linux/pread.c b/sysdeps/unix/sysv/linux/pread.c
index 5c1b174..09389e4 100644
--- a/sysdeps/unix/sysv/linux/pread.c
+++ b/sysdeps/unix/sysv/linux/pread.c
@@ -32,36 +32,17 @@ 
 #endif
 
 
-static ssize_t
-#ifdef NO_CANCELLATION
-inline __attribute ((always_inline))
-#endif
-do_pread (int fd, void *buf, size_t count, off_t offset)
+ssize_t
+__libc_pread (int fd, void *buf, size_t count, off_t offset)
 {
   ssize_t result;
 
   assert (sizeof (offset) == 4);
-  result = INLINE_SYSCALL (pread, 5, fd, buf, count,
+  result = SYSCALL_CANCEL (pread, fd, buf, count,
 			   __LONG_LONG_PAIR (offset >> 31, offset));
 
   return result;
 }
 
-
-ssize_t
-__libc_pread (int fd, void *buf, size_t count, off_t offset)
-{
-  if (SINGLE_THREAD_P)
-    return do_pread (fd, buf, count, offset);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = do_pread (fd, buf, count, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
-}
-
 strong_alias (__libc_pread, __pread)
 weak_alias (__libc_pread, pread)
diff --git a/sysdeps/unix/sysv/linux/pread64.c b/sysdeps/unix/sysv/linux/pread64.c
index a8cfb5d..baf2355 100644
--- a/sysdeps/unix/sysv/linux/pread64.c
+++ b/sysdeps/unix/sysv/linux/pread64.c
@@ -31,32 +31,12 @@ 
 #endif
 
 
-static ssize_t
-do_pread64 (int fd, void *buf, size_t count, off64_t offset)
-{
-  ssize_t result;
-
-  result = INLINE_SYSCALL (pread, 5, fd, buf, count,
-			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
-					     (off_t) (offset & 0xffffffff)));
-
-  return result;
-}
-
-
 ssize_t
 __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
 {
-  if (SINGLE_THREAD_P)
-    return do_pread64 (fd, buf, count, offset);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = do_pread64 (fd, buf, count, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pread, fd, buf, count,
+			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
+					   (off_t) (offset & 0xffffffff)));
 }
 
 weak_alias (__libc_pread64, __pread64)
diff --git a/sysdeps/unix/sysv/linux/preadv.c b/sysdeps/unix/sysv/linux/preadv.c
index 091f9a7..2d08be4 100644
--- a/sysdeps/unix/sysv/linux/preadv.c
+++ b/sysdeps/unix/sysv/linux/preadv.c
@@ -53,18 +53,8 @@  PREADV (int fd, const struct iovec *vector, int count, OFF_T offset)
 #ifdef __NR_preadv
   ssize_t result;
 
-  if (SINGLE_THREAD_P)
-    result = INLINE_SYSCALL (preadv, 5, fd, vector, count,
-			     LO_HI_LONG (offset));
-  else
-    {
-      int oldtype = LIBC_CANCEL_ASYNC ();
-
-      result = INLINE_SYSCALL (preadv, 5, fd, vector, count,
-			       LO_HI_LONG (offset));
-
-      LIBC_CANCEL_RESET (oldtype);
-    }
+  result = SYSCALL_CANCEL (preadv, fd, vector, count, LO_HI_LONG (offset));
+
 # ifdef __ASSUME_PREADV
   return result;
 # endif
diff --git a/sysdeps/unix/sysv/linux/pselect.c b/sysdeps/unix/sysv/linux/pselect.c
index f342a13..30d51d7 100644
--- a/sysdeps/unix/sysv/linux/pselect.c
+++ b/sysdeps/unix/sysv/linux/pselect.c
@@ -63,22 +63,11 @@  __pselect (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
 
 #ifndef CALL_PSELECT6
 # define CALL_PSELECT6(nfds, readfds, writefds, exceptfds, timeout, data) \
-  INLINE_SYSCALL (pselect6, 6, nfds, readfds, writefds, exceptfds,	      \
-		  timeout, data)
+  SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds,	timeout, data)
 #endif
 
-  if (SINGLE_THREAD_P)
-    result = CALL_PSELECT6 (nfds, readfds, writefds, exceptfds, timeout,
-			    &data);
-  else
-    {
-      int oldtype = LIBC_CANCEL_ASYNC ();
-
-      result = CALL_PSELECT6 (nfds, readfds, writefds, exceptfds, timeout,
-			      &data);
-
-      LIBC_CANCEL_RESET (oldtype);
-    }
+  result = CALL_PSELECT6 (nfds, readfds, writefds, exceptfds, timeout,
+			  &data);
 
 # ifndef __ASSUME_PSELECT
   if (result == -1 && errno == ENOSYS)
diff --git a/sysdeps/unix/sysv/linux/pwrite.c b/sysdeps/unix/sysv/linux/pwrite.c
index 80c2e22..b77985d 100644
--- a/sysdeps/unix/sysv/linux/pwrite.c
+++ b/sysdeps/unix/sysv/linux/pwrite.c
@@ -32,36 +32,17 @@ 
 #endif
 
 
-static ssize_t
-#ifdef NO_CANCELLATION
-inline __attribute ((always_inline))
-#endif
-do_pwrite (int fd, const void *buf, size_t count, off_t offset)
+ssize_t
+__libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
 {
   ssize_t result;
 
   assert (sizeof (offset) == 4);
-  result = INLINE_SYSCALL (pwrite, 5, fd, buf, count,
+  result = SYSCALL_CANCEL (pwrite, fd, buf, count,
 			   __LONG_LONG_PAIR (offset >> 31, offset));
 
   return result;
 }
 
-
-ssize_t
-__libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
-{
-  if (SINGLE_THREAD_P)
-    return do_pwrite (fd, buf, count, offset);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = do_pwrite (fd, buf, count, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
-}
-
 strong_alias (__libc_pwrite, __pwrite)
 weak_alias (__libc_pwrite, pwrite)
diff --git a/sysdeps/unix/sysv/linux/pwrite64.c b/sysdeps/unix/sysv/linux/pwrite64.c
index 7fce75a..a5d0fb7 100644
--- a/sysdeps/unix/sysv/linux/pwrite64.c
+++ b/sysdeps/unix/sysv/linux/pwrite64.c
@@ -31,34 +31,13 @@ 
 #endif
 
 
-static ssize_t
-do_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
-{
-  ssize_t result;
-
-  result = INLINE_SYSCALL (pwrite, 5, fd, buf, count,
-			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
-					     (off_t) (offset & 0xffffffff)));
-
-  return result;
-}
-
-
 ssize_t
 __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
 {
-  if (SINGLE_THREAD_P)
-    return do_pwrite64 (fd, buf, count, offset);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = do_pwrite64 (fd, buf, count, offset);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pwrite, fd, buf, count,
+			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
+					   (off_t) (offset & 0xffffffff)));
 }
-
 weak_alias (__libc_pwrite64, __pwrite64)
 libc_hidden_weak (__pwrite64)
 weak_alias (__libc_pwrite64, pwrite64)
diff --git a/sysdeps/unix/sysv/linux/pwritev.c b/sysdeps/unix/sysv/linux/pwritev.c
index 91e58b5..7aa9238 100644
--- a/sysdeps/unix/sysv/linux/pwritev.c
+++ b/sysdeps/unix/sysv/linux/pwritev.c
@@ -53,18 +53,8 @@  PWRITEV (int fd, const struct iovec *vector, int count, OFF_T offset)
 #ifdef __NR_pwritev
   ssize_t result;
 
-  if (SINGLE_THREAD_P)
-    result = INLINE_SYSCALL (pwritev, 5, fd, vector, count,
-			     LO_HI_LONG (offset));
-  else
-    {
-      int oldtype = LIBC_CANCEL_ASYNC ();
-
-      result = INLINE_SYSCALL (pwritev, 5, fd, vector, count,
-			     LO_HI_LONG (offset));
-
-      LIBC_CANCEL_RESET (oldtype);
-    }
+  result = SYSCALL_CANCEL (pwritev, fd, vector, count, LO_HI_LONG (offset));
+
 # ifdef __ASSUME_PWRITEV
   return result;
 # endif
diff --git a/sysdeps/unix/sysv/linux/recvmmsg.c b/sysdeps/unix/sysv/linux/recvmmsg.c
index 73b3ee0..4063368 100644
--- a/sysdeps/unix/sysv/linux/recvmmsg.c
+++ b/sysdeps/unix/sysv/linux/recvmmsg.c
@@ -37,16 +37,7 @@  int
 recvmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags,
 	  struct timespec *tmo)
 {
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (recvmmsg, 5, fd, vmessages, vlen, flags, tmo);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = INLINE_SYSCALL (recvmmsg, 5, fd, vmessages, vlen, flags, tmo);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (recvmmsg, fd, vmessages, vlen, flags, tmo);
 }
 #elif defined __NR_socketcall
 # include <socketcall.h>
diff --git a/sysdeps/unix/sysv/linux/sendmmsg.c b/sysdeps/unix/sysv/linux/sendmmsg.c
index 7bad328..dc0aa75 100644
--- a/sysdeps/unix/sysv/linux/sendmmsg.c
+++ b/sysdeps/unix/sysv/linux/sendmmsg.c
@@ -36,16 +36,7 @@ 
 int
 __sendmmsg (int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
 {
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (sendmmsg, 4, fd, vmessages, vlen, flags);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = INLINE_SYSCALL (sendmmsg, 4, fd, vmessages, vlen, flags);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (sendmmsg, fd, vmessages, vlen, flags);
 }
 libc_hidden_def (__sendmmsg)
 weak_alias (__sendmmsg, sendmmsg)
diff --git a/sysdeps/unix/sysv/linux/sh/pread.c b/sysdeps/unix/sysv/linux/sh/pread.c
index 9d4b5de..2f926b3 100644
--- a/sysdeps/unix/sysv/linux/sh/pread.c
+++ b/sysdeps/unix/sysv/linux/sh/pread.c
@@ -35,23 +35,8 @@ 
 ssize_t
 __libc_pread (int fd, void *buf, size_t count, off_t offset)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    {
-      result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
-			       __LONG_LONG_PAIR (offset >> 31, offset));
-      return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
-			   __LONG_LONG_PAIR (offset >> 31, offset));
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
+			 __LONG_LONG_PAIR (offset >> 31, offset));
 }
 
 strong_alias (__libc_pread, __pread)
diff --git a/sysdeps/unix/sysv/linux/sh/pread64.c b/sysdeps/unix/sysv/linux/sh/pread64.c
index 195eacc..697718d 100644
--- a/sysdeps/unix/sysv/linux/sh/pread64.c
+++ b/sysdeps/unix/sysv/linux/sh/pread64.c
@@ -34,25 +34,9 @@ 
 ssize_t
 __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    {
-     result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
-			      __LONG_LONG_PAIR ((off_t) (offset >> 32),
-			      (off_t) (offset & 0xffffffff)));
-     return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  result = INLINE_SYSCALL (pread, 6, fd, buf, count, 0,
-			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
-					     (off_t) (offset & 0xffffffff)));
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
+			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
+					   (off_t) (offset & 0xffffffff)));
 }
 
 weak_alias (__libc_pread64, __pread64)
diff --git a/sysdeps/unix/sysv/linux/sh/pwrite.c b/sysdeps/unix/sysv/linux/sh/pwrite.c
index c187d0a..fcbb7fc 100644
--- a/sysdeps/unix/sysv/linux/sh/pwrite.c
+++ b/sysdeps/unix/sysv/linux/sh/pwrite.c
@@ -35,23 +35,8 @@ 
 ssize_t
 __libc_pwrite (int fd, const void *buf, size_t count, off_t offset)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    {
-      result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
-			       __LONG_LONG_PAIR (offset >> 31, offset));
-      return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
-			   __LONG_LONG_PAIR (offset >> 31, offset));
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
+			 __LONG_LONG_PAIR (offset >> 31, offset));
 }
 
 strong_alias (__libc_pwrite, __pwrite)
diff --git a/sysdeps/unix/sysv/linux/sh/pwrite64.c b/sysdeps/unix/sysv/linux/sh/pwrite64.c
index 0d15ca2..0c189fe 100644
--- a/sysdeps/unix/sysv/linux/sh/pwrite64.c
+++ b/sysdeps/unix/sysv/linux/sh/pwrite64.c
@@ -34,26 +34,9 @@ 
 ssize_t
 __libc_pwrite64 (int fd, const void *buf, size_t count, off64_t offset)
 {
-  ssize_t result;
-
-  if (SINGLE_THREAD_P)
-    {
-     result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
-			      __LONG_LONG_PAIR ((off_t) (offset >> 32),
-			     (off_t) (offset & 0xffffffff)));
-
-     return result;
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  result = INLINE_SYSCALL (pwrite, 6, fd, buf, count, 0,
-			   __LONG_LONG_PAIR ((off_t) (offset >> 32),
-					     (off_t) (offset & 0xffffffff)));
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (pwrite, fd, buf, count, 0,
+			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
+					   (off_t) (offset & 0xffffffff)));
 }
 
 weak_alias (__libc_pwrite64, __pwrite64)
diff --git a/sysdeps/unix/sysv/linux/sigsuspend.c b/sysdeps/unix/sysv/linux/sigsuspend.c
index 89c5d65..9047623 100644
--- a/sysdeps/unix/sysv/linux/sigsuspend.c
+++ b/sysdeps/unix/sysv/linux/sigsuspend.c
@@ -22,38 +22,13 @@ 
 #include <sysdep-cancel.h>
 #include <sys/syscall.h>
 
-
-static inline int __attribute__ ((always_inline))
-do_sigsuspend (const sigset_t *set)
-{
-  return INLINE_SYSCALL (rt_sigsuspend, 2, set, _NSIG / 8);
-}
-
 /* Change the set of blocked signals to SET,
    wait until a signal arrives, and restore the set of blocked signals.  */
 int
 __sigsuspend (const sigset_t *set)
 {
-  if (SINGLE_THREAD_P)
-    return do_sigsuspend (set);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = do_sigsuspend (set);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (rt_sigsuspend, set, _NSIG / 8);
 }
 libc_hidden_def (__sigsuspend)
 weak_alias (__sigsuspend, sigsuspend)
 strong_alias (__sigsuspend, __libc_sigsuspend)
-
-#ifndef NO_CANCELLATION
-int
-__sigsuspend_nocancel (set)
-     const sigset_t *set;
-{
-  return do_sigsuspend (set);
-}
-#endif
diff --git a/sysdeps/unix/sysv/linux/sigtimedwait.c b/sysdeps/unix/sysv/linux/sigtimedwait.c
index 209198e..a2e5b41 100644
--- a/sysdeps/unix/sysv/linux/sigtimedwait.c
+++ b/sysdeps/unix/sysv/linux/sigtimedwait.c
@@ -25,9 +25,9 @@ 
 
 #ifdef __NR_rt_sigtimedwait
 
-static int
-do_sigtimedwait (const sigset_t *set, siginfo_t *info,
-		 const struct timespec *timeout)
+int
+__sigtimedwait (const sigset_t *set, siginfo_t *info,
+		const struct timespec *timeout)
 {
 #ifdef SIGCANCEL
   sigset_t tmpset;
@@ -51,8 +51,7 @@  do_sigtimedwait (const sigset_t *set, siginfo_t *info,
 
     /* XXX The size argument hopefully will have to be changed to the
        real size of the user-level sigset_t.  */
-  int result = INLINE_SYSCALL (rt_sigtimedwait, 4, set,
-			       info, timeout, _NSIG / 8);
+  int result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, timeout, _NSIG / 8);
 
   /* The kernel generates a SI_TKILL code in si_code in case tkill is
      used.  tkill is transparently used in raise().  Since having
@@ -63,26 +62,6 @@  do_sigtimedwait (const sigset_t *set, siginfo_t *info,
 
   return result;
 }
-
-
-/* Return any pending signal or wait for one for the given time.  */
-int
-__sigtimedwait (const sigset_t *set, siginfo_t *info,
-		const struct timespec *timeout)
-{
-  if (SINGLE_THREAD_P)
-    return do_sigtimedwait (set, info, timeout);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  /* XXX The size argument hopefully will have to be changed to the
-     real size of the user-level sigset_t.  */
-  int result = do_sigtimedwait (set, info, timeout);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
-}
 libc_hidden_def (__sigtimedwait)
 weak_alias (__sigtimedwait, sigtimedwait)
 #else
diff --git a/sysdeps/unix/sysv/linux/sigwaitinfo.c b/sysdeps/unix/sysv/linux/sigwaitinfo.c
index fe23c9f..47e6dd6 100644
--- a/sysdeps/unix/sysv/linux/sigwaitinfo.c
+++ b/sysdeps/unix/sysv/linux/sigwaitinfo.c
@@ -27,8 +27,9 @@ 
 
 #ifdef __NR_rt_sigtimedwait
 
-static int
-do_sigwaitinfo (const sigset_t *set, siginfo_t *info)
+/* Return any pending signal or wait for one for the given time.  */
+int
+__sigwaitinfo (const sigset_t *set, siginfo_t *info)
 {
 #ifdef SIGCANCEL
   sigset_t tmpset;
@@ -52,8 +53,7 @@  do_sigwaitinfo (const sigset_t *set, siginfo_t *info)
 
   /* XXX The size argument hopefully will have to be changed to the
      real size of the user-level sigset_t.  */
-  int result = INLINE_SYSCALL (rt_sigtimedwait, 4, set,
-			       info, NULL, _NSIG / 8);
+  int result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, NULL, _NSIG / 8);
 
   /* The kernel generates a SI_TKILL code in si_code in case tkill is
      used.  tkill is transparently used in raise().  Since having
@@ -65,24 +65,6 @@  do_sigwaitinfo (const sigset_t *set, siginfo_t *info)
   return result;
 }
 
-
-/* Return any pending signal or wait for one for the given time.  */
-int
-__sigwaitinfo (const sigset_t *set, siginfo_t *info)
-{
-  if (SINGLE_THREAD_P)
-    return do_sigwaitinfo (set, info);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  /* XXX The size argument hopefully will have to be changed to the
-     real size of the user-level sigset_t.  */
-  int result = do_sigwaitinfo (set, info);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
-}
 libc_hidden_def (__sigwaitinfo)
 weak_alias (__sigwaitinfo, sigwaitinfo)
 #else
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c b/sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c
index 8928060..169ac53 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/msgrcv.c
@@ -26,17 +26,7 @@  ssize_t
 __libc_msgrcv (int msqid, void *msgp, size_t msgsz, long int msgtyp,
 	       int msgflg)
 {
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (ipc, 6, IPCOP_msgrcv, msqid, msgsz, msgflg,
-			   msgp, msgtyp);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = INLINE_SYSCALL (ipc, 6, IPCOP_msgrcv, msqid, msgsz, msgflg,
-				   msgp, msgtyp);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (ipc, IPCOP_msgrcv, msqid, msgsz, msgflg,
+			 msgp, msgtyp);
 }
 weak_alias (__libc_msgrcv, msgrcv)
diff --git a/sysdeps/unix/sysv/linux/sync_file_range.c b/sysdeps/unix/sysv/linux/sync_file_range.c
index c07ece0..2ea6dcf 100644
--- a/sysdeps/unix/sysv/linux/sync_file_range.c
+++ b/sysdeps/unix/sysv/linux/sync_file_range.c
@@ -28,43 +28,18 @@ 
 int
 sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
 {
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (sync_file_range, 6, fd,
-			   __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
-			   __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
-			   flags);
-
-  int result;
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  result = INLINE_SYSCALL (sync_file_range, 6, fd,
-			   __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
-			   __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
-			   flags);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (sync_file_range, fd,
+			 __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
+			 __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
+			 flags);
 }
 #elif defined __NR_sync_file_range2
 int
 sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
 {
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (sync_file_range2, 6, fd, flags,
-			   __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
-			   __LONG_LONG_PAIR ((long) (to >> 32), (long) to));
-
-  int result;
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  result = INLINE_SYSCALL (sync_file_range2, 6, fd, flags,
-			   __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
-			   __LONG_LONG_PAIR ((long) (to >> 32), (long) to));
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (sync_file_range2, fd, flags,
+			 __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
+			 __LONG_LONG_PAIR ((long) (to >> 32), (long) to));
 }
 #else
 int
diff --git a/sysdeps/unix/sysv/linux/tcdrain.c b/sysdeps/unix/sysv/linux/tcdrain.c
index c0f2e1d..f60dd4d 100644
--- a/sysdeps/unix/sysv/linux/tcdrain.c
+++ b/sysdeps/unix/sysv/linux/tcdrain.c
@@ -24,17 +24,7 @@ 
 int
 __libc_tcdrain (int fd)
 {
-  if (SINGLE_THREAD_P)
-    /* With an argument of 1, TCSBRK for output to be drain.  */
-    return INLINE_SYSCALL (ioctl, 3, fd, TCSBRK, 1);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
   /* With an argument of 1, TCSBRK for output to be drain.  */
-  int result = INLINE_SYSCALL (ioctl, 3, fd, TCSBRK, 1);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (ioctl, fd, TCSBRK, 1);
 }
 weak_alias (__libc_tcdrain, tcdrain)
diff --git a/sysdeps/unix/sysv/linux/timer_routines.c b/sysdeps/unix/sysv/linux/timer_routines.c
index 4401a8b..4cf6eca 100644
--- a/sysdeps/unix/sysv/linux/timer_routines.c
+++ b/sysdeps/unix/sysv/linux/timer_routines.c
@@ -20,7 +20,7 @@ 
 #include <setjmp.h>
 #include <signal.h>
 #include <stdbool.h>
-#include <sysdep.h>
+#include <sysdep-cancel.h>
 #include <nptl/pthreadP.h>
 #include "kernel-posix-timers.h"
 
@@ -84,14 +84,9 @@  timer_helper_thread (void *arg)
       /* sigwaitinfo cannot be used here, since it deletes
 	 SIGCANCEL == SIGTIMER from the set.  */
 
-      int oldtype = LIBC_CANCEL_ASYNC ();
-
       /* XXX The size argument hopefully will have to be changed to the
 	 real size of the user-level sigset_t.  */
-      int result = INLINE_SYSCALL (rt_sigtimedwait, 4, &ss, &si, NULL,
-				   _NSIG / 8);
-
-      LIBC_CANCEL_RESET (oldtype);
+      int result = SYSCALL_CANCEL (rt_sigtimedwait, &ss, &si, NULL, _NSIG / 8);
 
       if (result > 0)
 	{
diff --git a/sysdeps/unix/sysv/linux/wait.c b/sysdeps/unix/sysv/linux/wait.c
index 029d975..5b76c7c 100644
--- a/sysdeps/unix/sysv/linux/wait.c
+++ b/sysdeps/unix/sysv/linux/wait.c
@@ -26,17 +26,8 @@ 
 pid_t
 __libc_wait (__WAIT_STATUS_DEFN stat_loc)
 {
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (wait4, 4, WAIT_ANY, stat_loc, 0,
-			   (struct rusage *) NULL);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  pid_t result = INLINE_SYSCALL (wait4, 4, WAIT_ANY, stat_loc, 0,
+  pid_t result = SYSCALL_CANCEL (wait4, WAIT_ANY, stat_loc, 0,
 				 (struct rusage *) NULL);
-
-  LIBC_CANCEL_RESET (oldtype);
-
   return result;
 }
 
diff --git a/sysdeps/unix/sysv/linux/waitid.c b/sysdeps/unix/sysv/linux/waitid.c
index 12d5702..71d3a5a 100644
--- a/sysdeps/unix/sysv/linux/waitid.c
+++ b/sysdeps/unix/sysv/linux/waitid.c
@@ -19,15 +19,14 @@ 
 #include <stddef.h>
 #include <errno.h>
 #include <sys/wait.h>
-#include <sysdep.h>
+#include <sysdep-cancel.h>
 
-static inline int
-do_waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options)
+int
+__waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options)
 {
   /* The unused fifth argument is a `struct rusage *' that we could
      pass if we were using waitid to simulate wait3/wait4.  */
-  return INLINE_SYSCALL (waitid, 5, idtype, id, infop, options, NULL);
+  return SYSCALL_CANCEL (waitid, idtype, id, infop, options, NULL);
 }
-#define NO_DO_WAITID
-
-#include "sysdeps/posix/waitid.c"
+weak_alias (__waitid, waitid)
+strong_alias (__waitid, __libc_waitid)
diff --git a/sysdeps/unix/sysv/linux/waitpid.c b/sysdeps/unix/sysv/linux/waitpid.c
index 0d780da..59d0c9e 100644
--- a/sysdeps/unix/sysv/linux/waitpid.c
+++ b/sysdeps/unix/sysv/linux/waitpid.c
@@ -23,26 +23,11 @@ 
 __pid_t
 __waitpid (__pid_t pid, int *stat_loc, int options)
 {
-  if (SINGLE_THREAD_P)
-    {
 #ifdef __NR_waitpid
-      return INLINE_SYSCALL (waitpid, 3, pid, stat_loc, options);
+  return SYSCALL_CANCEL (waitpid, pid, stat_loc, options);
 #else
-      return INLINE_SYSCALL (wait4, 4, pid, stat_loc, options, NULL);
+  return SYSCALL_CANCEL (wait4, pid, stat_loc, options, NULL);
 #endif
-    }
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-#ifdef __NR_waitpid
-  int result = INLINE_SYSCALL (waitpid, 3, pid, stat_loc, options);
-#else
-  int result = INLINE_SYSCALL (wait4, 4, pid, stat_loc, options, NULL);
-#endif
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
 }
 libc_hidden_def (__waitpid)
 weak_alias (__waitpid, waitpid)
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c b/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c
index c723fef..627ac2a 100644
--- a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c
+++ b/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c
@@ -25,17 +25,7 @@  int
 fallocate (int fd, int mode, __off_t offset, __off_t len)
 {
 #ifdef __NR_fallocate
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
-
-  int result;
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (fallocate, fd, mode, offset, len);
 #else
   __set_errno (ENOSYS);
   return -1;
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/preadv.c b/sysdeps/unix/sysv/linux/wordsize-64/preadv.c
index 9b3ae70..5e22c4b 100644
--- a/sysdeps/unix/sysv/linux/wordsize-64/preadv.c
+++ b/sysdeps/unix/sysv/linux/wordsize-64/preadv.c
@@ -38,16 +38,7 @@  preadv (int fd, const struct iovec *vector, int count, off_t offset)
 #ifdef __NR_preadv
   ssize_t result;
 
-  if (SINGLE_THREAD_P)
-    result = INLINE_SYSCALL (preadv, 4, fd, vector, count, offset);
-  else
-    {
-      int oldtype = LIBC_CANCEL_ASYNC ();
-
-      result = INLINE_SYSCALL (preadv, 4, fd, vector, count, offset);
-
-      LIBC_CANCEL_RESET (oldtype);
-    }
+  result = SYSCALL_CANCEL (preadv, fd, vector, count, offset);
 # ifdef __ASSUME_PREADV
   return result;
 # endif
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c b/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c
index 960c8c0..ccf96dd 100644
--- a/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c
+++ b/sysdeps/unix/sysv/linux/wordsize-64/pwritev.c
@@ -38,16 +38,7 @@  pwritev (int fd, const struct iovec *vector, int count, off_t offset)
 #ifdef __NR_pwritev
   ssize_t result;
 
-  if (SINGLE_THREAD_P)
-    result = INLINE_SYSCALL (pwritev, 4, fd, vector, count, offset);
-  else
-    {
-      int oldtype = LIBC_CANCEL_ASYNC ();
-
-      result = INLINE_SYSCALL (pwritev, 4, fd, vector, count, offset);
-
-      LIBC_CANCEL_RESET (oldtype);
-    }
+  result = SYSCALL_CANCEL (pwritev, fd, vector, count, offset);
 # ifdef __ASSUME_PWRITEV
   return result;
 # endif
diff --git a/sysdeps/unix/sysv/linux/x86_64/recv.c b/sysdeps/unix/sysv/linux/x86_64/recv.c
index 7b956a5..995d11d 100644
--- a/sysdeps/unix/sysv/linux/x86_64/recv.c
+++ b/sysdeps/unix/sysv/linux/x86_64/recv.c
@@ -25,16 +25,7 @@ 
 ssize_t
 __libc_recv (int fd, void *buf, size_t n, int flags)
 {
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (recvfrom, 6, fd, buf, n, flags, NULL, NULL);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = INLINE_SYSCALL (recvfrom, 6, fd, buf, n, flags, NULL, NULL);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (recvfrom, fd, buf, n, flags, NULL, NULL);
 }
 
 weak_alias (__libc_recv, __recv)
diff --git a/sysdeps/unix/sysv/linux/x86_64/send.c b/sysdeps/unix/sysv/linux/x86_64/send.c
index c8dadfa..864a8d5 100644
--- a/sysdeps/unix/sysv/linux/x86_64/send.c
+++ b/sysdeps/unix/sysv/linux/x86_64/send.c
@@ -23,17 +23,7 @@ 
 ssize_t
 __libc_send (int fd, const void *buf, size_t n, int flags)
 {
-  if (SINGLE_THREAD_P)
-    return INLINE_SYSCALL (sendto, 6, fd, buf, n, flags, NULL, (size_t) 0);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  ssize_t result = INLINE_SYSCALL (sendto, 6, fd, buf, n, flags, NULL,
-				   (size_t) 0);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
+  return SYSCALL_CANCEL (sendto, fd, buf, n, flags, NULL, (size_t) 0);
 }
 
 weak_alias (__libc_send, __send)