This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 1/2] Add nocancel version of pread64()


On 8/5/19 5:54 PM, Leandro Pereira wrote:
> This is in preparation for changes in the dynamic linker so that pread() is used instead of lseek()+read().
> 
> 2019-08-05  Leandro Pereira  <leandro.pereira@microsoft.com>
> 
> 	* sysdeps/generic/not-cancel.h: New macro.
> 	* sysdeps/unix/sysv/linux/not-cancel.h: New macro.
> 	* sysdeps/unix/sysv/linux/pread64_nocancel.c: Implement nocancel
> 	version of pread64.
> 	* sysdeps/unix/sysv/linux/Versions (GLIBC_PRIVATE): Add
> 	__pread64_nocancel.
> 	* sysdeps/unix/sysv/linux/Makefile: Reference pread64_nocancel.c.

OK for master. I'll push after testing with bmg.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>

> ---
>  sysdeps/generic/not-cancel.h               |  2 ++
>  sysdeps/unix/sysv/linux/Makefile           |  4 +--
>  sysdeps/unix/sysv/linux/Versions           |  1 +
>  sysdeps/unix/sysv/linux/not-cancel.h       |  4 +++
>  sysdeps/unix/sysv/linux/pread64_nocancel.c | 32 ++++++++++++++++++++++
>  5 files changed, 41 insertions(+), 2 deletions(-)
>  create mode 100644 sysdeps/unix/sysv/linux/pread64_nocancel.c
> 
> diff --git a/sysdeps/generic/not-cancel.h b/sysdeps/generic/not-cancel.h
> index f3d862651e..724c3e5e71 100644
> --- a/sysdeps/generic/not-cancel.h
> +++ b/sysdeps/generic/not-cancel.h
> @@ -41,6 +41,8 @@
>    (void) __close (fd)
>  #define __read_nocancel(fd, buf, n) \
>    __read (fd, buf, n)
> +#define __pread64_nocancel(fd, buf, count, offset) \
> +  __pread64 (fd, buf, count, offset)

OK.

>  #define __write_nocancel(fd, buf, n) \
>    __write (fd, buf, n)
>  #define __writev_nocancel_nostatus(fd, iov, n) \
> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index 1ab6bcbfc8..a7980a60f6 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -212,8 +212,8 @@ sysdep_routines += xstatconv internal_statvfs internal_statvfs64 \
>  		   close_nocancel fcntl_nocancel nanosleep_nocancel \
>  		   open_nocancel open64_nocancel \
>  		   openat_nocancel openat64_nocancel \
> -		   pause_nocancel read_nocancel waitpid_nocancel \
> -		   write_nocancel statx_cp
> +		   pause_nocancel read_nocancel pread64_nocancel \
> +		   waitpid_nocancel write_nocancel statx_cp

OK.

>  
>  sysdep_headers += bits/fcntl-linux.h
>  
> diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions
> index 1ca102a9e2..d385085c61 100644
> --- a/sysdeps/unix/sysv/linux/Versions
> +++ b/sysdeps/unix/sysv/linux/Versions
> @@ -182,6 +182,7 @@ libc {
>      __syscall_rt_sigqueueinfo;
>      __open_nocancel;
>      __read_nocancel;
> +    __pread64_nocancel;

OK. Adds GLIBC_PRIVATE interface for loader.

>      __close_nocancel;
>      __sigtimedwait;
>      # functions used by nscd
> diff --git a/sysdeps/unix/sysv/linux/not-cancel.h b/sysdeps/unix/sysv/linux/not-cancel.h
> index 16cc31cba5..bf7d80125a 100644
> --- a/sysdeps/unix/sysv/linux/not-cancel.h
> +++ b/sysdeps/unix/sysv/linux/not-cancel.h
> @@ -43,6 +43,9 @@ __typeof (openat64) __openat64_nocancel;
>  /* Non cancellable read syscall.  */
>  __typeof (__read) __read_nocancel;
>  
> +/* Non cancellable pread syscall (LFS version).  */
> +__typeof (__pread64) __pread64_nocancel;
> +

OK.

>  /* Uncancelable write.  */
>  __typeof (__write) __write_nocancel;
>  
> @@ -84,6 +87,7 @@ hidden_proto (__open64_nocancel)
>  hidden_proto (__openat_nocancel)
>  hidden_proto (__openat64_nocancel)
>  hidden_proto (__read_nocancel)
> +hidden_proto (__pread64_nocancel)

OK.

>  hidden_proto (__write_nocancel)
>  hidden_proto (__close_nocancel)
>  hidden_proto (__waitpid_nocancel)
> diff --git a/sysdeps/unix/sysv/linux/pread64_nocancel.c b/sysdeps/unix/sysv/linux/pread64_nocancel.c
> new file mode 100644
> index 0000000000..dab61260e5
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/pread64_nocancel.c
> @@ -0,0 +1,32 @@
> +/* Linux pread64() syscall implementation -- non-cancellable.
> +   Copyright (C) 2019 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <unistd.h>
> +#include <sysdep-cancel.h>
> +#include <not-cancel.h>
> +
> +#ifndef __NR_pread64
> +# define __NR_pread64 __NR_pread
> +#endif
> +
> +ssize_t
> +__pread64_nocancel (int fd, void *buf, size_t count, off64_t offset)
> +{
> +  return INLINE_SYSCALL_CALL (pread64, fd, buf, count, SYSCALL_LL64_PRW (offset));
> +}
> +hidden_def (__pread64_nocancel)

OK.

> 


-- 
Cheers,
Carlos.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]