[v4,1/2] linux: Add process_madvise

Message ID 20220602122659.949754-1-adhemerval.zanella@linaro.org
State Committed
Commit d19ee3473d68ca0e794f3a8b7677a0983ae1342e
Headers
Series [v4,1/2] linux: Add process_madvise |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

Adhemerval Zanella Netto June 2, 2022, 12:26 p.m. UTC
  It was added on Linux 5.10 (ecb8ac8b1f146915aa6b96449b66dd48984caacc)
with the same functionality as madvise but using a pidfd of the target
process.

Checked on x86_64-linux-gnu and i686-linux-gnu.
---
 NEWS                                          |   4 +
 bits/mman_ext.h                               |  21 +++
 misc/sys/mman.h                               |   3 +
 posix/Makefile                                |   2 +-
 sysdeps/unix/sysv/linux/Makefile              |   5 +
 sysdeps/unix/sysv/linux/Versions              |   1 +
 sysdeps/unix/sysv/linux/aarch64/libc.abilist  |   1 +
 sysdeps/unix/sysv/linux/alpha/libc.abilist    |   1 +
 sysdeps/unix/sysv/linux/arc/libc.abilist      |   1 +
 sysdeps/unix/sysv/linux/arm/be/libc.abilist   |   1 +
 sysdeps/unix/sysv/linux/arm/le/libc.abilist   |   1 +
 sysdeps/unix/sysv/linux/bits/mman_ext.h       |  33 ++++
 sysdeps/unix/sysv/linux/csky/libc.abilist     |   1 +
 sysdeps/unix/sysv/linux/hppa/libc.abilist     |   1 +
 sysdeps/unix/sysv/linux/i386/libc.abilist     |   1 +
 sysdeps/unix/sysv/linux/ia64/libc.abilist     |   1 +
 .../sysv/linux/m68k/coldfire/libc.abilist     |   1 +
 .../unix/sysv/linux/m68k/m680x0/libc.abilist  |   1 +
 .../sysv/linux/microblaze/be/libc.abilist     |   1 +
 .../sysv/linux/microblaze/le/libc.abilist     |   1 +
 .../sysv/linux/mips/mips32/fpu/libc.abilist   |   1 +
 .../sysv/linux/mips/mips32/nofpu/libc.abilist |   1 +
 .../sysv/linux/mips/mips64/n32/libc.abilist   |   1 +
 .../sysv/linux/mips/mips64/n64/libc.abilist   |   1 +
 sysdeps/unix/sysv/linux/nios2/libc.abilist    |   1 +
 sysdeps/unix/sysv/linux/or1k/libc.abilist     |   1 +
 .../linux/powerpc/powerpc32/fpu/libc.abilist  |   1 +
 .../powerpc/powerpc32/nofpu/libc.abilist      |   1 +
 .../linux/powerpc/powerpc64/be/libc.abilist   |   1 +
 .../linux/powerpc/powerpc64/le/libc.abilist   |   1 +
 .../unix/sysv/linux/riscv/rv32/libc.abilist   |   1 +
 .../unix/sysv/linux/riscv/rv64/libc.abilist   |   1 +
 .../unix/sysv/linux/s390/s390-32/libc.abilist |   1 +
 .../unix/sysv/linux/s390/s390-64/libc.abilist |   1 +
 sysdeps/unix/sysv/linux/sh/be/libc.abilist    |   1 +
 sysdeps/unix/sysv/linux/sh/le/libc.abilist    |   1 +
 .../sysv/linux/sparc/sparc32/libc.abilist     |   1 +
 .../sysv/linux/sparc/sparc64/libc.abilist     |   1 +
 sysdeps/unix/sysv/linux/syscalls.list         |   1 +
 sysdeps/unix/sysv/linux/tst-process_madvise.c | 141 ++++++++++++++++++
 .../unix/sysv/linux/x86_64/64/libc.abilist    |   1 +
 .../unix/sysv/linux/x86_64/x32/libc.abilist   |   1 +
 42 files changed, 243 insertions(+), 1 deletion(-)
 create mode 100644 bits/mman_ext.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/mman_ext.h
 create mode 100644 sysdeps/unix/sysv/linux/tst-process_madvise.c
  

Comments

Carlos O'Donell June 2, 2022, 1:30 p.m. UTC | #1
On 6/2/22 08:26, Adhemerval Zanella wrote:
> It was added on Linux 5.10 (ecb8ac8b1f146915aa6b96449b66dd48984caacc)
> with the same functionality as madvise but using a pidfd of the target
> process.

LGTM.

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

 
> Checked on x86_64-linux-gnu and i686-linux-gnu.
> ---
>  NEWS                                          |   4 +
>  bits/mman_ext.h                               |  21 +++
>  misc/sys/mman.h                               |   3 +
>  posix/Makefile                                |   2 +-
>  sysdeps/unix/sysv/linux/Makefile              |   5 +
>  sysdeps/unix/sysv/linux/Versions              |   1 +
>  sysdeps/unix/sysv/linux/aarch64/libc.abilist  |   1 +
>  sysdeps/unix/sysv/linux/alpha/libc.abilist    |   1 +
>  sysdeps/unix/sysv/linux/arc/libc.abilist      |   1 +
>  sysdeps/unix/sysv/linux/arm/be/libc.abilist   |   1 +
>  sysdeps/unix/sysv/linux/arm/le/libc.abilist   |   1 +
>  sysdeps/unix/sysv/linux/bits/mman_ext.h       |  33 ++++
>  sysdeps/unix/sysv/linux/csky/libc.abilist     |   1 +
>  sysdeps/unix/sysv/linux/hppa/libc.abilist     |   1 +
>  sysdeps/unix/sysv/linux/i386/libc.abilist     |   1 +
>  sysdeps/unix/sysv/linux/ia64/libc.abilist     |   1 +
>  .../sysv/linux/m68k/coldfire/libc.abilist     |   1 +
>  .../unix/sysv/linux/m68k/m680x0/libc.abilist  |   1 +
>  .../sysv/linux/microblaze/be/libc.abilist     |   1 +
>  .../sysv/linux/microblaze/le/libc.abilist     |   1 +
>  .../sysv/linux/mips/mips32/fpu/libc.abilist   |   1 +
>  .../sysv/linux/mips/mips32/nofpu/libc.abilist |   1 +
>  .../sysv/linux/mips/mips64/n32/libc.abilist   |   1 +
>  .../sysv/linux/mips/mips64/n64/libc.abilist   |   1 +
>  sysdeps/unix/sysv/linux/nios2/libc.abilist    |   1 +
>  sysdeps/unix/sysv/linux/or1k/libc.abilist     |   1 +
>  .../linux/powerpc/powerpc32/fpu/libc.abilist  |   1 +
>  .../powerpc/powerpc32/nofpu/libc.abilist      |   1 +
>  .../linux/powerpc/powerpc64/be/libc.abilist   |   1 +
>  .../linux/powerpc/powerpc64/le/libc.abilist   |   1 +
>  .../unix/sysv/linux/riscv/rv32/libc.abilist   |   1 +
>  .../unix/sysv/linux/riscv/rv64/libc.abilist   |   1 +
>  .../unix/sysv/linux/s390/s390-32/libc.abilist |   1 +
>  .../unix/sysv/linux/s390/s390-64/libc.abilist |   1 +
>  sysdeps/unix/sysv/linux/sh/be/libc.abilist    |   1 +
>  sysdeps/unix/sysv/linux/sh/le/libc.abilist    |   1 +
>  .../sysv/linux/sparc/sparc32/libc.abilist     |   1 +
>  .../sysv/linux/sparc/sparc64/libc.abilist     |   1 +
>  sysdeps/unix/sysv/linux/syscalls.list         |   1 +
>  sysdeps/unix/sysv/linux/tst-process_madvise.c | 141 ++++++++++++++++++
>  .../unix/sysv/linux/x86_64/64/libc.abilist    |   1 +
>  .../unix/sysv/linux/x86_64/x32/libc.abilist   |   1 +
>  42 files changed, 243 insertions(+), 1 deletion(-)
>  create mode 100644 bits/mman_ext.h
>  create mode 100644 sysdeps/unix/sysv/linux/bits/mman_ext.h
>  create mode 100644 sysdeps/unix/sysv/linux/tst-process_madvise.c
> 
> diff --git a/NEWS b/NEWS
> index ad0c08d8ca..5032f5fce5 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -20,6 +20,10 @@ Major new features:
>    have been added.  The pidfd functionality provides access to a process
>    while avoiding the issue of PID reuse on tranditional Unix systems.
>  
> +* On Linux, the process_madvise function has been added. It has the
> +  same functionality as madvise but alters the target process identified
> +  by the pidfd.

OK. Awesome. Thanks :-)

> +
>  Deprecated and removed features, and other changes affecting compatibility:
>  
>  * Support for prelink will be removed in the next release; this includes
> diff --git a/bits/mman_ext.h b/bits/mman_ext.h
> new file mode 100644
> index 0000000000..3ac42ab606
> --- /dev/null
> +++ b/bits/mman_ext.h
> @@ -0,0 +1,21 @@
> +/* System-specific extensions of <sys/mman.h>, generic version.

OK. Single-line desc.

> +   Copyright (C) 2022 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
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_MMAN_H
> +# error "Never include <bits/mman_ext.h> directly; use <sys/mman.h> instead."
> +#endif
> diff --git a/misc/sys/mman.h b/misc/sys/mman.h
> index 311d44cfb1..02896a0acc 100644
> --- a/misc/sys/mman.h
> +++ b/misc/sys/mman.h
> @@ -146,6 +146,9 @@ extern int shm_open (const char *__name, int __oflag, mode_t __mode);
>  /* Remove shared memory segment.  */
>  extern int shm_unlink (const char *__name);
>  
> +/* System-specific extensions.  */
> +#include <bits/mman_ext.h>

OK. New installed header.

> +
>  __END_DECLS
>  
>  #endif	/* sys/mman.h */
> diff --git a/posix/Makefile b/posix/Makefile
> index cfebb8ef06..d1df7c27cb 100644
> --- a/posix/Makefile
> +++ b/posix/Makefile
> @@ -32,7 +32,7 @@ headers	:= sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h	      \
>  	   bits/waitflags.h bits/waitstatus.h sys/unistd.h sched.h	      \
>  	   bits/sched.h bits/cpu-set.h re_comp.h wait.h bits/environments.h   \
>  	   cpio.h spawn.h bits/unistd.h bits/types/struct_sched_param.h	      \
> -	   bits/unistd_ext.h bits/types/idtype_t.h
> +	   bits/unistd_ext.h bits/types/idtype_t.h bits/mman_ext.h

OK. New installed header included in install list.

>  
>  routines :=								      \
>  	uname								      \
> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index 98b2324a21..627506daad 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -131,6 +131,11 @@ tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
>    tst-pidfd \
>    # tests
>  
> +# process_madvise requires CAP_SYS_ADMIN.
> +xtests += \
> +  tst-process_madvise \
> +  # xtests

OK. New xtests.

> +
>  # For +depfiles in Makerules.
>  extra-test-objs += tst-sysconf-iov_max-uapi.o
>  
> diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions
> index 694c64a5bc..c13a3c4fe7 100644
> --- a/sysdeps/unix/sysv/linux/Versions
> +++ b/sysdeps/unix/sysv/linux/Versions
> @@ -303,6 +303,7 @@ libc {
>      pidfd_open;
>      pidfd_getfd;
>      pidfd_send_signal;
> +    process_madvise;

OK. New function in Versions list.

>    }
>    GLIBC_PRIVATE {
>      # functions used in other libraries
> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> index 7602129631..4d8e64ce04 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> @@ -2619,3 +2619,4 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
> diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> index 5b39d6023c..36f3129257 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> @@ -2716,6 +2716,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist
> index e413302f2e..2a1e346d4b 100644
> --- a/sysdeps/unix/sysv/linux/arc/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arc/libc.abilist
> @@ -2380,3 +2380,4 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
> diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> index ade1b93d13..25de8a018c 100644
> --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> @@ -499,6 +499,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 _Exit F
>  GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
>  GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
> diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> index 10e91537fa..e9cf9b1593 100644
> --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> @@ -496,6 +496,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 _Exit F
>  GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
>  GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
> diff --git a/sysdeps/unix/sysv/linux/bits/mman_ext.h b/sysdeps/unix/sysv/linux/bits/mman_ext.h
> new file mode 100644
> index 0000000000..20960e7df5
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/bits/mman_ext.h
> @@ -0,0 +1,33 @@
> +/* System-specific extensions of <sys/mman.h>, Linux version.

OK.

> +   Copyright (C) 2022 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
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef _SYS_MMAN_H
> +# error "Never include <bits/mman_ext.h> directly; use <sys/mman.h> instead."
> +#endif
> +
> +#ifdef __USE_GNU
> +#include <bits/types/struct_iovec.h>
> +
> +/*
> + */
> +extern __ssize_t process_madvise (int __pid_fd, const struct iovec* __iov,
> +				  size_t __count, int __advice,
> +				  unsigned __flags)

OK.

> +  __THROW;
> +
> +#endif /* __USE_GNU  */
> diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
> index 22618c7aaa..66c2f28c43 100644
> --- a/sysdeps/unix/sysv/linux/csky/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
> @@ -2655,3 +2655,4 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
> diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> index e2aea90c74..527880dc06 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> @@ -2604,6 +2604,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
> index 29ecca26bb..1497b8a2c3 100644
> --- a/sysdeps/unix/sysv/linux/i386/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
> @@ -2788,6 +2788,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> index 69a2ca2391..abe351d0b4 100644
> --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> @@ -2554,6 +2554,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> index 23cc4ddd8a..130f7a6b04 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> @@ -500,6 +500,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 _Exit F
>  GLIBC_2.4 _IO_2_1_stderr_ D 0x98
>  GLIBC_2.4 _IO_2_1_stdin_ D 0x98
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> index 2d1d8a3d0c..cf59edb383 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> @@ -2731,6 +2731,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> index 7b6e88bdb9..f1b927d63d 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> @@ -2704,3 +2704,4 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> index 155c974790..9bb7c76f94 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> @@ -2701,3 +2701,4 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> index 7a811120ea..03e7820eea 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> @@ -2696,6 +2696,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> index 7d28dca5c1..3d70dc1140 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> @@ -2694,6 +2694,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> index 41790f0d63..5498e2ee30 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> @@ -2702,6 +2702,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> index 9c15006c12..dbebed5d36 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> @@ -2605,6 +2605,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> index 27c0498b60..a0bfa86068 100644
> --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> @@ -2743,3 +2743,4 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
> diff --git a/sysdeps/unix/sysv/linux/or1k/libc.abilist b/sysdeps/unix/sysv/linux/or1k/libc.abilist
> index e500d4756f..7d09a03d0e 100644
> --- a/sysdeps/unix/sysv/linux/or1k/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/or1k/libc.abilist
> @@ -2126,3 +2126,4 @@ GLIBC_2.35 wscanf F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> index adb21db204..db8fc28e75 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> @@ -2758,6 +2758,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> index 28a08c4afb..e6cbb83b26 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> @@ -2791,6 +2791,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> index 98c5f3e61c..162241fc68 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> @@ -2513,6 +2513,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> index 31e5aa90cd..2845ee2015 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> @@ -2815,3 +2815,4 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> index 87d90bf668..277f6fbe95 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> @@ -2382,3 +2382,4 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> index b4a8f56aa2..6f2a4d4504 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> @@ -2582,3 +2582,4 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> index e4a58cc145..bfb317488d 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> @@ -2756,6 +2756,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> index ef0f0c3fa1..beef516979 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> @@ -2550,6 +2550,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> index 603d50668f..c326c9320a 100644
> --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> @@ -2611,6 +2611,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> index 078cdf05a7..704f489a8e 100644
> --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> @@ -2608,6 +2608,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> index 735505ac51..b9e8a34153 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> @@ -2751,6 +2751,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> index 48df7952cd..e921a8dd76 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> @@ -2577,6 +2577,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
> index d9653bb433..2d664ea3f5 100644
> --- a/sysdeps/unix/sysv/linux/syscalls.list
> +++ b/sysdeps/unix/sysv/linux/syscalls.list
> @@ -43,6 +43,7 @@ pidfd_open	EXTRA	pidfd_open	i:iU	pidfd_open
>  pidfd_getfd	EXTRA	pidfd_getfd	i:iiU	pidfd_getfd
>  pivot_root	EXTRA	pivot_root	i:ss	pivot_root
>  pidfd_send_signal	EXTRA	pidfd_send_signal	i:iiPU	pidfd_send_signal
> +process_madvise EXTRA   process_madvise i:iPniU process_madvise
>  query_module	EXTRA	query_module	i:sipip	__compat_query_module	query_module@GLIBC_2.0:GLIBC_2.23
>  quotactl	EXTRA	quotactl	i:isip	quotactl
>  remap_file_pages -	remap_file_pages i:pUiUi	__remap_file_pages remap_file_pages
> diff --git a/sysdeps/unix/sysv/linux/tst-process_madvise.c b/sysdeps/unix/sysv/linux/tst-process_madvise.c
> new file mode 100644
> index 0000000000..a674e80b76
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/tst-process_madvise.c
> @@ -0,0 +1,141 @@
> +/* Basic tests for Linux process_madvise.

OK.

> +   Copyright (C) 2022 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
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <array_length.h>
> +#include <errno.h>
> +#include <limits.h>
> +#include <stdlib.h>
> +#include <support/check.h>
> +#include <support/process_state.h>
> +#include <support/support.h>
> +#include <support/xsocket.h>
> +#include <support/xunistd.h>
> +#include <sys/mman.h>
> +#include <sys/pidfd.h>
> +#include <sys/wait.h>
> +
> +/* The pair of sockets used for coordination.  The subprocess uses
> +   sockets[1].  */
> +static int sockets[2];
> +
> +static long int page_size;
> +
> +static void
> +exit_subprocess (int dummy)
> +{
> +  exit (EXIT_FAILURE);
> +}
> +
> +static void
> +subprocess (void)
> +{
> +  /* In case something goes wrong with parent before pidfd_send_signal.  */
> +  support_create_timer (5, 0, false, exit_subprocess);

OK.

> +
> +  void *p1 = xmmap (NULL, page_size * 2, PROT_READ | PROT_WRITE,
> +		    MAP_PRIVATE | MAP_ANONYMOUS, -1);
> +
> +  void *p2 = xmmap (NULL, page_size, PROT_READ | PROT_WRITE,
> +		    MAP_PRIVATE | MAP_ANONYMOUS, -1);
> +  xmunmap(p2, page_size);
> +
> +  xsendto (sockets[1], &(struct iovec) { p1, page_size * 2 },
> +	   sizeof (struct iovec), 0, NULL, 0);
> +
> +  xsendto (sockets[1], &(struct iovec) { p2, page_size },
> +	   sizeof (struct iovec), 0, NULL, 0);
> +
> +  pause ();
> +
> +  _exit (0);
> +}
> +
> +static int
> +do_test (void)
> +{
> +  page_size = sysconf (_SC_PAGE_SIZE);
> +
> +  {
> +    int r = pidfd_open (-1, 0);
> +    TEST_COMPARE (r, -1);
> +    if (errno == ENOSYS)
> +      FAIL_UNSUPPORTED ("kernel does not support pidfd_open, skipping test");
> +
> +    TEST_COMPARE (errno, EINVAL);
> +  }
> +
> +  TEST_COMPARE (socketpair (AF_UNIX, SOCK_STREAM, 0, sockets), 0);
> +
> +  pid_t pid = xfork ();
> +  if (pid == 0)
> +    {
> +      xclose (sockets[0]);
> +      subprocess ();
> +    }
> +  xclose (sockets[1]);
> +
> +  int pidfd = pidfd_open (pid, 0);
> +  TEST_VERIFY (pidfd != -1);
> +
> +  /* The target process is going to send us two iovec's.  The first one points
> +     to a valid mapping, the other points to a previously valid mapping which
> +     has now been unmapped.  */

OK.

> +  {
> +    struct iovec iv;
> +    xrecvfrom (sockets[0], &iv, sizeof (iv), 0, NULL, 0);
> +
> +    /* We expect this to succeed in the target process because the mapping
> +       is valid.  */
> +    TEST_COMPARE (process_madvise (pidfd, &iv, 1, MADV_COLD, 0),
> +		  2 * page_size);
> +  }
> +
> +  {
> +    struct iovec iv;
> +    xrecvfrom (sockets[0], &iv, sizeof (iv), 0, NULL, 0);
> +
> +    /* We expect this to fail in the target process because the second iovec
> +       points to an unmapped region.  The target process arranges for this to
> +       be the case.  */
> +    TEST_COMPARE (process_madvise (pidfd, &iv, 1, MADV_COLD, 0), -1);
> +    TEST_COMPARE (errno, ENOMEM);

OK.

> +  }
> +
> +  {
> +    struct iovec iv[IOV_MAX + 1];
> +    TEST_COMPARE (process_madvise (pidfd, iv, array_length (iv), MADV_COLD,
> +				   0), -1);
> +    TEST_COMPARE (errno, EINVAL);

OK. Excellent. Thanks for the extra coverage.

> +  }
> +
> +  TEST_COMPARE (pidfd_send_signal (pidfd, SIGKILL, NULL, 0), 0);
> +  {
> +    siginfo_t info;
> +    int r = waitid (P_PIDFD, pidfd, &info, WEXITED);
> +    TEST_COMPARE (r, 0);
> +    TEST_COMPARE (info.si_status, SIGKILL);
> +    TEST_COMPARE (info.si_code, CLD_KILLED);
> +  }
> +
> +  TEST_COMPARE (pidfd_send_signal (pidfd, SIGKILL, NULL, 0), -1);
> +  TEST_COMPARE (errno, ESRCH);

OK. Yes! Full life-cycle checked.

> +
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> index 1629fb7762..8948dc2705 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> @@ -2528,6 +2528,7 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> index ee9674ff75..0988804f24 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> @@ -2634,3 +2634,4 @@ GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
>  GLIBC_2.36 pidfd_getfd F
>  GLIBC_2.36 pidfd_open F
>  GLIBC_2.36 pidfd_send_signal F
> +GLIBC_2.36 process_madvise F
  

Patch

diff --git a/NEWS b/NEWS
index ad0c08d8ca..5032f5fce5 100644
--- a/NEWS
+++ b/NEWS
@@ -20,6 +20,10 @@  Major new features:
   have been added.  The pidfd functionality provides access to a process
   while avoiding the issue of PID reuse on tranditional Unix systems.
 
+* On Linux, the process_madvise function has been added. It has the
+  same functionality as madvise but alters the target process identified
+  by the pidfd.
+
 Deprecated and removed features, and other changes affecting compatibility:
 
 * Support for prelink will be removed in the next release; this includes
diff --git a/bits/mman_ext.h b/bits/mman_ext.h
new file mode 100644
index 0000000000..3ac42ab606
--- /dev/null
+++ b/bits/mman_ext.h
@@ -0,0 +1,21 @@ 
+/* System-specific extensions of <sys/mman.h>, generic version.
+   Copyright (C) 2022 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
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_MMAN_H
+# error "Never include <bits/mman_ext.h> directly; use <sys/mman.h> instead."
+#endif
diff --git a/misc/sys/mman.h b/misc/sys/mman.h
index 311d44cfb1..02896a0acc 100644
--- a/misc/sys/mman.h
+++ b/misc/sys/mman.h
@@ -146,6 +146,9 @@  extern int shm_open (const char *__name, int __oflag, mode_t __mode);
 /* Remove shared memory segment.  */
 extern int shm_unlink (const char *__name);
 
+/* System-specific extensions.  */
+#include <bits/mman_ext.h>
+
 __END_DECLS
 
 #endif	/* sys/mman.h */
diff --git a/posix/Makefile b/posix/Makefile
index cfebb8ef06..d1df7c27cb 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -32,7 +32,7 @@  headers	:= sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h	      \
 	   bits/waitflags.h bits/waitstatus.h sys/unistd.h sched.h	      \
 	   bits/sched.h bits/cpu-set.h re_comp.h wait.h bits/environments.h   \
 	   cpio.h spawn.h bits/unistd.h bits/types/struct_sched_param.h	      \
-	   bits/unistd_ext.h bits/types/idtype_t.h
+	   bits/unistd_ext.h bits/types/idtype_t.h bits/mman_ext.h
 
 routines :=								      \
 	uname								      \
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 98b2324a21..627506daad 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -131,6 +131,11 @@  tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
   tst-pidfd \
   # tests
 
+# process_madvise requires CAP_SYS_ADMIN.
+xtests += \
+  tst-process_madvise \
+  # xtests
+
 # For +depfiles in Makerules.
 extra-test-objs += tst-sysconf-iov_max-uapi.o
 
diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions
index 694c64a5bc..c13a3c4fe7 100644
--- a/sysdeps/unix/sysv/linux/Versions
+++ b/sysdeps/unix/sysv/linux/Versions
@@ -303,6 +303,7 @@  libc {
     pidfd_open;
     pidfd_getfd;
     pidfd_send_signal;
+    process_madvise;
   }
   GLIBC_PRIVATE {
     # functions used in other libraries
diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
index 7602129631..4d8e64ce04 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
@@ -2619,3 +2619,4 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
index 5b39d6023c..36f3129257 100644
--- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
@@ -2716,6 +2716,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist
index e413302f2e..2a1e346d4b 100644
--- a/sysdeps/unix/sysv/linux/arc/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arc/libc.abilist
@@ -2380,3 +2380,4 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
index ade1b93d13..25de8a018c 100644
--- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
@@ -499,6 +499,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
 GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
index 10e91537fa..e9cf9b1593 100644
--- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
@@ -496,6 +496,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
 GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
diff --git a/sysdeps/unix/sysv/linux/bits/mman_ext.h b/sysdeps/unix/sysv/linux/bits/mman_ext.h
new file mode 100644
index 0000000000..20960e7df5
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/mman_ext.h
@@ -0,0 +1,33 @@ 
+/* System-specific extensions of <sys/mman.h>, Linux version.
+   Copyright (C) 2022 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
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_MMAN_H
+# error "Never include <bits/mman_ext.h> directly; use <sys/mman.h> instead."
+#endif
+
+#ifdef __USE_GNU
+#include <bits/types/struct_iovec.h>
+
+/*
+ */
+extern __ssize_t process_madvise (int __pid_fd, const struct iovec* __iov,
+				  size_t __count, int __advice,
+				  unsigned __flags)
+  __THROW;
+
+#endif /* __USE_GNU  */
diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
index 22618c7aaa..66c2f28c43 100644
--- a/sysdeps/unix/sysv/linux/csky/libc.abilist
+++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
@@ -2655,3 +2655,4 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
index e2aea90c74..527880dc06 100644
--- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
@@ -2604,6 +2604,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
index 29ecca26bb..1497b8a2c3 100644
--- a/sysdeps/unix/sysv/linux/i386/libc.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
@@ -2788,6 +2788,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
index 69a2ca2391..abe351d0b4 100644
--- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
@@ -2554,6 +2554,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
index 23cc4ddd8a..130f7a6b04 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
@@ -500,6 +500,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0x98
 GLIBC_2.4 _IO_2_1_stdin_ D 0x98
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
index 2d1d8a3d0c..cf59edb383 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
@@ -2731,6 +2731,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
index 7b6e88bdb9..f1b927d63d 100644
--- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
@@ -2704,3 +2704,4 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
index 155c974790..9bb7c76f94 100644
--- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
@@ -2701,3 +2701,4 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
index 7a811120ea..03e7820eea 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
@@ -2696,6 +2696,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
index 7d28dca5c1..3d70dc1140 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
@@ -2694,6 +2694,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
index 41790f0d63..5498e2ee30 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
@@ -2702,6 +2702,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
index 9c15006c12..dbebed5d36 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
@@ -2605,6 +2605,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
index 27c0498b60..a0bfa86068 100644
--- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
@@ -2743,3 +2743,4 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
diff --git a/sysdeps/unix/sysv/linux/or1k/libc.abilist b/sysdeps/unix/sysv/linux/or1k/libc.abilist
index e500d4756f..7d09a03d0e 100644
--- a/sysdeps/unix/sysv/linux/or1k/libc.abilist
+++ b/sysdeps/unix/sysv/linux/or1k/libc.abilist
@@ -2126,3 +2126,4 @@  GLIBC_2.35 wscanf F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
index adb21db204..db8fc28e75 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
@@ -2758,6 +2758,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
index 28a08c4afb..e6cbb83b26 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
@@ -2791,6 +2791,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
index 98c5f3e61c..162241fc68 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
@@ -2513,6 +2513,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
index 31e5aa90cd..2845ee2015 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
@@ -2815,3 +2815,4 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
index 87d90bf668..277f6fbe95 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
@@ -2382,3 +2382,4 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
index b4a8f56aa2..6f2a4d4504 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
@@ -2582,3 +2582,4 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
index e4a58cc145..bfb317488d 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
@@ -2756,6 +2756,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
index ef0f0c3fa1..beef516979 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
@@ -2550,6 +2550,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
index 603d50668f..c326c9320a 100644
--- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
@@ -2611,6 +2611,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
index 078cdf05a7..704f489a8e 100644
--- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
@@ -2608,6 +2608,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
index 735505ac51..b9e8a34153 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
@@ -2751,6 +2751,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
index 48df7952cd..e921a8dd76 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
@@ -2577,6 +2577,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
index d9653bb433..2d664ea3f5 100644
--- a/sysdeps/unix/sysv/linux/syscalls.list
+++ b/sysdeps/unix/sysv/linux/syscalls.list
@@ -43,6 +43,7 @@  pidfd_open	EXTRA	pidfd_open	i:iU	pidfd_open
 pidfd_getfd	EXTRA	pidfd_getfd	i:iiU	pidfd_getfd
 pivot_root	EXTRA	pivot_root	i:ss	pivot_root
 pidfd_send_signal	EXTRA	pidfd_send_signal	i:iiPU	pidfd_send_signal
+process_madvise EXTRA   process_madvise i:iPniU process_madvise
 query_module	EXTRA	query_module	i:sipip	__compat_query_module	query_module@GLIBC_2.0:GLIBC_2.23
 quotactl	EXTRA	quotactl	i:isip	quotactl
 remap_file_pages -	remap_file_pages i:pUiUi	__remap_file_pages remap_file_pages
diff --git a/sysdeps/unix/sysv/linux/tst-process_madvise.c b/sysdeps/unix/sysv/linux/tst-process_madvise.c
new file mode 100644
index 0000000000..a674e80b76
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tst-process_madvise.c
@@ -0,0 +1,141 @@ 
+/* Basic tests for Linux process_madvise.
+   Copyright (C) 2022 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include <array_length.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <support/check.h>
+#include <support/process_state.h>
+#include <support/support.h>
+#include <support/xsocket.h>
+#include <support/xunistd.h>
+#include <sys/mman.h>
+#include <sys/pidfd.h>
+#include <sys/wait.h>
+
+/* The pair of sockets used for coordination.  The subprocess uses
+   sockets[1].  */
+static int sockets[2];
+
+static long int page_size;
+
+static void
+exit_subprocess (int dummy)
+{
+  exit (EXIT_FAILURE);
+}
+
+static void
+subprocess (void)
+{
+  /* In case something goes wrong with parent before pidfd_send_signal.  */
+  support_create_timer (5, 0, false, exit_subprocess);
+
+  void *p1 = xmmap (NULL, page_size * 2, PROT_READ | PROT_WRITE,
+		    MAP_PRIVATE | MAP_ANONYMOUS, -1);
+
+  void *p2 = xmmap (NULL, page_size, PROT_READ | PROT_WRITE,
+		    MAP_PRIVATE | MAP_ANONYMOUS, -1);
+  xmunmap(p2, page_size);
+
+  xsendto (sockets[1], &(struct iovec) { p1, page_size * 2 },
+	   sizeof (struct iovec), 0, NULL, 0);
+
+  xsendto (sockets[1], &(struct iovec) { p2, page_size },
+	   sizeof (struct iovec), 0, NULL, 0);
+
+  pause ();
+
+  _exit (0);
+}
+
+static int
+do_test (void)
+{
+  page_size = sysconf (_SC_PAGE_SIZE);
+
+  {
+    int r = pidfd_open (-1, 0);
+    TEST_COMPARE (r, -1);
+    if (errno == ENOSYS)
+      FAIL_UNSUPPORTED ("kernel does not support pidfd_open, skipping test");
+
+    TEST_COMPARE (errno, EINVAL);
+  }
+
+  TEST_COMPARE (socketpair (AF_UNIX, SOCK_STREAM, 0, sockets), 0);
+
+  pid_t pid = xfork ();
+  if (pid == 0)
+    {
+      xclose (sockets[0]);
+      subprocess ();
+    }
+  xclose (sockets[1]);
+
+  int pidfd = pidfd_open (pid, 0);
+  TEST_VERIFY (pidfd != -1);
+
+  /* The target process is going to send us two iovec's.  The first one points
+     to a valid mapping, the other points to a previously valid mapping which
+     has now been unmapped.  */
+  {
+    struct iovec iv;
+    xrecvfrom (sockets[0], &iv, sizeof (iv), 0, NULL, 0);
+
+    /* We expect this to succeed in the target process because the mapping
+       is valid.  */
+    TEST_COMPARE (process_madvise (pidfd, &iv, 1, MADV_COLD, 0),
+		  2 * page_size);
+  }
+
+  {
+    struct iovec iv;
+    xrecvfrom (sockets[0], &iv, sizeof (iv), 0, NULL, 0);
+
+    /* We expect this to fail in the target process because the second iovec
+       points to an unmapped region.  The target process arranges for this to
+       be the case.  */
+    TEST_COMPARE (process_madvise (pidfd, &iv, 1, MADV_COLD, 0), -1);
+    TEST_COMPARE (errno, ENOMEM);
+  }
+
+  {
+    struct iovec iv[IOV_MAX + 1];
+    TEST_COMPARE (process_madvise (pidfd, iv, array_length (iv), MADV_COLD,
+				   0), -1);
+    TEST_COMPARE (errno, EINVAL);
+  }
+
+  TEST_COMPARE (pidfd_send_signal (pidfd, SIGKILL, NULL, 0), 0);
+  {
+    siginfo_t info;
+    int r = waitid (P_PIDFD, pidfd, &info, WEXITED);
+    TEST_COMPARE (r, 0);
+    TEST_COMPARE (info.si_status, SIGKILL);
+    TEST_COMPARE (info.si_code, CLD_KILLED);
+  }
+
+  TEST_COMPARE (pidfd_send_signal (pidfd, SIGKILL, NULL, 0), -1);
+  TEST_COMPARE (errno, ESRCH);
+
+  return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
index 1629fb7762..8948dc2705 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
@@ -2528,6 +2528,7 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
index ee9674ff75..0988804f24 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
@@ -2634,3 +2634,4 @@  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
 GLIBC_2.36 pidfd_getfd F
 GLIBC_2.36 pidfd_open F
 GLIBC_2.36 pidfd_send_signal F
+GLIBC_2.36 process_madvise F