Add a selftest for PIDFD_INFO_EXIT behavior. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-14-44fdacfaa7b7@xxxxxxxxxx Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx> --- tools/testing/selftests/pidfd/pidfd_info_test.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tools/testing/selftests/pidfd/pidfd_info_test.c b/tools/testing/selftests/pidfd/pidfd_info_test.c index 0d0af4c2a84d..16e4be2364df 100644 --- a/tools/testing/selftests/pidfd/pidfd_info_test.c +++ b/tools/testing/selftests/pidfd/pidfd_info_test.c @@ -195,4 +195,27 @@ TEST_F(pidfd_info, success_reaped) ASSERT_EQ(WEXITSTATUS(info.exit_code), 0); } +TEST_F(pidfd_info, success_reaped_poll) +{ + struct pidfd_info info = { + .mask = PIDFD_INFO_CGROUPID | PIDFD_INFO_EXIT, + }; + struct pollfd fds = {}; + int nevents; + + fds.events = POLLIN; + fds.fd = self->child_pidfd2; + + nevents = poll(&fds, 1, -1); + ASSERT_EQ(nevents, 1); + ASSERT_TRUE(!!(fds.revents & POLLIN)); + ASSERT_TRUE(!!(fds.revents & POLLHUP)); + + ASSERT_EQ(ioctl(self->child_pidfd2, PIDFD_GET_INFO, &info), 0); + ASSERT_FALSE(!!(info.mask & PIDFD_INFO_CREDS)); + ASSERT_TRUE(!!(info.mask & PIDFD_INFO_EXIT)); + ASSERT_TRUE(WIFSIGNALED(info.exit_code)); + ASSERT_EQ(WTERMSIG(info.exit_code), SIGKILL); +} + TEST_HARNESS_MAIN -- 2.47.2