]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
linux: Add process_mrelease
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 28 Jan 2022 12:53:52 +0000 (12:53 +0000)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Thu, 2 Jun 2022 18:43:28 +0000 (15:43 -0300)
Added in Linux 5.15 (884a7e5964e06ed93c7771c0d7cf19c09a8946f1), the new
syscalls allows a caller to free the memory of a dying target process.

Checked on x86_64-linux-gnu.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
39 files changed:
NEWS
sysdeps/unix/sysv/linux/Makefile
sysdeps/unix/sysv/linux/Versions
sysdeps/unix/sysv/linux/aarch64/libc.abilist
sysdeps/unix/sysv/linux/alpha/libc.abilist
sysdeps/unix/sysv/linux/arc/libc.abilist
sysdeps/unix/sysv/linux/arm/be/libc.abilist
sysdeps/unix/sysv/linux/arm/le/libc.abilist
sysdeps/unix/sysv/linux/bits/mman_ext.h
sysdeps/unix/sysv/linux/csky/libc.abilist
sysdeps/unix/sysv/linux/hppa/libc.abilist
sysdeps/unix/sysv/linux/i386/libc.abilist
sysdeps/unix/sysv/linux/ia64/libc.abilist
sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
sysdeps/unix/sysv/linux/nios2/libc.abilist
sysdeps/unix/sysv/linux/or1k/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
sysdeps/unix/sysv/linux/sh/be/libc.abilist
sysdeps/unix/sysv/linux/sh/le/libc.abilist
sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
sysdeps/unix/sysv/linux/syscalls.list
sysdeps/unix/sysv/linux/tst-process_mrelease.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist

diff --git a/NEWS b/NEWS
index 5032f5fce552cf77282a50cdbf3a59c01a1b2b6d..6a213775e64a533fe39aad8232185709ed6d2331 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -24,6 +24,11 @@ Major new features:
   same functionality as madvise but alters the target process identified
   by the pidfd.
 
+* On Linux, the process_mrelease function has been added.  It allows a
+  caller to release the memory of a dying process.  The release of the
+  memory is carried out in the context of the caller, using the caller's
+  CPU affinity, and priority with CPU usage accounted to the caller.
+
 Deprecated and removed features, and other changes affecting compatibility:
 
 * Support for prelink will be removed in the next release; this includes
index 627506daad34760244fdaef696f8c0371a66fe96..9e691fa103bf9490e47c527ddd2cbf7f46439226 100644 (file)
@@ -129,6 +129,7 @@ tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
   tst-epoll \
   tst-getauxval \
   tst-pidfd \
+  tst-process_mrelease \
   # tests
 
 # process_madvise requires CAP_SYS_ADMIN.
index c13a3c4fe786309a8e4d9648ec4412d62034b258..66a995d3dc98c23697e62046a5a3abd6fcf72aa0 100644 (file)
@@ -304,6 +304,7 @@ libc {
     pidfd_getfd;
     pidfd_send_signal;
     process_madvise;
+    process_mrelease;
   }
   GLIBC_PRIVATE {
     # functions used in other libraries
index 4d8e64ce04c18c61551477cae937e05b56f1848c..027a1cf531180c20a98b42470e3d6993e16a7aa4 100644 (file)
@@ -2620,3 +2620,4 @@ 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.36 process_mrelease F
index 36f31292570c34a764f34ce5a49d68c4c28a4c12..703fcf5debeb0ae17d071dc3c2198c2bff0c5336 100644 (file)
@@ -2717,6 +2717,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index 2a1e346d4b69f269b43e7c157168aa47d501ccb1..28c52dcbac6b4d0725e8a6c13ee84d7d91199c81 100644 (file)
@@ -2381,3 +2381,4 @@ 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.36 process_mrelease F
index 25de8a018c1dc7d0ca1eee56556faed8d67dd4a2..c3adade8145708b7350c4152163ebf5c4571b67c 100644 (file)
@@ -500,6 +500,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
 GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
index e9cf9b15936896caece16a4dd993b760e188b7a7..33a90a248e54358da4728d08fcfe3cade6574429 100644 (file)
@@ -497,6 +497,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
 GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
index 20960e7df54bd890e204e602cdd068b5d57df2df..97234a7adff98e9d6473d7d9cbe247ed80996915 100644 (file)
@@ -30,4 +30,6 @@ extern __ssize_t process_madvise (int __pid_fd, const struct iovec* __iov,
                                  unsigned __flags)
   __THROW;
 
+extern int process_mrelease (int pidfd, unsigned int flags) __THROW;
+
 #endif /* __USE_GNU  */
index 66c2f28c43823fce1e24a49e511d5770c0420609..23a00cfc0bd2e024baf103ed296b05d0ff580ba3 100644 (file)
@@ -2656,3 +2656,4 @@ 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.36 process_mrelease F
index 527880dc068d2922cdb7f103b61d49c28b80416d..93e10682087bd7fa5518e575b4d224ce3ae8a2e8 100644 (file)
@@ -2605,6 +2605,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 1497b8a2c365c0df26b279f3afcc4ccc92b74c5e..356b05cae4d8eea670e1002593de8875d7870c8d 100644 (file)
@@ -2789,6 +2789,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index abe351d0b491016ad013e85390be9566d944e6fd..58e51aae4b359acaa6970a02a57b7273b1b63f8d 100644 (file)
@@ -2555,6 +2555,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 130f7a6b047eb7ac39d3d5e8cbad16460119a675..ea4a19cbc2de9eafbd4198bac49938f121366038 100644 (file)
@@ -501,6 +501,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0x98
 GLIBC_2.4 _IO_2_1_stdin_ D 0x98
index cf59edb38363dae6ac23c05d349ac5d5177d080b..217717859c24329a34394e84e3643cbbc4e29cf1 100644 (file)
@@ -2732,6 +2732,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index f1b927d63d42cbccf1ff9e30db48f7928336a2bf..0e373d5c89855dad26f0ae787472b8b55af79e06 100644 (file)
@@ -2705,3 +2705,4 @@ 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.36 process_mrelease F
index 9bb7c76f94197cb81f3b168d3472fca29352f088..569d3e55566ccffd73d1bf54eef117a6664793bf 100644 (file)
@@ -2702,3 +2702,4 @@ 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.36 process_mrelease F
index 03e7820eeaf718ac5e74f724aa5a9a900eb1b347..7ccc7f93eb53f0c6fe2d2be4060a96bf36855f6a 100644 (file)
@@ -2697,6 +2697,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 3d70dc114090d05b924d09daa27bcf3844a6000b..d197f0bd5d2cf8730ddaa4dbd9728a857c464785 100644 (file)
@@ -2695,6 +2695,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 5498e2ee3080e8a736f793f737875271e0ef4093..4a8e857e5351f103f9c15c505249c998bf0a98a8 100644 (file)
@@ -2703,6 +2703,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index dbebed5d362358d7d6fa7dcf305069c876ef12b1..e0a170c030c7f15104f4677310d47898f04a6b91 100644 (file)
@@ -2606,6 +2606,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index a0bfa86068eb6ca27c9ab5f24c389a0e8147ff5d..6f809245c9e9a7a6ec66ac1e418fe2d2f692887d 100644 (file)
@@ -2744,3 +2744,4 @@ 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.36 process_mrelease F
index 7d09a03d0e1a8c9ae0114e6ee332b3c78005268c..1fc9e27c274d7cab2278e2ab19322fb0d970a8cb 100644 (file)
@@ -2127,3 +2127,4 @@ 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.36 process_mrelease F
index db8fc28e751e473e5991157b9bf32476bdef425f..01ba1dd9ec736f50fd01fc33c7e85f5758dec5ba 100644 (file)
@@ -2759,6 +2759,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index e6cbb83b26a608ceaaf65e20316d59fd58fbeebf..263231a396c5146c2c87cf2da11a4196016cce9c 100644 (file)
@@ -2792,6 +2792,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index 162241fc68a63b06a03d9d61482d9af79fde16a4..2c3c3af8fb8f30060f5b1efade7b079c447643dd 100644 (file)
@@ -2514,6 +2514,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index 2845ee20152541b67d11f645f23bc9f7991b2569..4138874b386c0ab7d2f7ed81cd116ac97e759a33 100644 (file)
@@ -2816,3 +2816,4 @@ 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.36 process_mrelease F
index 277f6fbe9523aff0c936724db95cf1adadc6ce0f..5feae3245fe0ff2a871432dbfaa4a2e2a9f393aa 100644 (file)
@@ -2383,3 +2383,4 @@ 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.36 process_mrelease F
index 6f2a4d4504019c5d7d25ff2076aadcf50923a141..3e6a4ae5ec5e68364d24f6f6289549f9c5b95303 100644 (file)
@@ -2583,3 +2583,4 @@ 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.36 process_mrelease F
index bfb317488daf5516582467d4c88ec0cbfd2c6bde..93c7b79b51e0bde0ddefbf2c41f8dd5d1e3dea87 100644 (file)
@@ -2757,6 +2757,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index beef51697942dbcae2ad9aeffa116f2dd1628829..b663fabeba124917366695810748cf66e642f499 100644 (file)
@@ -2551,6 +2551,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index c326c9320a624c8c05eecc1fe3348cb9a6fd4ed4..abebf7794439cead55b3979a67659f1179d7a74a 100644 (file)
@@ -2612,6 +2612,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 704f489a8eb559cde72607e33c6c9fd2925f8e15..afd8a428959bf1b3be09f6256ef4601a5abff600 100644 (file)
@@ -2609,6 +2609,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index b9e8a341536b115f3e441d81dc1c2f581235fc9f..56feda817d715199dfa3aa678e8cd6d565236547 100644 (file)
@@ -2752,6 +2752,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
index e921a8dd76a032e406dd014f4428cf64df3ecf1b..00cc5b24d17cb1da6f51065b9da45dc5d2bb58bf 100644 (file)
@@ -2578,6 +2578,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 2d664ea3f5feb3b9cde04e3d876d522bdeaa4eb4..b12a0d56faccc664b79000d25d743ac9c8b547ec 100644 (file)
@@ -44,6 +44,7 @@ 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
+process_mrelease EXTRA  process_mrelease i:iU   process_mrelease
 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_mrelease.c b/sysdeps/unix/sysv/linux/tst-process_mrelease.c
new file mode 100644 (file)
index 0000000..958db3c
--- /dev/null
@@ -0,0 +1,86 @@
+/* Basic tests for Linux process_mrelease.
+   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 <errno.h>
+#include <stdlib.h>
+#include <support/check.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>
+
+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);
+
+  pause ();
+  _exit (0);
+}
+
+static int
+do_test (void)
+{
+  {
+    int r = process_mrelease (-1, 0);
+    TEST_COMPARE (r, -1);
+    if (errno == ENOSYS)
+      FAIL_UNSUPPORTED ("kernel does not support process_mrelease, "
+                       "skipping test");
+    TEST_COMPARE (errno, EBADF);
+  }
+
+  pid_t pid = xfork ();
+  if (pid == 0)
+    subprocess ();
+
+  int pidfd = pidfd_open (pid, 0);
+  TEST_VERIFY (pidfd != -1);
+
+  /* The syscall only succeedes if the target process is exiting and there
+     is no guarantee that calling if after pidfd_send_signal will not error
+     (ince the process might have already been reaped by the OS).  So just
+     check if it does fail when the process is stll running.  */
+  TEST_COMPARE (process_mrelease (pidfd, 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>
index 8948dc2705f8519bc4d8e869fc162c9e867a1080..4e729bdf56cdc78a98eba1976d912620f27bb769 100644 (file)
@@ -2529,6 +2529,7 @@ 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.36 process_mrelease F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
index 0988804f243fd42a43489832c0718ff994c3a59a..b5d7b9f1ed2cf7cca1c9900081aff30d724d7b22 100644 (file)
@@ -2635,3 +2635,4 @@ 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.36 process_mrelease F