From patchwork Wed Mar 5 10:08:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002269 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 75863205AD4 for ; Wed, 5 Mar 2025 10:08:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169309; cv=none; b=k9j0MJrIrfBatG+aPrTB443xK+9QIJY0MUBMkZWJj28C66VKvcBHayc1UuFA5Cwjy1N9BwURNcgthmC+proLSXuMAkRpKPclrQC9jK/8osW6gmHM27jOZGhfGV5Rc4nvaDiqZm/N0TNlhsD7gzFlqEVqW2MVeHm/qxY4RKdVdnc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169309; c=relaxed/simple; bh=b725dJ/yqm73AWK8ThtlveRgfYPp20MRnIG4wVPw2Cg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nkJdfEMNwCs+MeCR8aUHLeG4TVnZUFiQhsCKUk+T2GSyIPSqhpHj8EpanVvXhl8/T7kn1w4SPfY6jN0YDtKqXSk2UaJ5fSrmJIGzZ5zHUioqLW6o/RiBQsZxM9JXH4eB1nW6tg43pjrxeiwQ2Mh5Rh9xKieHnSINLe9DnfS6DSQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DMTAFGih; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="DMTAFGih" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4FB9EC4CEEB; Wed, 5 Mar 2025 10:08:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169308; bh=b725dJ/yqm73AWK8ThtlveRgfYPp20MRnIG4wVPw2Cg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=DMTAFGihyUBAgkUKffpeFvVriueueHM8HoWQhDsAMMHc8SArkITIVipGeZsCFso81 +bJNGq87lf2fxd2ARY9mozVcXmfXIiWdRESa4PPXX0hrHrCpo+BLmVXEIJMzfe0RlT 5fSrIsWzPL6XCxaHGPYjj4vFvbA0q9iW3iMcirLQzlKAEzqW190BCOBgs7kjc7xI3x VIMBdW6ymC+hetPgz8IYXDSzAo6wYsgC/3jMjywOdgAu89Rl/4QrPZsP1QbyH1MNAC Wn3TUuuEvaEqvg7lTvmdo/rYTP6eR4ZBs9ZqWG4GPzAbitrVbUhw3oTQsr2k44sWFG udOOkxqiCmylw== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:11 +0100 Subject: [PATCH v3 01/16] pidfs: switch to copy_struct_to_user() Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-1-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=956; i=brauner@kernel.org; h=from:subject:message-id; bh=b725dJ/yqm73AWK8ThtlveRgfYPp20MRnIG4wVPw2Cg=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJqhJsF+NETXK2ZedMjzPeEWhS823bxzbq8Ea5CT9 7UfT7L1O0pZGMS4GGTFFFkc2k3C5ZbzVGw2ytSAmcPKBDKEgYtTACaSYMjI8Ed1MxMv2/2pi69/ lLzgvzti9p2QZQHM/7TfdiXy9rFIyDD8lS649bcoVcVL7tH04JrVD2Pta+5tlJZu2sceV2qWGHa ICwA= X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 We have a helper that deals with all the required logic. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-1-44fdacfaa7b7@kernel.org Reviewed-by: Jeff Layton Signed-off-by: Christian Brauner --- fs/pidfs.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fs/pidfs.c b/fs/pidfs.c index 049352f973de..aa8c8bda8c8f 100644 --- a/fs/pidfs.c +++ b/fs/pidfs.c @@ -276,10 +276,7 @@ static long pidfd_info(struct task_struct *task, unsigned int cmd, unsigned long * userspace knows about will be copied. If userspace provides a new * struct, only the bits that the kernel knows about will be copied. */ - if (copy_to_user(uinfo, &kinfo, min(usize, sizeof(kinfo)))) - return -EFAULT; - - return 0; + return copy_struct_to_user(uinfo, usize, &kinfo, sizeof(kinfo), NULL); } static bool pidfs_ioctl_valid(unsigned int cmd) From patchwork Wed Mar 5 10:08:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002270 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 554781C8612 for ; Wed, 5 Mar 2025 10:08:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169311; cv=none; b=F+FARfu6A3lqQimOVsmRqwu5yW+alM5CMT+1xC856SFLbXbQcwjJ+s3CEHuS22D2cfHXF50PpUl61EklLbNMTUF+zI5Jgov2o1wBUq4U/QYe+D25tF9ftPiveSC8CCFcUmq2G+8NdGEy9wSTLEAxW+2CJvtfv37yHIvLh/CPKHQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169311; c=relaxed/simple; bh=av4DkB7WFvAYLnrOfF/XuXugIucHUQhRFCeRNgZsKuk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ujn7e633ODIilC2GvVYp08baAl3F1vfDVdz5Jg11uVvPzPw35NS+d12KrJLez6eJQEfdsR6MfpUTvuMGtBpqVOJVZ1nwAsXDlpTloV+dPQ4JpgTMgRAlhtGfBHOwr4PE1F0MsKFHbn0+7qi6l1+EgVYArMLGbO1n54muu4EcEMg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=rSs02nA/; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="rSs02nA/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4E9B4C4CEEE; Wed, 5 Mar 2025 10:08:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169310; bh=av4DkB7WFvAYLnrOfF/XuXugIucHUQhRFCeRNgZsKuk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=rSs02nA/ylmlAJdDufAbmHCiv402qUeeLAoA9M1rJycbH/QXgJrzD6KpzGqLn1Fzp KW3Vqk66KBff+Oos9PNJCdZfZNDDOB30HbIH/Ub2jPc45gHMTNgY8W853XXrzje+7R ZjUh4BJ2YrtS6BHVBYZPY6baP6F+XYHZI/vhD9mG17vtMqxwTYe3mz2lW1/+pVQWhr NZAWOzUPiSGcNk1VeZL1S4kPjuMfcyomOqlUlU0TOuKyz+AfjBOzyrO0TrnFAugJVQ rTli0zPvmvxvF0nkgfu+KaItjww/oUw1pcrQfismjLwRS4/lQ+yHXlSWf1WjecW2vL onfeWoiHFV0ew== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:12 +0100 Subject: [PATCH v3 02/16] pidfd: rely on automatic cleanup in __pidfd_prepare() Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-2-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=1287; i=brauner@kernel.org; h=from:subject:message-id; bh=av4DkB7WFvAYLnrOfF/XuXugIucHUQhRFCeRNgZsKuk=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJoh4Ghx5uW8wivPX0XYsP33qG/f0yw2IfBwwGu2v 3ZfHXdKdpSyMIhxMciKKbI4tJuEyy3nqdhslKkBM4eVCWQIAxenAExkmjYjw/FFa47PyBXgl9Eq vTb5h4yxg1161OGOF+J2jb8TwkXXH2f4zfL3iS9jzoN6oWUzLwUnrVqUU7iKKUmB/913u4Jun8I T/AA= X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Rely on scope-based cleanup for the allocated file descriptor. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-2-44fdacfaa7b7@kernel.org Acked-by: Jeff Layton Signed-off-by: Christian Brauner --- kernel/fork.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/kernel/fork.c b/kernel/fork.c index 735405a9c5f3..6230f5256bc5 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -2032,25 +2032,23 @@ static inline void rcu_copy_process(struct task_struct *p) */ static int __pidfd_prepare(struct pid *pid, unsigned int flags, struct file **ret) { - int pidfd; struct file *pidfd_file; - pidfd = get_unused_fd_flags(O_CLOEXEC); + CLASS(get_unused_fd, pidfd)(O_CLOEXEC); if (pidfd < 0) return pidfd; pidfd_file = pidfs_alloc_file(pid, flags | O_RDWR); - if (IS_ERR(pidfd_file)) { - put_unused_fd(pidfd); + if (IS_ERR(pidfd_file)) return PTR_ERR(pidfd_file); - } + /* * anon_inode_getfile() ignores everything outside of the * O_ACCMODE | O_NONBLOCK mask, set PIDFD_THREAD manually. */ pidfd_file->f_flags |= (flags & PIDFD_THREAD); *ret = pidfd_file; - return pidfd; + return take_fd(pidfd); } /** From patchwork Wed Mar 5 10:08:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002271 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7FEB3205E3F for ; Wed, 5 Mar 2025 10:08:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169313; cv=none; b=cpb0wuHzh40Zq75aFsNH6Rm5rYO4kCgLnvfCAQLvCmiJsRqHw6vADz47gBhZfaN4zhNu84wD1FqO1kv6Ej7kBpkSUZzEIMD9az1yzSZA8BbPgOgGGcmmoOnTvHBnUTPNdBF6CtllD9Y8UC8DRP+un5X+ZnrPKChVM+5kUgQdyrw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169313; c=relaxed/simple; bh=U6mTq7uPSmFsVQwB9kIWePLPFLU1GJaGShIt5xcso9w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JfWWx+5K4Tr55QncT7v+FaZcp4yXSCvgAZeH+5DXHkU+gyqiE09IYRWHFn5aHP+SP0BC41SUq0A52R77uP4ATq2TCkvgUWMcCSvhzMNNT/aDA33ky9xs2b3DUcjgU+afQ0cbeecWVn7TaRSiZIRphCPUMUWjA7MvKJEnvydMhwM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=W+D8tmmX; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="W+D8tmmX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5FEC0C4CEE9; Wed, 5 Mar 2025 10:08:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169313; bh=U6mTq7uPSmFsVQwB9kIWePLPFLU1GJaGShIt5xcso9w=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=W+D8tmmXXETUewamUdv4GS5e1crakTOVLSCSvieJZol6PW1OUOR9yfavAv2t9oOL6 2j0KIfvacSQasyfLG5cW8WwniAZsOXxpYdKezxMw9KeHPShaTC+CBHaMfn0zuI01G/ IDjL2Tb4/sTYZUezRpuy++eUBvb0K2f1RjBTVTHhhcRIJ5NHP/KS7Vn0CiTW/Y2YlG i2HNSY/FwbpQFqyJXE1KY5WzOYAoXLkm8m2M3S/1bhW4ER9884lHubHZWfqZ8P/SFA 8cunfcP6631NFjeyw1NovE3lDazbvIxy9P8mtfxmMj4lM6klaTrtTtuYIfhKrWcDze PtWSOX9ccal2Q== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:13 +0100 Subject: [PATCH v3 03/16] pidfs: move setting flags into pidfs_alloc_file() Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-3-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=1479; i=brauner@kernel.org; h=from:subject:message-id; bh=U6mTq7uPSmFsVQwB9kIWePLPFLU1GJaGShIt5xcso9w=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJqxfB6r5o0rwS7GLlddDCy5N9Y/28+d8MwiXffas iVN4szTOkpZGMS4GGTFFFkc2k3C5ZbzVGw2ytSAmcPKBDKEgYtTACZSKs7wz84h2HX+rh2PXzQ/ yTgoM7X/YcKs+x9maki+LZjtdGO3djQjw4fpHA8/Z9t8L5px8kvRLp95PLnbGNS9hOL9tSZl+s2 +xg8A X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Instead od adding it into __pidfd_prepare() place it where the actual file allocation happens and update the outdated comment. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-3-44fdacfaa7b7@kernel.org Reviewed-by: Jeff Layton Signed-off-by: Christian Brauner --- fs/pidfs.c | 4 ++++ kernel/fork.c | 5 ----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/fs/pidfs.c b/fs/pidfs.c index aa8c8bda8c8f..ecc0dd886714 100644 --- a/fs/pidfs.c +++ b/fs/pidfs.c @@ -696,6 +696,10 @@ struct file *pidfs_alloc_file(struct pid *pid, unsigned int flags) return ERR_PTR(ret); pidfd_file = dentry_open(&path, flags, current_cred()); + /* Raise PIDFD_THREAD explicitly as do_dentry_open() strips it. */ + if (!IS_ERR(pidfd_file)) + pidfd_file->f_flags |= (flags & PIDFD_THREAD); + path_put(&path); return pidfd_file; } diff --git a/kernel/fork.c b/kernel/fork.c index 6230f5256bc5..8eac9cd3385b 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -2042,11 +2042,6 @@ static int __pidfd_prepare(struct pid *pid, unsigned int flags, struct file **re if (IS_ERR(pidfd_file)) return PTR_ERR(pidfd_file); - /* - * anon_inode_getfile() ignores everything outside of the - * O_ACCMODE | O_NONBLOCK mask, set PIDFD_THREAD manually. - */ - pidfd_file->f_flags |= (flags & PIDFD_THREAD); *ret = pidfd_file; return take_fd(pidfd); } From patchwork Wed Mar 5 10:08:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002272 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DC5EE1C8612 for ; Wed, 5 Mar 2025 10:08:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169315; cv=none; b=Q/JAOyTgixI2CS/6IPmeJ3vhCPnJjjWuQxaCjYLIIpAUDO5Aq6V3cAXwkoYwNhaVCtYoK2z9+j3oSpyxfQiecsk6PouDI9Kb2t5G4u4HRl+2U14Oob+boe5ufMpCSdvdlMnxLJVQljX/tO8h3xCpPvqWczRVUUFWgxkqWwZyvj4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169315; c=relaxed/simple; bh=Qfnm8KKT/aeuFxG41rmiJmNnuIF6+nm0BOWV0KvIDHE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Hpir7tClRgVbTxZScd7k3lmupwQhoDzFPrW1P2T3gaG0rjS6f7ydfo7IqKF1Njbja7UCtXhakjWk/qkSmcFFned6cGgrypiKdiksIBhfHZvtZg6PAo6eUcJL6HZK4QfaSthC6HN+/+dl/FAKlPN5q2PJ5vnbIOR3vyR8F9RjYdc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NbfxsPcT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NbfxsPcT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 78087C4CEEB; Wed, 5 Mar 2025 10:08:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169315; bh=Qfnm8KKT/aeuFxG41rmiJmNnuIF6+nm0BOWV0KvIDHE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=NbfxsPcTgTUTrdpZ8cBPWDmixmNYMNdlpIiWGpsPLBbi0rByu2YGGFKX+Qt3w3Mve Y8HpHFLXafweLDalr2FpOrse5uS57dm3PEDQLqFsrOCnSKL9VMBSF4rRIsEsSmxFNy yj/T45jmeeBgwuaUpTX2Io2GzUSLjBNAKXCgbhj5BUqV4vBbsQdLk8FuHEufuM31xW MR3kiypP+yE5BIBjldodzd17BWmvVqbrWD+gOAZtq/1GhuQeqp7nxqeCHq9uoIPnWP Frdats2F717U1i5abpg3KHM776QC6I2HEUSTB/ypmdT8LOAdcm1kmQjWE54hSG8Khm C3y7qB/YKa5rw== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:14 +0100 Subject: [PATCH v3 04/16] pidfs: use private inode slab cache Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-4-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=2747; i=brauner@kernel.org; h=from:subject:message-id; bh=Qfnm8KKT/aeuFxG41rmiJmNnuIF6+nm0BOWV0KvIDHE=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJrB/KB9o8p7keN14tdSbj4/mCgbmz0z4vaHP02hf +a9rdnH2VHKwiDGxSArpsji0G4SLrecp2KzUaYGzBxWJpAhDFycAjARbQ+G/6VqASJXd0TFBmtz /r34PWhz5fP/PGwZDPrLZ/xuyT05sZzhn41L8opnHxmU7j2ayPbhKcOsE0+cZSs81D50XUz9sXa FByMA X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Introduce a private inode slab cache for pidfs. In follow-up patches pidfs will gain the ability to provide exit information to userspace after the task has been reaped. This means storing exit information even after the task has already been released and struct pid's task linkage is gone. Store that information alongside the inode. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-4-44fdacfaa7b7@kernel.org Reviewed-by: Jeff Layton Signed-off-by: Christian Brauner --- fs/pidfs.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/fs/pidfs.c b/fs/pidfs.c index ecc0dd886714..282511a36fd9 100644 --- a/fs/pidfs.c +++ b/fs/pidfs.c @@ -24,6 +24,27 @@ #include "internal.h" #include "mount.h" +static struct kmem_cache *pidfs_cachep __ro_after_init; + +/* + * Stashes information that userspace needs to access even after the + * process has been reaped. + */ +struct pidfs_exit_info { + __u64 cgroupid; + __s32 exit_code; +}; + +struct pidfs_inode { + struct pidfs_exit_info exit_info; + struct inode vfs_inode; +}; + +static inline struct pidfs_inode *pidfs_i(struct inode *inode) +{ + return container_of(inode, struct pidfs_inode, vfs_inode); +} + static struct rb_root pidfs_ino_tree = RB_ROOT; #if BITS_PER_LONG == 32 @@ -492,9 +513,29 @@ static void pidfs_evict_inode(struct inode *inode) put_pid(pid); } +static struct inode *pidfs_alloc_inode(struct super_block *sb) +{ + struct pidfs_inode *pi; + + pi = alloc_inode_sb(sb, pidfs_cachep, GFP_KERNEL); + if (!pi) + return NULL; + + memset(&pi->exit_info, 0, sizeof(pi->exit_info)); + + return &pi->vfs_inode; +} + +static void pidfs_free_inode(struct inode *inode) +{ + kmem_cache_free(pidfs_cachep, pidfs_i(inode)); +} + static const struct super_operations pidfs_sops = { + .alloc_inode = pidfs_alloc_inode, .drop_inode = generic_delete_inode, .evict_inode = pidfs_evict_inode, + .free_inode = pidfs_free_inode, .statfs = simple_statfs, }; @@ -704,8 +745,19 @@ struct file *pidfs_alloc_file(struct pid *pid, unsigned int flags) return pidfd_file; } +static void pidfs_inode_init_once(void *data) +{ + struct pidfs_inode *pi = data; + + inode_init_once(&pi->vfs_inode); +} + void __init pidfs_init(void) { + pidfs_cachep = kmem_cache_create("pidfs_cache", sizeof(struct pidfs_inode), 0, + (SLAB_HWCACHE_ALIGN | SLAB_RECLAIM_ACCOUNT | + SLAB_ACCOUNT | SLAB_PANIC), + pidfs_inode_init_once); pidfs_mnt = kern_mount(&pidfs_type); if (IS_ERR(pidfs_mnt)) panic("Failed to mount pidfs pseudo filesystem"); From patchwork Wed Mar 5 10:08:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002273 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CF2EF205E06 for ; Wed, 5 Mar 2025 10:08:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169317; cv=none; b=SqQY1I8MLSwuIVc3PBcliMGikdR2PWKGac2krk79KMFszv+HrvaofUK6VkopDyWfKtVLTiMBZpJoYa9ltqBUbeVpjTLA+5YGKcb8Ye9YMidihsIcSe1ONUTAik8k9gXn4BIVx46qVZ7/v5lq0YG0dn+Ga9d+GZqo7Cg5R1arHJU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169317; c=relaxed/simple; bh=JXrYrLNBggp1OwoK9I55On5p9kX9hSPyXO9PjAY+VL0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OX1q2z4yaAjemzRelbrkaAAhOSvinukxOJnEqD0/Me1VPRkGxhWQ+rjV6cT3FoCBn2ZwytJX2LVu+H+Aevu6IdiJjCwu838u0c1IsgZ8qW3o/Mq8AIzsrNcvytSxFGkP/AhwVyJdYMNhjWOi3MHztKlSSHpCCkVKa3sTEKWgOwA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GQdgrBr0; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="GQdgrBr0" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C6AA3C4CEE9; Wed, 5 Mar 2025 10:08:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169317; bh=JXrYrLNBggp1OwoK9I55On5p9kX9hSPyXO9PjAY+VL0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=GQdgrBr0eXadC8ytCTkN+FprhB53Sm2DcXRNF09bH0DzeP7rtxoJLUcf0ysIGFnXf nRLAKrwcbuFtaZvWO8AcpZp0n7tAgKykktly/pEEOEGQQhNjuJ9lNk3rbxZqAnJRU9 lzDAav8C5U/+SGfwtj/C5HIgnFVOhcaxbL4/DUkrFLHVfcrZv4F1f+V8OvnMGkR6jH zZ8+TpQ0j4rbp3QJ9sS4wzoAJy2JvlQf6HqiQDkLgjMus/XfrFpbg3Jtr3sWZTtnXe zPJsFIhbeAfhAaNi+aGjGyurYPmjl1P6hJATPwviwo0fazAJRFpomUkh8FzL/nZFvW wdHwDcAOlETFA== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:15 +0100 Subject: [PATCH v3 05/16] pidfs: record exit code and cgroupid at exit Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-5-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=4649; i=brauner@kernel.org; h=from:subject:message-id; bh=JXrYrLNBggp1OwoK9I55On5p9kX9hSPyXO9PjAY+VL0=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJohcL52T3LanAbHlP21AazhDCHaqfMDZhxTKXI61 HdbO3FpRykLgxgXg6yYIotDu0m43HKeis1GmRowc1iZQIYwcHEKwESWhDP8Zg8X/bMmN2JBYoNu 3le9UzsOfu14WH8x+s/DxDkLnNz31TL84dw2ad5kEaujXIWpS0995t37rLtX3yn2rKPKAwtBhat T2AA= X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Record the exit code and cgroupid in release_task() and stash in struct pidfs_exit_info so it can be retrieved even after the task has been reaped. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-5-44fdacfaa7b7@kernel.org Reviewed-by: Jeff Layton Signed-off-by: Christian Brauner --- fs/internal.h | 1 + fs/libfs.c | 4 ++-- fs/pidfs.c | 41 +++++++++++++++++++++++++++++++++++++++++ include/linux/pidfs.h | 1 + kernel/exit.c | 2 ++ 5 files changed, 47 insertions(+), 2 deletions(-) diff --git a/fs/internal.h b/fs/internal.h index e7f02ae1e098..c1e6d8b294cb 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -325,6 +325,7 @@ struct stashed_operations { int path_from_stashed(struct dentry **stashed, struct vfsmount *mnt, void *data, struct path *path); void stashed_dentry_prune(struct dentry *dentry); +struct dentry *stashed_dentry_get(struct dentry **stashed); /** * path_mounted - check whether path is mounted * @path: path to check diff --git a/fs/libfs.c b/fs/libfs.c index 8444f5cc4064..cf5a267aafe4 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -2113,7 +2113,7 @@ struct timespec64 simple_inode_init_ts(struct inode *inode) } EXPORT_SYMBOL(simple_inode_init_ts); -static inline struct dentry *get_stashed_dentry(struct dentry **stashed) +struct dentry *stashed_dentry_get(struct dentry **stashed) { struct dentry *dentry; @@ -2215,7 +2215,7 @@ int path_from_stashed(struct dentry **stashed, struct vfsmount *mnt, void *data, const struct stashed_operations *sops = mnt->mnt_sb->s_fs_info; /* See if dentry can be reused. */ - path->dentry = get_stashed_dentry(stashed); + path->dentry = stashed_dentry_get(stashed); if (path->dentry) { sops->put_data(data); goto out_path; diff --git a/fs/pidfs.c b/fs/pidfs.c index 282511a36fd9..c4e6527013e7 100644 --- a/fs/pidfs.c +++ b/fs/pidfs.c @@ -458,6 +458,47 @@ struct pid *pidfd_pid(const struct file *file) return file_inode(file)->i_private; } +/* + * We're called from release_task(). We know there's at least one + * reference to struct pid being held that won't be released until the + * task has been reaped which cannot happen until we're out of + * release_task(). + * + * If this struct pid is referred to by a pidfd then + * stashed_dentry_get() will return the dentry and inode for that struct + * pid. Since we've taken a reference on it there's now an additional + * reference from the exit path on it. Which is fine. We're going to put + * it again in a second and we know that the pid is kept alive anyway. + * + * Worst case is that we've filled in the info and immediately free the + * dentry and inode afterwards since the pidfd has been closed. Since + * pidfs_exit() currently is placed after exit_task_work() we know that + * it cannot be us aka the exiting task holding a pidfd to ourselves. + */ +void pidfs_exit(struct task_struct *tsk) +{ + struct dentry *dentry; + + might_sleep(); + + dentry = stashed_dentry_get(&task_pid(tsk)->stashed); + if (dentry) { + struct inode *inode = d_inode(dentry); + struct pidfs_exit_info *exit_info = &pidfs_i(inode)->exit_info; +#ifdef CONFIG_CGROUPS + struct cgroup *cgrp; + + rcu_read_lock(); + cgrp = task_dfl_cgroup(tsk); + exit_info->cgroupid = cgroup_id(cgrp); + rcu_read_unlock(); +#endif + exit_info->exit_code = tsk->exit_code; + + dput(dentry); + } +} + static struct vfsmount *pidfs_mnt __ro_after_init; /* diff --git a/include/linux/pidfs.h b/include/linux/pidfs.h index 7c830d0dec9a..05e6f8f4a026 100644 --- a/include/linux/pidfs.h +++ b/include/linux/pidfs.h @@ -6,6 +6,7 @@ struct file *pidfs_alloc_file(struct pid *pid, unsigned int flags); void __init pidfs_init(void); void pidfs_add_pid(struct pid *pid); void pidfs_remove_pid(struct pid *pid); +void pidfs_exit(struct task_struct *tsk); extern const struct dentry_operations pidfs_dentry_operations; #endif /* _LINUX_PID_FS_H */ diff --git a/kernel/exit.c b/kernel/exit.c index 3485e5fc499e..9916305e34d3 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -69,6 +69,7 @@ #include #include #include +#include #include @@ -249,6 +250,7 @@ void release_task(struct task_struct *p) dec_rlimit_ucounts(task_ucounts(p), UCOUNT_RLIMIT_NPROC, 1); rcu_read_unlock(); + pidfs_exit(p); cgroup_release(p); write_lock_irq(&tasklist_lock); From patchwork Wed Mar 5 10:08:16 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002274 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E06291FC7FA for ; Wed, 5 Mar 2025 10:08:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169321; cv=none; b=o3MWL2EoZwa4HRSER7XjXp2oiaq49aqQT+bxBbJs3ly74buZ9zHgmnqjW+tSKlfGAqfS/rE53Nia6oDZaGZRDHdRoOEwnhnAkCZB86sm33aibmeQVl12YkDUD0TBMDZ7CCswaOAzye/kVeHCXYjntAMsZEkv3vWHYstb1vAhp1o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169321; c=relaxed/simple; bh=MU9P1LuAS44Pqncz+mL3Fa55AI+n2W090XTUwfkKvik=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QoqOLOOhv55AxcB3M7FAnl9FuYIa0K2iDYXR86sAlbIdQNG1TWNqko93utAfxpiDCtF5i9A1oIh7bcjMmTA4Ev71pwKZzIFxnO0ofOzd97XhK09PR0oQBdt4VIsrMycdaeDDcEyQmAWNV8TQ+pld/movRs3WC97uOBztB40u9vE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DyZFrUB2; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="DyZFrUB2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CC532C4CEEB; Wed, 5 Mar 2025 10:08:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169319; bh=MU9P1LuAS44Pqncz+mL3Fa55AI+n2W090XTUwfkKvik=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=DyZFrUB23pwK/5URRcu1Zah/5wlf6EnTh7Uy6tD7Ly94VgjPr4B6eotvQv7i/e+Ng 2O7FzEz6VLEikjcaCEUsV/xR5j1t9XydnlrGanX0c1kATMTWmbL7p652rNVqcmHQxl bWYgc9UN8BxhTy1R/fDcNgvJv2U4hSHe8agNXNt5rnP8z8TNY6GM8gruDBhUIE2BC/ NLizSIpYolWdB0BBkAU7jGWld04jOSYExrQuNsZhyDI/RMlV5lG3y4fPrkDUvvp7jW ciqCqTy8t87hCfRF1O0ItR/PA4Xh2DLoLmUR+T8eqJ9d38FsgKl2jENAQ05cHcPayA np2mmmW0YohqA== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:16 +0100 Subject: [PATCH v3 06/16] pidfs: allow to retrieve exit information Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-6-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=6403; i=brauner@kernel.org; h=from:subject:message-id; bh=MU9P1LuAS44Pqncz+mL3Fa55AI+n2W090XTUwfkKvik=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJrRxHG/Sn7Z1BkBZ8y5Q85+DG/l/NV1/UuyWmHh9 zthn9uXd5SyMIhxMciKKbI4tJuEyy3nqdhslKkBM4eVCWQIAxenAEykjoOR4Z74sf7ZL12WnVPL V9EwOMYpcbpqdpfsn68r5F+LOEUF5jEybLEKecjKpZ++UvbJ1lXJD0W2qV/8pPp/8rUJ029+Obg kmQcA X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Some tools like systemd's jounral need to retrieve the exit and cgroup information after a process has already been reaped. This can e.g., happen when retrieving a pidfd via SCM_PIDFD or SCM_PEERPIDFD. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-6-44fdacfaa7b7@kernel.org Reviewed-by: Jeff Layton Signed-off-by: Christian Brauner --- fs/pidfs.c | 86 ++++++++++++++++++++++++++++++++++++---------- include/uapi/linux/pidfd.h | 3 +- 2 files changed, 70 insertions(+), 19 deletions(-) diff --git a/fs/pidfs.c b/fs/pidfs.c index c4e6527013e7..3c630e9d4a62 100644 --- a/fs/pidfs.c +++ b/fs/pidfs.c @@ -36,7 +36,8 @@ struct pidfs_exit_info { }; struct pidfs_inode { - struct pidfs_exit_info exit_info; + struct pidfs_exit_info __pei; + struct pidfs_exit_info *exit_info; struct inode vfs_inode; }; @@ -228,17 +229,28 @@ static __poll_t pidfd_poll(struct file *file, struct poll_table_struct *pts) return poll_flags; } -static long pidfd_info(struct task_struct *task, unsigned int cmd, unsigned long arg) +static inline bool pid_in_current_pidns(const struct pid *pid) +{ + const struct pid_namespace *ns = task_active_pid_ns(current); + + if (ns->level <= pid->level) + return pid->numbers[ns->level].ns == ns; + + return false; +} + +static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg) { struct pidfd_info __user *uinfo = (struct pidfd_info __user *)arg; + struct inode *inode = file_inode(file); + struct pid *pid = pidfd_pid(file); size_t usize = _IOC_SIZE(cmd); struct pidfd_info kinfo = {}; + struct pidfs_exit_info *exit_info; struct user_namespace *user_ns; + struct task_struct *task; const struct cred *c; __u64 mask; -#ifdef CONFIG_CGROUPS - struct cgroup *cgrp; -#endif if (!uinfo) return -EINVAL; @@ -248,6 +260,37 @@ static long pidfd_info(struct task_struct *task, unsigned int cmd, unsigned long if (copy_from_user(&mask, &uinfo->mask, sizeof(mask))) return -EFAULT; + /* + * Restrict information retrieval to tasks within the caller's pid + * namespace hierarchy. + */ + if (!pid_in_current_pidns(pid)) + return -ESRCH; + + if (mask & PIDFD_INFO_EXIT) { + exit_info = READ_ONCE(pidfs_i(inode)->exit_info); + if (exit_info) { + kinfo.mask |= PIDFD_INFO_EXIT; +#ifdef CONFIG_CGROUPS + kinfo.cgroupid = exit_info->cgroupid; + kinfo.mask |= PIDFD_INFO_CGROUPID; +#endif + kinfo.exit_code = exit_info->exit_code; + } + } + + task = get_pid_task(pid, PIDTYPE_PID); + if (!task) { + /* + * If the task has already been reaped, only exit + * information is available + */ + if (!(mask & PIDFD_INFO_EXIT)) + return -ESRCH; + + goto copy_out; + } + c = get_task_cred(task); if (!c) return -ESRCH; @@ -267,11 +310,15 @@ static long pidfd_info(struct task_struct *task, unsigned int cmd, unsigned long put_cred(c); #ifdef CONFIG_CGROUPS - rcu_read_lock(); - cgrp = task_dfl_cgroup(task); - kinfo.cgroupid = cgroup_id(cgrp); - kinfo.mask |= PIDFD_INFO_CGROUPID; - rcu_read_unlock(); + if (!kinfo.cgroupid) { + struct cgroup *cgrp; + + rcu_read_lock(); + cgrp = task_dfl_cgroup(task); + kinfo.cgroupid = cgroup_id(cgrp); + kinfo.mask |= PIDFD_INFO_CGROUPID; + rcu_read_unlock(); + } #endif /* @@ -291,6 +338,7 @@ static long pidfd_info(struct task_struct *task, unsigned int cmd, unsigned long if (kinfo.pid == 0 || kinfo.tgid == 0 || (kinfo.ppid == 0 && kinfo.pid != 1)) return -ESRCH; +copy_out: /* * If userspace and the kernel have the same struct size it can just * be copied. If userspace provides an older struct, only the bits that @@ -325,7 +373,6 @@ static long pidfd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct task_struct *task __free(put_task) = NULL; struct nsproxy *nsp __free(put_nsproxy) = NULL; - struct pid *pid = pidfd_pid(file); struct ns_common *ns_common = NULL; struct pid_namespace *pid_ns; @@ -340,13 +387,13 @@ static long pidfd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) return put_user(file_inode(file)->i_generation, argp); } - task = get_pid_task(pid, PIDTYPE_PID); - if (!task) - return -ESRCH; - /* Extensible IOCTL that does not open namespace FDs, take a shortcut */ if (_IOC_NR(cmd) == _IOC_NR(PIDFD_GET_INFO)) - return pidfd_info(task, cmd, arg); + return pidfd_info(file, cmd, arg); + + task = get_pid_task(pidfd_pid(file), PIDTYPE_PID); + if (!task) + return -ESRCH; if (arg) return -EINVAL; @@ -484,7 +531,7 @@ void pidfs_exit(struct task_struct *tsk) dentry = stashed_dentry_get(&task_pid(tsk)->stashed); if (dentry) { struct inode *inode = d_inode(dentry); - struct pidfs_exit_info *exit_info = &pidfs_i(inode)->exit_info; + struct pidfs_exit_info *exit_info = &pidfs_i(inode)->__pei; #ifdef CONFIG_CGROUPS struct cgroup *cgrp; @@ -495,6 +542,8 @@ void pidfs_exit(struct task_struct *tsk) #endif exit_info->exit_code = tsk->exit_code; + /* Ensure that PIDFD_GET_INFO sees either all or nothing. */ + smp_store_release(&pidfs_i(inode)->exit_info, &pidfs_i(inode)->__pei); dput(dentry); } } @@ -562,7 +611,8 @@ static struct inode *pidfs_alloc_inode(struct super_block *sb) if (!pi) return NULL; - memset(&pi->exit_info, 0, sizeof(pi->exit_info)); + memset(&pi->__pei, 0, sizeof(pi->__pei)); + pi->exit_info = NULL; return &pi->vfs_inode; } diff --git a/include/uapi/linux/pidfd.h b/include/uapi/linux/pidfd.h index e0abd0b18841..5cd5dcbfe884 100644 --- a/include/uapi/linux/pidfd.h +++ b/include/uapi/linux/pidfd.h @@ -20,6 +20,7 @@ #define PIDFD_INFO_PID (1UL << 0) /* Always returned, even if not requested */ #define PIDFD_INFO_CREDS (1UL << 1) /* Always returned, even if not requested */ #define PIDFD_INFO_CGROUPID (1UL << 2) /* Always returned if available, even if not requested */ +#define PIDFD_INFO_EXIT (1UL << 3) /* Only returned if requested. */ #define PIDFD_INFO_SIZE_VER0 64 /* sizeof first published struct */ @@ -86,7 +87,7 @@ struct pidfd_info { __u32 sgid; __u32 fsuid; __u32 fsgid; - __u32 spare0[1]; + __s32 exit_code; }; #define PIDFS_IOCTL_MAGIC 0xFF From patchwork Wed Mar 5 10:08:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002275 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 07CFF1FC7FA for ; Wed, 5 Mar 2025 10:08:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169322; cv=none; b=nHcYi3h6E7qFJDiD2sniGeGySoB+QlbI5oia3Smp1eJB//KvdsU3ApWjT89QTcofFuVjG7DYpr/+lezEXU/gs/qkZyXqIFYI4rYZ3X9VwiOjOxXzLb/vG71FrQGHDdChonUPDTe59kED/YugcDdAB2tm1/jR3k094RphfkUT1k0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169322; c=relaxed/simple; bh=IX6I3dL4hN6SFtOCJeS6XvppNTM0MxWtctr5HPHM4Ps=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ox2PmANx8nbNvmp9xtDrJD0jU5VbP8H0KI4+7ZW2NqJVCRE0dyNzTDcEWXVd3rKt41wy9y9EF45qxcnd3Qc1/WOS8uV47F/E32BUgMNjUU+dgmMNyv+eM+s1GZw6FQXZAfnIEFrZGYcrCwsR2wFb0oz7gFOxo1Og6Cx1GJYCo3M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tAsgiZdm; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="tAsgiZdm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D595AC4CEEA; Wed, 5 Mar 2025 10:08:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169321; bh=IX6I3dL4hN6SFtOCJeS6XvppNTM0MxWtctr5HPHM4Ps=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=tAsgiZdmyue4oTBc5b5rq3PEWs8Nl+Hk3O6kUtlHs38rq9DbuNBHMxn/aP/l/1SRH 1WbKH8FxyDcaDTfeOcqo2FubLeQJXdYV5aDhLXhBS2ss3PoaOmKSSzpRsWx61FjSCJ cF+QvWkgMcNLdBuuGGRLb6TtZt3E0lANMGc+wb5zmz94VucGxko3qBSxbfZhpCD5RD Zv9P+5HXUXaZH1VyaMYoh2izecDaUb5/kPhCInDepY0gVjorOuzh3OqBG/rzT4ktNv E0mkfgRXGR4uqYGw9Agw5Kt9johfXq+3HlHeuVaDhGL5P5v4uokVhwQaokgkEYcd/j kYZQVzqHlD7iA== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:17 +0100 Subject: [PATCH v3 07/16] selftests/pidfd: fix header inclusion Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-7-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=753; i=brauner@kernel.org; h=from:subject:message-id; bh=IX6I3dL4hN6SFtOCJeS6XvppNTM0MxWtctr5HPHM4Ps=; b=kA0DAAoWkcYbwGV43KIByyZiAGfIIpii24T6/xKH8yVhITj4SxbVI2Ho367yULucYMtwyWHjn Yh1BAAWCgAdFiEEQIc0Vx6nDHizMmkokcYbwGV43KIFAmfIIpgACgkQkcYbwGV43KKtOgD/d899 AD0n9Vz8cS45DWweNngQwGHiH8FcAPr3OhDFE6ABAI2rFHR8FPxhkCdtbmiwxWcz9NFMggg6WXf aNWgv638A X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Ensure that necessary defines are present. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-7-44fdacfaa7b7@kernel.org Signed-off-by: Christian Brauner --- tools/testing/selftests/pidfd/pidfd_fdinfo_test.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c b/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c index f062a986e382..f718aac75068 100644 --- a/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c +++ b/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "pidfd.h" #include "../kselftest.h" From patchwork Wed Mar 5 10:08:18 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002276 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C2F451FC7FA for ; Wed, 5 Mar 2025 10:08:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169323; cv=none; b=WK8KmHYHd6LLdZRfq+N5S0XhOxUOKWA5jnFn20hk2UquVaHlqkTM+QF1rf9RJn8EHM5+uMs+SGJmfG9BnxmaSkdhMwbjZH5ifgkRpFJjyoY+/jkoa7KeEa889u1JvLmrTRy7ap4qMcvImfKd6GaeZcX3Gls9DSe5Rybxk1CaXmc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169323; c=relaxed/simple; bh=RH6+41naBJfLvwkOqLgEs+DeitLKhiNb5SVtjxokSvk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=h83Yik3FXOM3/N3DNR/9hT0rTecpYa8q/s8K9sv7nC9CCAfB1lLlTYVpDl09mXJ7yk6LHH8HeYBCl0vxFe7M0dfaPsnWzyr7GpEe6hGDznuSacHGd8qnIyUcaUisMdfZxoA2S1ysPBXWl8f9Rt65aMp3SItU6JgOsuvnqWGyaCs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mcloonls; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mcloonls" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EDF0DC4CEE8; Wed, 5 Mar 2025 10:08:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169323; bh=RH6+41naBJfLvwkOqLgEs+DeitLKhiNb5SVtjxokSvk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=mcloonlsXDpKje2wQUH5UaBAi9FGZlPdwjR6/qMdvV8nS4UAYBe6kLGbjgCfhOcKP mhIej62jrOmud2TbFsCcc/tClkOllX8D7pIB3wlFmtdE4DAENiZO6S5v+cMgBK5Suw FOfGyPpgvGqKA/OPMp9Nzu6YJU/bOXX16iqrD/Mr+uy4A+02+v1LSyWZFl8QDUrSnI qOkgDrNl+PV7fftfMSnaeXIlddVCg3EPFY3eJkTNk2Ewt+MadEhv2t+fQQey6dvSGu aZumcBfkBflMCYJIFzxesyk+eHDYIq/9rZBhIEtcHc8U6qb24RWIlmR9Oc27Htm4WV 0y6jyxx9OVDPQ== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:18 +0100 Subject: [PATCH v3 08/16] pidfs/selftests: ensure correct headers for ioctl handling Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-8-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=814; i=brauner@kernel.org; h=from:subject:message-id; bh=RH6+41naBJfLvwkOqLgEs+DeitLKhiNb5SVtjxokSvk=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJqxftPUH/cL67l7Spg5Jirt2V75O5/NpU3k85oNz jmLjaXWd5SyMIhxMciKKbI4tJuEyy3nqdhslKkBM4eVCWQIAxenAEzEqZzhv/cyOYP+TXmRclzT fWuEOyexF/TuLZ/hd8fOuu30THamt4wMD5m2HC1fsFf+lPKbsgCuOJ/pzJxHJRkmbNX35J96lkm GGwA= X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Ensure that necessary ioctl infrastructure is available. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-8-44fdacfaa7b7@kernel.org Signed-off-by: Christian Brauner --- tools/testing/selftests/pidfd/pidfd_setns_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/pidfd/pidfd_setns_test.c b/tools/testing/selftests/pidfd/pidfd_setns_test.c index 222f8131283b..d9e715de68b3 100644 --- a/tools/testing/selftests/pidfd/pidfd_setns_test.c +++ b/tools/testing/selftests/pidfd/pidfd_setns_test.c @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include "pidfd.h" #include "../kselftest_harness.h" From patchwork Wed Mar 5 10:08:19 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002277 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1F789205AA3 for ; Wed, 5 Mar 2025 10:08:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169326; cv=none; b=hhcngd17u+juT/P+mAuTLjVx4MRQi5D4G7ARvDmygeNKDzZ0XvJlXwhGEOblDU3MaKtp02ozcl2FqgHxNbjnU0O+u1yMDzMTxqtzi8FcFVq+9IP+XKcV3ZZ65F9hUTFgAU9JYY2vaLr1SUSGd6vEse8L6+f7WW77jhbr9S7Edio= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169326; c=relaxed/simple; bh=rD54OjvB+N4UDMewV/wtgZlMH5v5u62O60YfQKkfHs0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=n7nM74MEUW2fq1pNV4ZKaP5hvImsYR4VAZt50GRhwKN+6w8eqNZT9hdtYZhGbr5M0JZE6MHAAE7Q16lJnpeWl22tw+2k3UfT/DD2bZYpsxG6ZOxhmtJ91pLuhuAJWJN8FHfyLwO8t7Lvk71uwt6QvKeV30RE7MoSFFqsi7lGX+4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NWMJhGrn; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NWMJhGrn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 17588C4CEE8; Wed, 5 Mar 2025 10:08:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169325; bh=rD54OjvB+N4UDMewV/wtgZlMH5v5u62O60YfQKkfHs0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=NWMJhGrnvCHu139oTjOg30YO3D0EZ6Kxu8PQ5iiyuh/4O5tEIj37A+MNtOOJUbJKe aUw6zVkXRt0Xq413TxaSiuTKaPpzp3WIJgQgmlH4jBGQ/2JF8LSu4jnwWVUpecQfni 2GIID6MjxPTXG//WMw7vzvILJy0GvMoZAQ9UinFiMKRFcohH2HElb0XCLhHN/ubc5t H8Ua/DOSgNhuM3qGbuHooVd8M+Bz5J3XqTxqZYvVZ/iPbCoPIX2xpdWDX4Ino0GRO6 I3VZT3/J5RSPT/562BhOsb8EdaR6TcEqpAUqqlUCHUa1PQolIQ7+YzB2ZnOBhIX0DJ khn4aEEB5raMQ== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:19 +0100 Subject: [PATCH v3 09/16] selftests/pidfd: expand common pidfd header Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-9-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=5860; i=brauner@kernel.org; h=from:subject:message-id; bh=rD54OjvB+N4UDMewV/wtgZlMH5v5u62O60YfQKkfHs0=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJohbMT0ZuFW5e61s1RP/uYy9OMW/K69eZfKFOVl7 ktWyx361VHKwiDGxSArpsji0G4SLrecp2KzUaYGzBxWJpAhDFycAjCRnisM/4MM2IuefLdN69KJ l/ASytikxrXF5/7i3PMaec83tq3nTmBkePZrb5SjN091tJ1KjuxqptmaDHFLPk6fmG+mOPHH509 XeAE= X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Move more infrastructure to the pidfd header. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-9-44fdacfaa7b7@kernel.org Signed-off-by: Christian Brauner --- tools/testing/selftests/pidfd/pidfd.h | 78 ++++++++++++++++++++++++ tools/testing/selftests/pidfd/pidfd_open_test.c | 26 -------- tools/testing/selftests/pidfd/pidfd_setns_test.c | 45 -------------- 3 files changed, 78 insertions(+), 71 deletions(-) diff --git a/tools/testing/selftests/pidfd/pidfd.h b/tools/testing/selftests/pidfd/pidfd.h index 027ebaf14844..bad518766aa5 100644 --- a/tools/testing/selftests/pidfd/pidfd.h +++ b/tools/testing/selftests/pidfd/pidfd.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -66,6 +67,83 @@ #define PIDFD_SELF_PROCESS PIDFD_SELF_THREAD_GROUP #endif +#ifndef PIDFS_IOCTL_MAGIC +#define PIDFS_IOCTL_MAGIC 0xFF +#endif + +#ifndef PIDFD_GET_CGROUP_NAMESPACE +#define PIDFD_GET_CGROUP_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 1) +#endif + +#ifndef PIDFD_GET_IPC_NAMESPACE +#define PIDFD_GET_IPC_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 2) +#endif + +#ifndef PIDFD_GET_MNT_NAMESPACE +#define PIDFD_GET_MNT_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 3) +#endif + +#ifndef PIDFD_GET_NET_NAMESPACE +#define PIDFD_GET_NET_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 4) +#endif + +#ifndef PIDFD_GET_PID_NAMESPACE +#define PIDFD_GET_PID_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 5) +#endif + +#ifndef PIDFD_GET_PID_FOR_CHILDREN_NAMESPACE +#define PIDFD_GET_PID_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 6) +#endif + +#ifndef PIDFD_GET_TIME_NAMESPACE +#define PIDFD_GET_TIME_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 7) +#endif + +#ifndef PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE +#define PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 8) +#endif + +#ifndef PIDFD_GET_USER_NAMESPACE +#define PIDFD_GET_USER_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 9) +#endif + +#ifndef PIDFD_GET_UTS_NAMESPACE +#define PIDFD_GET_UTS_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 10) +#endif + +#ifndef PIDFD_GET_INFO +#define PIDFD_GET_INFO _IOWR(PIDFS_IOCTL_MAGIC, 11, struct pidfd_info) +#endif + +#ifndef PIDFD_INFO_PID +#define PIDFD_INFO_PID (1UL << 0) /* Always returned, even if not requested */ +#endif + +#ifndef PIDFD_INFO_CREDS +#define PIDFD_INFO_CREDS (1UL << 1) /* Always returned, even if not requested */ +#endif + +#ifndef PIDFD_INFO_CGROUPID +#define PIDFD_INFO_CGROUPID (1UL << 2) /* Always returned if available, even if not requested */ +#endif + +struct pidfd_info { + __u64 mask; + __u64 cgroupid; + __u32 pid; + __u32 tgid; + __u32 ppid; + __u32 ruid; + __u32 rgid; + __u32 euid; + __u32 egid; + __u32 suid; + __u32 sgid; + __u32 fsuid; + __u32 fsgid; + __u32 spare0[1]; +}; + /* * The kernel reserves 300 pids via RESERVED_PIDS in kernel/pid.c * That means, when it wraps around any pid < 300 will be skipped. diff --git a/tools/testing/selftests/pidfd/pidfd_open_test.c b/tools/testing/selftests/pidfd/pidfd_open_test.c index 9a40ccb1ff6d..cd3de40e4977 100644 --- a/tools/testing/selftests/pidfd/pidfd_open_test.c +++ b/tools/testing/selftests/pidfd/pidfd_open_test.c @@ -22,32 +22,6 @@ #include "pidfd.h" #include "../kselftest.h" -#ifndef PIDFS_IOCTL_MAGIC -#define PIDFS_IOCTL_MAGIC 0xFF -#endif - -#ifndef PIDFD_GET_INFO -#define PIDFD_GET_INFO _IOWR(PIDFS_IOCTL_MAGIC, 11, struct pidfd_info) -#define PIDFD_INFO_CGROUPID (1UL << 0) - -struct pidfd_info { - __u64 mask; - __u64 cgroupid; - __u32 pid; - __u32 tgid; - __u32 ppid; - __u32 ruid; - __u32 rgid; - __u32 euid; - __u32 egid; - __u32 suid; - __u32 sgid; - __u32 fsuid; - __u32 fsgid; - __u32 spare0[1]; -}; -#endif - static int safe_int(const char *numstr, int *converted) { char *err = NULL; diff --git a/tools/testing/selftests/pidfd/pidfd_setns_test.c b/tools/testing/selftests/pidfd/pidfd_setns_test.c index d9e715de68b3..e6a079b3d5e2 100644 --- a/tools/testing/selftests/pidfd/pidfd_setns_test.c +++ b/tools/testing/selftests/pidfd/pidfd_setns_test.c @@ -16,55 +16,10 @@ #include #include #include -#include #include "pidfd.h" #include "../kselftest_harness.h" -#ifndef PIDFS_IOCTL_MAGIC -#define PIDFS_IOCTL_MAGIC 0xFF -#endif - -#ifndef PIDFD_GET_CGROUP_NAMESPACE -#define PIDFD_GET_CGROUP_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 1) -#endif - -#ifndef PIDFD_GET_IPC_NAMESPACE -#define PIDFD_GET_IPC_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 2) -#endif - -#ifndef PIDFD_GET_MNT_NAMESPACE -#define PIDFD_GET_MNT_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 3) -#endif - -#ifndef PIDFD_GET_NET_NAMESPACE -#define PIDFD_GET_NET_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 4) -#endif - -#ifndef PIDFD_GET_PID_NAMESPACE -#define PIDFD_GET_PID_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 5) -#endif - -#ifndef PIDFD_GET_PID_FOR_CHILDREN_NAMESPACE -#define PIDFD_GET_PID_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 6) -#endif - -#ifndef PIDFD_GET_TIME_NAMESPACE -#define PIDFD_GET_TIME_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 7) -#endif - -#ifndef PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE -#define PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 8) -#endif - -#ifndef PIDFD_GET_USER_NAMESPACE -#define PIDFD_GET_USER_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 9) -#endif - -#ifndef PIDFD_GET_UTS_NAMESPACE -#define PIDFD_GET_UTS_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 10) -#endif - enum { PIDFD_NS_USER, PIDFD_NS_MNT, From patchwork Wed Mar 5 10:08:20 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002278 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BBE84205AA3 for ; Wed, 5 Mar 2025 10:08:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169327; cv=none; b=Ja0LE/qONi1FFIa1yIkiqB77JwPCJaUeysrFcpZrxr1vmBTvUco9SfhgtVkWm57AVJCdrzSk2AalH35VANereAqscacbonlatWxpWUl+0TDzk7+bia7gDB8pipwg/DTJS4eupmKmWzNIV8NcasuYD5V5KyqshQ3gr8iAttvxcvo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169327; c=relaxed/simple; bh=P0GuDYk1qbYdo5vda3ZW6kjjrFAWoRzsB1VvsLwVEHI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bxN6m3cQPI0yH+/SOhbKNPkQO6qBCFLDHnqbLGTO1WN6npx2H7j8o2oej1UuCwmIW7xCPIFu/sX4T5d1nuNwAQf9E+/fS7X4LEjcDTJXJbOp56d1wj0sUPs7dunhyoF+TBV/Ehh2gwoxwKFGe+8JIgEg08Z9ySSZw0Q6ZJsBSIA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=rXpwtsFP; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="rXpwtsFP" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1D2FCC4CEEA; Wed, 5 Mar 2025 10:08:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169327; bh=P0GuDYk1qbYdo5vda3ZW6kjjrFAWoRzsB1VvsLwVEHI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=rXpwtsFPJGhGl/S6lRXYJUIc9axll7WJdK+oepw9WJtjTfqem9bxD4aghsKMVxThO fVrwfBXQvnA+/F/hdr/kNLjEgpbPD/84saMYmHi8Kx1yi7LzBVrkYBypuIPXzwmsuU TpqerzbNYUh7LX4maTqkOgZ9zv8a0+yIo8GniRVoIzLVUN+cLwHfXtX45TJFSfnMRu wh05qjTJajuEPRJOSaBaJFuDVdzFfDhTwlaZNEWOoJwXZzGhhvkGy3UtZWt1k/0y4O 1eFoTVuJ5yXeBUbW1LFUElOqsyLCKdJLBHpB7Iv3c8rdpRPowXVDbgFc5wFXdkSakT LdaMj6d8MJH7g== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:20 +0100 Subject: [PATCH v3 10/16] selftests/pidfd: add first PIDFD_INFO_EXIT selftest Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-10-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=6188; i=brauner@kernel.org; h=from:subject:message-id; bh=P0GuDYk1qbYdo5vda3ZW6kjjrFAWoRzsB1VvsLwVEHI=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJpR9YT9TNisTS/zvXaamjlP+LnsQPXED7dP6PbKR 7Zd/Fjh3FHKwiDGxSArpsji0G4SLrecp2KzUaYGzBxWJpAhDFycAjCR8oOMDE9c15+RqRTcX3k8 6Ut7c0bSFpXFB00LNppx5dnm3mwpP8bIcMXqwIVlW5VCue8lOpc+9GAKe/Ls4JTtEx4trtSZmZf MxQcA X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Add a selftest for PIDFD_INFO_EXIT behavior. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-10-44fdacfaa7b7@kernel.org Signed-off-by: Christian Brauner --- tools/testing/selftests/pidfd/.gitignore | 1 + tools/testing/selftests/pidfd/Makefile | 2 +- tools/testing/selftests/pidfd/pidfd.h | 6 +- tools/testing/selftests/pidfd/pidfd_info_test.c | 146 ++++++++++++++++++++++++ 4 files changed, 153 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/pidfd/.gitignore b/tools/testing/selftests/pidfd/.gitignore index bf92481f925c..bddae1d4d7e4 100644 --- a/tools/testing/selftests/pidfd/.gitignore +++ b/tools/testing/selftests/pidfd/.gitignore @@ -8,3 +8,4 @@ pidfd_getfd_test pidfd_setns_test pidfd_file_handle_test pidfd_bind_mount +pidfd_info_test diff --git a/tools/testing/selftests/pidfd/Makefile b/tools/testing/selftests/pidfd/Makefile index 301343a11b62..a94c2bc8d594 100644 --- a/tools/testing/selftests/pidfd/Makefile +++ b/tools/testing/selftests/pidfd/Makefile @@ -3,7 +3,7 @@ CFLAGS += -g $(KHDR_INCLUDES) -pthread -Wall TEST_GEN_PROGS := pidfd_test pidfd_fdinfo_test pidfd_open_test \ pidfd_poll_test pidfd_wait pidfd_getfd_test pidfd_setns_test \ - pidfd_file_handle_test pidfd_bind_mount + pidfd_file_handle_test pidfd_bind_mount pidfd_info_test include ../lib.mk diff --git a/tools/testing/selftests/pidfd/pidfd.h b/tools/testing/selftests/pidfd/pidfd.h index bad518766aa5..cc8e381978df 100644 --- a/tools/testing/selftests/pidfd/pidfd.h +++ b/tools/testing/selftests/pidfd/pidfd.h @@ -127,6 +127,10 @@ #define PIDFD_INFO_CGROUPID (1UL << 2) /* Always returned if available, even if not requested */ #endif +#ifndef PIDFD_INFO_EXIT +#define PIDFD_INFO_EXIT (1UL << 3) /* Always returned if available, even if not requested */ +#endif + struct pidfd_info { __u64 mask; __u64 cgroupid; @@ -141,7 +145,7 @@ struct pidfd_info { __u32 sgid; __u32 fsuid; __u32 fsgid; - __u32 spare0[1]; + __s32 exit_code; }; /* diff --git a/tools/testing/selftests/pidfd/pidfd_info_test.c b/tools/testing/selftests/pidfd/pidfd_info_test.c new file mode 100644 index 000000000000..cc1d3d5eba59 --- /dev/null +++ b/tools/testing/selftests/pidfd/pidfd_info_test.c @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: GPL-2.0 + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pidfd.h" +#include "../kselftest_harness.h" + +FIXTURE(pidfd_info) +{ + pid_t child_pid1; + int child_pidfd1; + + pid_t child_pid2; + int child_pidfd2; + + pid_t child_pid3; + int child_pidfd3; + + pid_t child_pid4; + int child_pidfd4; +}; + +FIXTURE_SETUP(pidfd_info) +{ + int ret; + int ipc_sockets[2]; + char c; + + ret = socketpair(AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0, ipc_sockets); + EXPECT_EQ(ret, 0); + + self->child_pid1 = create_child(&self->child_pidfd1, 0); + EXPECT_GE(self->child_pid1, 0); + + if (self->child_pid1 == 0) { + close(ipc_sockets[0]); + + if (write_nointr(ipc_sockets[1], "1", 1) < 0) + _exit(EXIT_FAILURE); + + close(ipc_sockets[1]); + + pause(); + _exit(EXIT_SUCCESS); + } + + EXPECT_EQ(close(ipc_sockets[1]), 0); + ASSERT_EQ(read_nointr(ipc_sockets[0], &c, 1), 1); + EXPECT_EQ(close(ipc_sockets[0]), 0); + + /* SIGKILL but don't reap. */ + EXPECT_EQ(sys_pidfd_send_signal(self->child_pidfd1, SIGKILL, NULL, 0), 0); + + ret = socketpair(AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0, ipc_sockets); + EXPECT_EQ(ret, 0); + + self->child_pid2 = create_child(&self->child_pidfd2, 0); + EXPECT_GE(self->child_pid2, 0); + + if (self->child_pid2 == 0) { + close(ipc_sockets[0]); + + if (write_nointr(ipc_sockets[1], "1", 1) < 0) + _exit(EXIT_FAILURE); + + close(ipc_sockets[1]); + + pause(); + _exit(EXIT_SUCCESS); + } + + EXPECT_EQ(close(ipc_sockets[1]), 0); + ASSERT_EQ(read_nointr(ipc_sockets[0], &c, 1), 1); + EXPECT_EQ(close(ipc_sockets[0]), 0); + + /* SIGKILL and reap. */ + EXPECT_EQ(sys_pidfd_send_signal(self->child_pidfd2, SIGKILL, NULL, 0), 0); + EXPECT_EQ(sys_waitid(P_PID, self->child_pid2, NULL, WEXITED), 0); + + self->child_pid3 = create_child(&self->child_pidfd3, CLONE_NEWUSER | CLONE_NEWPID); + EXPECT_GE(self->child_pid3, 0); + + if (self->child_pid3 == 0) + _exit(EXIT_SUCCESS); + + self->child_pid4 = create_child(&self->child_pidfd4, CLONE_NEWUSER | CLONE_NEWPID); + EXPECT_GE(self->child_pid4, 0); + + if (self->child_pid4 == 0) + _exit(EXIT_SUCCESS); + + EXPECT_EQ(sys_waitid(P_PID, self->child_pid4, NULL, WEXITED), 0); +} + +FIXTURE_TEARDOWN(pidfd_info) +{ + sys_pidfd_send_signal(self->child_pidfd1, SIGKILL, NULL, 0); + if (self->child_pidfd1 >= 0) + EXPECT_EQ(0, close(self->child_pidfd1)); + + sys_waitid(P_PID, self->child_pid1, NULL, WEXITED); + + sys_pidfd_send_signal(self->child_pidfd2, SIGKILL, NULL, 0); + if (self->child_pidfd2 >= 0) + EXPECT_EQ(0, close(self->child_pidfd2)); + + sys_waitid(P_PID, self->child_pid2, NULL, WEXITED); + sys_waitid(P_PID, self->child_pid3, NULL, WEXITED); + sys_waitid(P_PID, self->child_pid4, NULL, WEXITED); +} + +TEST_F(pidfd_info, sigkill_exit) +{ + struct pidfd_info info = { + .mask = PIDFD_INFO_CGROUPID, + }; + + /* Process has exited but not been reaped so this must work. */ + ASSERT_EQ(ioctl(self->child_pidfd1, PIDFD_GET_INFO, &info), 0); + + info.mask = PIDFD_INFO_CGROUPID | PIDFD_INFO_EXIT; + ASSERT_EQ(ioctl(self->child_pidfd1, PIDFD_GET_INFO, &info), 0); + ASSERT_TRUE(!!(info.mask & PIDFD_INFO_CREDS)); + /* Process has exited but not been reaped, so no PIDFD_INFO_EXIT information yet. */ + ASSERT_FALSE(!!(info.mask & PIDFD_INFO_EXIT)); +} + +TEST_HARNESS_MAIN From patchwork Wed Mar 5 10:08:21 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002279 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 492CE86340 for ; Wed, 5 Mar 2025 10:08:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169330; cv=none; b=mcBy+VFxRULUf2U6I6C/NKXwXAZvxGg4jjj24zRVD9xRwwWS0RxTIvRRgdKkJu/0trnLJvO81EXr4T7VF6N93kMSfnHf0DzRKLrre6RYjcGZ7PDl6gi3aGgLt4e+R6Dy3BN0bPAAvUyPzhE14cr5RwZrK1Q64bVXZ67waJic3Gc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169330; c=relaxed/simple; bh=uwTb2pvynGcEgNzKA2n7t8TdmNS33iMLyCP94yRdyUo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=u4Lc8MlRfqVni95WZqIB7itFa2UvSFe6fpr+KQAwuJqyGyysd5slWzHuLQOMvgu77h936MakkAO5Ha6T4v5MVBBDAEl1TOY8bJ7g0w1kYd+5+TaKlibC8DIJ/UKskvdbsT16y2qxYpDRuKeQD/EUj/QDLDHmrUJfnu1C5ufTVsY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DtNt2sXy; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="DtNt2sXy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1D224C4CEEC; Wed, 5 Mar 2025 10:08:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169329; bh=uwTb2pvynGcEgNzKA2n7t8TdmNS33iMLyCP94yRdyUo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=DtNt2sXyLOBOh7XfDsBrSr5C9neJThwBY9xcVLyq/QV218UjV5q8E8YDoz9AzTCMU qBtnLYMrdkOWxHGLyH0YQPGS42jytRpRzAD1vpQwLgu1oO5JUobfc8MmwuMND5de4u zYepzVbnz/ko0CVJRSwqOQ1uB6REn2+6XAt8qn1GQ+JPfHW+QmHTDhIeQ9lxMuLR7e 3zb67M9/v3AwEUW3eo37O8wTy82Ew69mekIuGlTLw+NxOhmUGCW2+kH0n4sxH7wrIy PdoL0ymnKGjEuCYrdjLyOd6LYfygf1e9OqIHlxXRSk2w2OUgePw91ms57UZIAxTSql pOpcGoLB9PiLA== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:21 +0100 Subject: [PATCH v3 11/16] selftests/pidfd: add second PIDFD_INFO_EXIT selftest Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-11-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=1342; i=brauner@kernel.org; h=from:subject:message-id; bh=uwTb2pvynGcEgNzKA2n7t8TdmNS33iMLyCP94yRdyUo=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJqh27L3aINRrPZNuwlPNy7svDY3S7TxP9+EU5Py5 LJ3Zbje6ShlYRDjYpAVU2RxaDcJl1vOU7HZKFMDZg4rE8gQBi5OAZiIXRsjw7qj0+4KFL7cY9Ia y3m2q2ymf1UYR3fVuujvpSIc075uNmH4n59vbnGVoUtAL/Ewk9O9T2bS2t02/qzXG1zFDor/PhX KBQA= X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Add a selftest for PIDFD_INFO_EXIT behavior. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-11-44fdacfaa7b7@kernel.org Signed-off-by: Christian Brauner --- tools/testing/selftests/pidfd/pidfd_info_test.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tools/testing/selftests/pidfd/pidfd_info_test.c b/tools/testing/selftests/pidfd/pidfd_info_test.c index cc1d3d5eba59..2a5742a2a55f 100644 --- a/tools/testing/selftests/pidfd/pidfd_info_test.c +++ b/tools/testing/selftests/pidfd/pidfd_info_test.c @@ -143,4 +143,22 @@ TEST_F(pidfd_info, sigkill_exit) ASSERT_FALSE(!!(info.mask & PIDFD_INFO_EXIT)); } +TEST_F(pidfd_info, sigkill_reaped) +{ + struct pidfd_info info = { + .mask = PIDFD_INFO_CGROUPID, + }; + + /* Process has already been reaped and PIDFD_INFO_EXIT hasn't been set. */ + ASSERT_NE(ioctl(self->child_pidfd2, PIDFD_GET_INFO, &info), 0); + ASSERT_EQ(errno, ESRCH); + + info.mask = PIDFD_INFO_CGROUPID | PIDFD_INFO_EXIT; + 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 From patchwork Wed Mar 5 10:08:22 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002280 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4EDD01D6DAA for ; Wed, 5 Mar 2025 10:08:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169332; cv=none; b=kvwZ4VU7R8+eU6G03sDVRiYIkHJ8TM42xnPjfiZYSUUXhSDLYnVAONA1sR2lnNqqTqqlw/cI6KpYsq3pxJ5YHcjIy1Fl/bxeuhz8BYKkdG9/ZXwPSLNvvqDYj65JZFhb2Xb4giFwvPovn6PhmU0Tql/iYFaYFKtUIRlvHb9bqzA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169332; c=relaxed/simple; bh=oP9IhwdJs11Q5YuvhKDWEh1JtMVkn6DkC7RkvocNVOM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EWR7OH6cFqAPZ7zDVI0E7Bsg7YMDWPorsmaEleoARSvx+vZtaasZ8A7loryLLDHl4dmgBQwTNtr/UHuo/rfo4Uutkwtxy7t4Lm5IiFQpTw+MdpqommKYuWVyaZI70DoIfw5l96MBqg2adpV20kgflyZxV1mkBtTHVXD2Rz2s8qI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NOfyB2eB; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NOfyB2eB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3BF86C4CEE2; Wed, 5 Mar 2025 10:08:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169331; bh=oP9IhwdJs11Q5YuvhKDWEh1JtMVkn6DkC7RkvocNVOM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=NOfyB2eBCFr9aghrZXDdSavu5XJaTh5DcyqNhI3zj5KBiuMZkPOq1ftT+hJKo8RqD 6tl6m8ly4TlWdO7B6Iy7qjqrpO9q8ZcnJUhNiFLh+/LX95o98183AUZlOChke/49Vw /qJYAGinL/tBpaVNrygXNrPqeJbzfss3FF+m9oymyyOzJUu6ZdWasrvssfuSwrxwmf zYKDMHBFmY9ZxzyhBEGynvzP/5QowdDpbXS1tcnJ+whYSjskyGmdFBINpoWtr8Jk86 nww89b0LG2eoblKi0kWwlu2ROFtVLexg8q6olgCvxY/WffThtmrYUuO5Vj4+6jkRWk lEY2N6SFWVMmw== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:22 +0100 Subject: [PATCH v3 12/16] selftests/pidfd: add third PIDFD_INFO_EXIT selftest Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-12-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=1294; i=brauner@kernel.org; h=from:subject:message-id; bh=oP9IhwdJs11Q5YuvhKDWEh1JtMVkn6DkC7RkvocNVOM=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJqx9nhqqsaLy6LKJqndsbNennVf0HFvK8fpvc7ch TGKbhN1O0pZGMS4GGTFFFkc2k3C5ZbzVGw2ytSAmcPKBDKEgYtTACYSJs7wz/KIwcr+gmesCcdM yyLsV7dzeBVnidik63H1H2/y3agaz/A/wDQnPds0tNnl6v1lGl0+y43S38x4eMfscy/nSWvJjaF cAA== X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Add a selftest for PIDFD_INFO_EXIT behavior. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-12-44fdacfaa7b7@kernel.org Signed-off-by: Christian Brauner --- tools/testing/selftests/pidfd/pidfd_info_test.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tools/testing/selftests/pidfd/pidfd_info_test.c b/tools/testing/selftests/pidfd/pidfd_info_test.c index 2a5742a2a55f..2917e7a03b31 100644 --- a/tools/testing/selftests/pidfd/pidfd_info_test.c +++ b/tools/testing/selftests/pidfd/pidfd_info_test.c @@ -161,4 +161,20 @@ TEST_F(pidfd_info, sigkill_reaped) ASSERT_EQ(WTERMSIG(info.exit_code), SIGKILL); } +TEST_F(pidfd_info, success_exit) +{ + struct pidfd_info info = { + .mask = PIDFD_INFO_CGROUPID, + }; + + /* Process has exited but not been reaped so this must work. */ + ASSERT_EQ(ioctl(self->child_pidfd3, PIDFD_GET_INFO, &info), 0); + + info.mask = PIDFD_INFO_CGROUPID | PIDFD_INFO_EXIT; + ASSERT_EQ(ioctl(self->child_pidfd3, PIDFD_GET_INFO, &info), 0); + ASSERT_TRUE(!!(info.mask & PIDFD_INFO_CREDS)); + /* Process has exited but not been reaped, so no PIDFD_INFO_EXIT information yet. */ + ASSERT_FALSE(!!(info.mask & PIDFD_INFO_EXIT)); +} + TEST_HARNESS_MAIN From patchwork Wed Mar 5 10:08:23 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002281 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7AFF22063DA for ; Wed, 5 Mar 2025 10:08:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169334; cv=none; b=NguLSRrnHAeR1OSohmD5wmRgovsA8ELfF9xKAosLrFeRni1xhqFZiJlcGYVDbvsmOaw7Ozx03IDLEVq3HjI7EtD1YKHFaYg3576QgV4cPp8YjK/IVNqk+1Qp1ta/aYnjdtq4+h50AequC87Sti4iaWCG6P5lL6n+ukHonRu5GP8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169334; c=relaxed/simple; bh=wwARZbNS6jnmacvDGKl5nDtXqnIvAP/pwPRnxTqY0WE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TUZxuxNCJSrkR4vfKLDnVK+x8n9mv6+2A48TPTvdIrDheVKpSmPsXZ18leecoLFNrU4WLQ7Ai1stS5MVbWQNtgV3OhOc7Az+K9mJYc/Lxwr6ObJq7QTdltViVZ2s+S19/6ItG1PVS8KelLD4HsZs87olf7sYe3HJ3BGjLvPpR8g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=czVwMHlZ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="czVwMHlZ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 62887C4CEE9; Wed, 5 Mar 2025 10:08:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169334; bh=wwARZbNS6jnmacvDGKl5nDtXqnIvAP/pwPRnxTqY0WE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=czVwMHlZumCHlwyJ5jayW1mSDkEu8umYrkmDRSVpYwmKk/QS3Cwpc2xhYVNPP1xw5 8B6TrJ+JKSIMK3g+UEtw99uNMDDqHLJMdmPrX0GKh9QSZRFyiRLfI4VQr32eHhbymF NC4HaB40aS+p5Te2cdlwpb2FSaz6xr3gT+r3146JnqQwnjEk42J1rH9brGl8uG76CA 2eEZn46i5BMdPqMke9FcQk73QupHZbldpRzoU61MBXieCDVbpEgCNRgxPS14wBmr7m XCrGm8GNo8+DDzlxSKbh7UOqResj/XGyq9vVoK1EQETVYzhQuRbtcF7n9r8jfugYBj 99dBGY2RXTdMw== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:23 +0100 Subject: [PATCH v3 13/16] selftests/pidfd: add fourth PIDFD_INFO_EXIT selftest Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-13-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=1337; i=brauner@kernel.org; h=from:subject:message-id; bh=wwARZbNS6jnmacvDGKl5nDtXqnIvAP/pwPRnxTqY0WE=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJqx//nJm9ybzvsaO2Rmut2822PAzHJhrYJmjZtET jrH/3itjlIWBjEuBlkxRRaHdpNwueU8FZuNMjVg5rAygQxh4OIUgIn0VTH8z6heNDlEx89AQVLl ruKN0Ev9d5oObl4Q822HgarWxbdR9xj+V7LtTws8uJh9yRqVkIK2zS/Di6Yf8r0WPi++3yfbPcq GFQA= X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Add a selftest for PIDFD_INFO_EXIT behavior. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-13-44fdacfaa7b7@kernel.org Signed-off-by: Christian Brauner --- tools/testing/selftests/pidfd/pidfd_info_test.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tools/testing/selftests/pidfd/pidfd_info_test.c b/tools/testing/selftests/pidfd/pidfd_info_test.c index 2917e7a03b31..0d0af4c2a84d 100644 --- a/tools/testing/selftests/pidfd/pidfd_info_test.c +++ b/tools/testing/selftests/pidfd/pidfd_info_test.c @@ -177,4 +177,22 @@ TEST_F(pidfd_info, success_exit) ASSERT_FALSE(!!(info.mask & PIDFD_INFO_EXIT)); } +TEST_F(pidfd_info, success_reaped) +{ + struct pidfd_info info = { + .mask = PIDFD_INFO_CGROUPID, + }; + + /* Process has already been reaped and PIDFD_INFO_EXIT hasn't been set. */ + ASSERT_NE(ioctl(self->child_pidfd4, PIDFD_GET_INFO, &info), 0); + ASSERT_EQ(errno, ESRCH); + + info.mask = PIDFD_INFO_CGROUPID | PIDFD_INFO_EXIT; + ASSERT_EQ(ioctl(self->child_pidfd4, PIDFD_GET_INFO, &info), 0); + ASSERT_FALSE(!!(info.mask & PIDFD_INFO_CREDS)); + ASSERT_TRUE(!!(info.mask & PIDFD_INFO_EXIT)); + ASSERT_TRUE(WIFEXITED(info.exit_code)); + ASSERT_EQ(WEXITSTATUS(info.exit_code), 0); +} + TEST_HARNESS_MAIN From patchwork Wed Mar 5 10:08:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002282 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A5BE42063DA for ; Wed, 5 Mar 2025 10:08:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169336; cv=none; b=JF6gWIYttg1AksHg4NSjgATl5yuSSXIqvobxFvW70Y0yGmQdoGDo6cYfIGymF5mdWv+ZuMDsjin7k1G1sAEBQ3AuN6RwtARF8RuBJ5B8LmHfbx3xoI4YDES6DXhcd7RRbB7SzcatI1o1CsX6g6velv1oB9c93LcSczo99y3igpA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169336; c=relaxed/simple; bh=09cygfBWafKS4lAMkHha117hVNJDUvnJJYHRqyPblAo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DKKcHb+jCPdUTwuGknMubCgwvB6QZOltiMySlgBng9eiH0qWSxvhKls5zWA5QCLL04WVDOlgzdBIwQSzJnyk9MWhBSUErG8v3ZdAfyOo6KB9R/jyvafBeWmAv3FrZqvWjEtWgQJCBY5R8g0El/BGMPIIZjfZL2SPK6n7E/XwTaM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=anF5O6ax; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="anF5O6ax" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8470AC4CEE2; Wed, 5 Mar 2025 10:08:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169336; bh=09cygfBWafKS4lAMkHha117hVNJDUvnJJYHRqyPblAo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=anF5O6ax9UhrVbvRCvjAVOIDpH9u/r834e5Y5YM+1d8RA1mkxwkkayohMRVRJN01s RoR5UqolM6GuDBQQm6muLSQubDlpwjO37uW9tukQ9BrYpznjPhrbvlf39mmgBEh4D0 UJQqtQuobgCxU8TMIkiYh55p0ieio7PRtqi2dqlGG3ZR3J81m/Lv0YJx/bGygyK/bu +THr/tKduY/CzFnXEaG5velZigHHyCRW/U5Vb1jxgiL3GGZoPq5nfzILgb8sG8ZFTO EVvVDBwJNE/e+1AXjz0HofQE44q3wajZ5PKXYye3SdHvukB/smCcRLxtC6sg0rOHm9 nRmY2bJd1PaUg== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:24 +0100 Subject: [PATCH v3 14/16] selftests/pidfd: add fifth PIDFD_INFO_EXIT selftest Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-14-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=1386; i=brauner@kernel.org; h=from:subject:message-id; bh=09cygfBWafKS4lAMkHha117hVNJDUvnJJYHRqyPblAo=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJqRlpoVs6I0yMDnzg7Jw1L2S6c8PZPDJReuxao1Q YXXeGltRwkLgxgXg6yYIotDu0m43HKeis1GmRowc1iZQIYwcHEKwEQ07jH8eD2LlWny+h+BCw14 n//XvsTFytS0oTa6R51B7/MEWddcRobf6Us/Oupd3KAYdiXxy9E5jKcj6hw3hXx9/sDT9PzdZyk 8AA== X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Add a selftest for PIDFD_INFO_EXIT behavior. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-14-44fdacfaa7b7@kernel.org Signed-off-by: Christian Brauner --- 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 From patchwork Wed Mar 5 10:08:25 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002283 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9B4562063EE for ; Wed, 5 Mar 2025 10:08:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169338; cv=none; b=ECm3wdmB8prCILgic2crZ5kPfMhUNnI7dWQ86OxTQXGR4ES6uYnE0JM8KhH9Wv1xzQsYnRaqFC8L324eOMEtYTg6mTOWTas0ZUcPpCgOkmt91rYaJB/HBOjK3VcwQ7oVayeCMe3UQnfhRXAfc322TLKYAPc4TimDJzaToFY/AJY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169338; c=relaxed/simple; bh=n1AmvJGTE+dyEb9yOEMqfK/t0tSBbHA/ZFXA20F2ATU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UbRZOO6PLMrkXCFdAkw6j6VPtFr6IavIM0GqnoHiNFc0tVX3XzYZvLZo7RZi2OiwY08h3BKIVQf9NCkDGxR7rtN6nq+bDs7jGpIOCjGkQ3biFgdSYwse9vQsPxOX0yXcnksJeZK6TFyhh1aXyUa3e+rwzXgZou8HctQ2TudLb64= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GAO6mqOu; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="GAO6mqOu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9354DC4CEE8; Wed, 5 Mar 2025 10:08:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169338; bh=n1AmvJGTE+dyEb9yOEMqfK/t0tSBbHA/ZFXA20F2ATU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=GAO6mqOudhuBr0X7TUoV8q9nKy/A0crUZIXYAqwRa8y41v48IyYwIakLf62LaXz7g gqN1Rt33wwm1mjwo6LWKIZ7y5xgZRbppgLCCtyI8OfvbumkFq209vIv9pMidlL9enj 6jmUsEhPG84BH1ltW8Ln+4EyQOox25tsPFOGD5kiY1eZVhj2T2ZzHI5yHgZnWfc/Xb Ciov+yM3aD+GbOyIJZ7uqTgb4XxdMdH/PQbqKIvkR5NotGRWr1ilCNJs4aDkCW7mGG +p3/a07RU8MWcdqYEV4mKWeLBHicw7vmalve1i6t6KA/RG3UOp8OyZEvduUdLJrQt0 Mrol90+Bap+HQ== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:25 +0100 Subject: [PATCH v3 15/16] selftests/pidfd: add sixth PIDFD_INFO_EXIT selftest Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-15-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=6744; i=brauner@kernel.org; h=from:subject:message-id; bh=n1AmvJGTE+dyEb9yOEMqfK/t0tSBbHA/ZFXA20F2ATU=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJphzuXmrXnT4mJ36KTVB9gtDog76PwO3cXrPTP6N GOB1fbDHaUsDGJcDLJiiiwO7Sbhcst5KjYbZWrAzGFlAhnCwMUpABOZaMjIMMtpSfX2OrftnWVS a/n/mpdYsLqeiFSo/dnarM9hk50ewMjQsCE9921h4B7L8Fl75sXEsh6fIRWzy9YmtShAbfKe+ay cAA== X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Add a selftest for PIDFD_INFO_EXIT behavior. Link: https://lore.kernel.org/r/20250304-work-pidfs-kill_on_last_close-v2-15-44fdacfaa7b7@kernel.org Signed-off-by: Christian Brauner --- tools/testing/selftests/pidfd/pidfd.h | 4 + tools/testing/selftests/pidfd/pidfd_info_test.c | 151 ++++++++++++++++++++++++ 2 files changed, 155 insertions(+) diff --git a/tools/testing/selftests/pidfd/pidfd.h b/tools/testing/selftests/pidfd/pidfd.h index cc8e381978df..fee6fd3e67dd 100644 --- a/tools/testing/selftests/pidfd/pidfd.h +++ b/tools/testing/selftests/pidfd/pidfd.h @@ -131,6 +131,10 @@ #define PIDFD_INFO_EXIT (1UL << 3) /* Always returned if available, even if not requested */ #endif +#ifndef PIDFD_THREAD +#define PIDFD_THREAD O_EXCL +#endif + struct pidfd_info { __u64 mask; __u64 cgroupid; diff --git a/tools/testing/selftests/pidfd/pidfd_info_test.c b/tools/testing/selftests/pidfd/pidfd_info_test.c index 16e4be2364df..5e86e3df323b 100644 --- a/tools/testing/selftests/pidfd/pidfd_info_test.c +++ b/tools/testing/selftests/pidfd/pidfd_info_test.c @@ -218,4 +218,155 @@ TEST_F(pidfd_info, success_reaped_poll) ASSERT_EQ(WTERMSIG(info.exit_code), SIGKILL); } +static void *pidfd_info_pause_thread(void *arg) +{ + pid_t pid_thread = gettid(); + int ipc_socket = *(int *)arg; + + /* Inform the grand-parent what the tid of this thread is. */ + if (write_nointr(ipc_socket, &pid_thread, sizeof(pid_thread)) != sizeof(pid_thread)) + return NULL; + + close(ipc_socket); + + /* Sleep untill we're killed. */ + pause(); + return NULL; +} + +TEST_F(pidfd_info, thread_group) +{ + pid_t pid_leader, pid_thread; + pthread_t thread; + int nevents, pidfd_leader, pidfd_thread, pidfd_leader_thread, ret; + int ipc_sockets[2]; + struct pollfd fds = {}; + struct pidfd_info info = { + .mask = PIDFD_INFO_CGROUPID | PIDFD_INFO_EXIT, + }, info2; + + ret = socketpair(AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0, ipc_sockets); + EXPECT_EQ(ret, 0); + + pid_leader = create_child(&pidfd_leader, 0); + EXPECT_GE(pid_leader, 0); + + if (pid_leader == 0) { + close(ipc_sockets[0]); + + /* The thread will outlive the thread-group leader. */ + if (pthread_create(&thread, NULL, pidfd_info_pause_thread, &ipc_sockets[1])) + syscall(__NR_exit, EXIT_FAILURE); + + /* Make the thread-group leader exit prematurely. */ + syscall(__NR_exit, EXIT_SUCCESS); + } + + /* Retrieve the tid of the thread. */ + EXPECT_EQ(close(ipc_sockets[1]), 0); + ASSERT_EQ(read_nointr(ipc_sockets[0], &pid_thread, sizeof(pid_thread)), sizeof(pid_thread)); + EXPECT_EQ(close(ipc_sockets[0]), 0); + + /* Opening a thread as a thread-group leader must fail. */ + pidfd_thread = sys_pidfd_open(pid_thread, 0); + ASSERT_LT(pidfd_thread, 0); + + /* Opening a thread as a PIDFD_THREAD must succeed. */ + pidfd_thread = sys_pidfd_open(pid_thread, PIDFD_THREAD); + ASSERT_GE(pidfd_thread, 0); + + /* + * Opening a PIDFD_THREAD aka thread-specific pidfd based on a + * thread-group leader must succeed. + */ + pidfd_leader_thread = sys_pidfd_open(pid_leader, PIDFD_THREAD); + ASSERT_GE(pidfd_leader_thread, 0); + + /* + * Note that pidfd_leader is a thread-group pidfd, so polling on it + * would only notify us once all thread in the thread-group have + * exited. So we can't poll before we have taken down the whole + * thread-group. + */ + + /* Get PIDFD_GET_INFO using the thread-group leader pidfd. */ + ASSERT_EQ(ioctl(pidfd_leader, PIDFD_GET_INFO, &info), 0); + ASSERT_TRUE(!!(info.mask & PIDFD_INFO_CREDS)); + /* Process has exited but not been reaped, so no PIDFD_INFO_EXIT information yet. */ + ASSERT_FALSE(!!(info.mask & PIDFD_INFO_EXIT)); + ASSERT_EQ(info.pid, pid_leader); + + /* + * Now retrieve the same info using the thread specific pidfd + * for the thread-group leader. + */ + info2.mask = PIDFD_INFO_CGROUPID | PIDFD_INFO_EXIT; + ASSERT_EQ(ioctl(pidfd_leader_thread, PIDFD_GET_INFO, &info2), 0); + ASSERT_TRUE(!!(info2.mask & PIDFD_INFO_CREDS)); + /* Process has exited but not been reaped, so no PIDFD_INFO_EXIT information yet. */ + ASSERT_FALSE(!!(info2.mask & PIDFD_INFO_EXIT)); + ASSERT_EQ(info2.pid, pid_leader); + + /* Now try the thread-specific pidfd. */ + ASSERT_EQ(ioctl(pidfd_thread, PIDFD_GET_INFO, &info), 0); + ASSERT_TRUE(!!(info.mask & PIDFD_INFO_CREDS)); + /* The thread hasn't exited, so no PIDFD_INFO_EXIT information yet. */ + ASSERT_FALSE(!!(info.mask & PIDFD_INFO_EXIT)); + ASSERT_EQ(info.pid, pid_thread); + + /* + * Take down the whole thread-group. The thread-group leader + * exited successfully but the thread will now be SIGKILLed. + * This must be reflected in the recorded exit information. + */ + EXPECT_EQ(sys_pidfd_send_signal(pidfd_leader, SIGKILL, NULL, 0), 0); + EXPECT_EQ(sys_waitid(P_PIDFD, pidfd_leader, NULL, WEXITED), 0); + + fds.events = POLLIN; + fds.fd = pidfd_leader; + nevents = poll(&fds, 1, -1); + ASSERT_EQ(nevents, 1); + ASSERT_TRUE(!!(fds.revents & POLLIN)); + /* The thread-group leader has been reaped. */ + ASSERT_TRUE(!!(fds.revents & POLLHUP)); + + /* + * Retrieve exit information for the thread-group leader via the + * thread-group leader pidfd. + */ + info.mask = PIDFD_INFO_CGROUPID | PIDFD_INFO_EXIT; + ASSERT_EQ(ioctl(pidfd_leader, PIDFD_GET_INFO, &info), 0); + ASSERT_FALSE(!!(info.mask & PIDFD_INFO_CREDS)); + ASSERT_TRUE(!!(info.mask & PIDFD_INFO_EXIT)); + /* The thread-group leader exited successfully. Only the specific thread was SIGKILLed. */ + ASSERT_TRUE(WIFEXITED(info.exit_code)); + ASSERT_EQ(WEXITSTATUS(info.exit_code), 0); + + /* + * Retrieve exit information for the thread-group leader via the + * thread-specific pidfd. + */ + info2.mask = PIDFD_INFO_CGROUPID | PIDFD_INFO_EXIT; + ASSERT_EQ(ioctl(pidfd_leader_thread, PIDFD_GET_INFO, &info2), 0); + ASSERT_FALSE(!!(info2.mask & PIDFD_INFO_CREDS)); + ASSERT_TRUE(!!(info2.mask & PIDFD_INFO_EXIT)); + + /* The thread-group leader exited successfully. Only the specific thread was SIGKILLed. */ + ASSERT_TRUE(WIFEXITED(info2.exit_code)); + ASSERT_EQ(WEXITSTATUS(info2.exit_code), 0); + + /* Retrieve exit information for the thread. */ + info.mask = PIDFD_INFO_CGROUPID | PIDFD_INFO_EXIT; + ASSERT_EQ(ioctl(pidfd_thread, PIDFD_GET_INFO, &info), 0); + ASSERT_FALSE(!!(info.mask & PIDFD_INFO_CREDS)); + ASSERT_TRUE(!!(info.mask & PIDFD_INFO_EXIT)); + + /* The thread got SIGKILLed. */ + ASSERT_TRUE(WIFSIGNALED(info.exit_code)); + ASSERT_EQ(WTERMSIG(info.exit_code), SIGKILL); + + EXPECT_EQ(close(pidfd_leader), 0); + EXPECT_EQ(close(pidfd_thread), 0); +} + TEST_HARNESS_MAIN From patchwork Wed Mar 5 10:08:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 14002284 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 408782063DA for ; Wed, 5 Mar 2025 10:09:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169340; cv=none; b=IkYfZm+l5SMBdhS86UQTEJjc9xbMC+hUrNWCI6vyvf6xyxcuKtYHPTHqONucWtH8eXKjdG6L+em7XY7WIodwcOAgjZmRzuhLKfJRHf8vj85EOJPWbCUBDg65n7EjRoUH+P0Dlk/JN5EjpMBSmMw991nUiXlntxqt5y5uvYatk9Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741169340; c=relaxed/simple; bh=2vzwBgldpyiPOQOL4Gu0EW3tT0G1/GW/7QIQOyUINnw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PonrNt2FIFKkXi1TwiAWtHKrqIu6jN1k8LrnNNPDed4Fh5Uxx5gtcIbHYHqQgwNc+/vvCXGLjqzSkG/oWSmy+a+/WHHpMx9UShvgImjCyfTz+FwNRk3A4O8uLTkN2Y7SmKZ/xAY0W8AjSmxBLn5gpVcuWmjLRUA2nVZ1fbBUBbY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=A8xHPRgV; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="A8xHPRgV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 95782C4CEEB; Wed, 5 Mar 2025 10:08:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741169340; bh=2vzwBgldpyiPOQOL4Gu0EW3tT0G1/GW/7QIQOyUINnw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=A8xHPRgVwsEPlUHmwA5n+qAwErJhBXHRUwM2y75ZNplXxcwmwWRkYd5esQj68zYKV 7tAXp37oszlDtL7LYEWwTYBzPQLXNJBWvb+Coi8tw/+0ZmViXarSE5H9A42azLq7lD JpMuvIjNGObj9AyE+SgK46kAKJXiNLRlup++Go2TDBVA8HN2dU8i8S2sb+bM43rcnE bD8CiqRm8BNWkOWDtM4MqPEGz6zhnjJcfmPiLxM/W0crPyWM+qdttMS3yiVuoGnjUW crZpaO9eYkLQpHBDOBYfdNWJU48lrL2VADsPp9Er99ZWywT4OynQ+77IyPEBIMJXkU yP2qh4nzv2WUQ== From: Christian Brauner Date: Wed, 05 Mar 2025 11:08:26 +0100 Subject: [PATCH v3 16/16] selftests/pidfd: add seventh PIDFD_INFO_EXIT selftest Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250305-work-pidfs-kill_on_last_close-v3-16-c8c3d8361705@kernel.org> References: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> In-Reply-To: <20250305-work-pidfs-kill_on_last_close-v3-0-c8c3d8361705@kernel.org> To: Oleg Nesterov Cc: linux-fsdevel@vger.kernel.org, Jeff Layton , Lennart Poettering , Daan De Meyer , Mike Yuan , Christian Brauner X-Mailer: b4 0.15-dev-42535 X-Developer-Signature: v=1; a=openpgp-sha256; l=7214; i=brauner@kernel.org; h=from:subject:message-id; bh=2vzwBgldpyiPOQOL4Gu0EW3tT0G1/GW/7QIQOyUINnw=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaSfUJrRODmWWVRuYYaD2Jc78z0Uj2Wuuak6a9FhLfmf/ xaqbru1sKOUhUGMi0FWTJHFod0kXG45T8Vmo0wNmDmsTCBDGLg4BWAiKuYMv5jfl94O0fFIPb9v zkzvMpmm+S7vju166tcn1u3/bOoWq0OMDB0upw4J6Dvmitb8mTVDzLGDc++16O/R3fEi05jKrn9 YwwEA X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Add a selftest for PIDFD_INFO_EXIT behavior. Signed-off-by: Christian Brauner --- tools/testing/selftests/pidfd/.gitignore | 1 + tools/testing/selftests/pidfd/Makefile | 2 + tools/testing/selftests/pidfd/pidfd.h | 7 ++ tools/testing/selftests/pidfd/pidfd_exec_helper.c | 12 +++ tools/testing/selftests/pidfd/pidfd_info_test.c | 125 ++++++++++++++++++++++ 5 files changed, 147 insertions(+) diff --git a/tools/testing/selftests/pidfd/.gitignore b/tools/testing/selftests/pidfd/.gitignore index bddae1d4d7e4..0406a065deb4 100644 --- a/tools/testing/selftests/pidfd/.gitignore +++ b/tools/testing/selftests/pidfd/.gitignore @@ -9,3 +9,4 @@ pidfd_setns_test pidfd_file_handle_test pidfd_bind_mount pidfd_info_test +pidfd_exec_helper diff --git a/tools/testing/selftests/pidfd/Makefile b/tools/testing/selftests/pidfd/Makefile index a94c2bc8d594..fcbefc0d77f6 100644 --- a/tools/testing/selftests/pidfd/Makefile +++ b/tools/testing/selftests/pidfd/Makefile @@ -5,5 +5,7 @@ TEST_GEN_PROGS := pidfd_test pidfd_fdinfo_test pidfd_open_test \ pidfd_poll_test pidfd_wait pidfd_getfd_test pidfd_setns_test \ pidfd_file_handle_test pidfd_bind_mount pidfd_info_test +TEST_GEN_PROGS_EXTENDED := pidfd_exec_helper + include ../lib.mk diff --git a/tools/testing/selftests/pidfd/pidfd.h b/tools/testing/selftests/pidfd/pidfd.h index fee6fd3e67dd..cec22aa11cdf 100644 --- a/tools/testing/selftests/pidfd/pidfd.h +++ b/tools/testing/selftests/pidfd/pidfd.h @@ -254,4 +254,11 @@ static inline ssize_t write_nointr(int fd, const void *buf, size_t count) return ret; } +static inline int sys_execveat(int dirfd, const char *pathname, + char *const argv[], char *const envp[], + int flags) +{ + return syscall(__NR_execveat, dirfd, pathname, argv, envp, flags); +} + #endif /* __PIDFD_H */ diff --git a/tools/testing/selftests/pidfd/pidfd_exec_helper.c b/tools/testing/selftests/pidfd/pidfd_exec_helper.c new file mode 100644 index 000000000000..5516808c95f2 --- /dev/null +++ b/tools/testing/selftests/pidfd/pidfd_exec_helper.c @@ -0,0 +1,12 @@ +#define _GNU_SOURCE +#include +#include +#include + +int main(int argc, char *argv[]) +{ + if (pause()) + _exit(EXIT_FAILURE); + + _exit(EXIT_SUCCESS); +} diff --git a/tools/testing/selftests/pidfd/pidfd_info_test.c b/tools/testing/selftests/pidfd/pidfd_info_test.c index 5e86e3df323b..09bc4ae7aed5 100644 --- a/tools/testing/selftests/pidfd/pidfd_info_test.c +++ b/tools/testing/selftests/pidfd/pidfd_info_test.c @@ -369,4 +369,129 @@ TEST_F(pidfd_info, thread_group) EXPECT_EQ(close(pidfd_thread), 0); } +static void *pidfd_info_thread_exec(void *arg) +{ + pid_t pid_thread = gettid(); + int ipc_socket = *(int *)arg; + + /* Inform the grand-parent what the tid of this thread is. */ + if (write_nointr(ipc_socket, &pid_thread, sizeof(pid_thread)) != sizeof(pid_thread)) + return NULL; + + if (read_nointr(ipc_socket, &pid_thread, sizeof(pid_thread)) != sizeof(pid_thread)) + return NULL; + + close(ipc_socket); + + sys_execveat(AT_FDCWD, "pidfd_exec_helper", NULL, NULL, 0); + return NULL; +} + +TEST_F(pidfd_info, thread_group_exec) +{ + pid_t pid_leader, pid_thread; + pthread_t thread; + int nevents, pidfd_leader, pidfd_leader_thread, pidfd_thread, ret; + int ipc_sockets[2]; + struct pollfd fds = {}; + struct pidfd_info info = { + .mask = PIDFD_INFO_CGROUPID | PIDFD_INFO_EXIT, + }; + + ret = socketpair(AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0, ipc_sockets); + EXPECT_EQ(ret, 0); + + pid_leader = create_child(&pidfd_leader, 0); + EXPECT_GE(pid_leader, 0); + + if (pid_leader == 0) { + close(ipc_sockets[0]); + + /* The thread will outlive the thread-group leader. */ + if (pthread_create(&thread, NULL, pidfd_info_thread_exec, &ipc_sockets[1])) + syscall(__NR_exit, EXIT_FAILURE); + + /* Make the thread-group leader exit prematurely. */ + syscall(__NR_exit, EXIT_SUCCESS); + } + + /* Retrieve the tid of the thread. */ + EXPECT_EQ(close(ipc_sockets[1]), 0); + ASSERT_EQ(read_nointr(ipc_sockets[0], &pid_thread, sizeof(pid_thread)), sizeof(pid_thread)); + + /* Opening a thread as a PIDFD_THREAD must succeed. */ + pidfd_thread = sys_pidfd_open(pid_thread, PIDFD_THREAD); + ASSERT_GE(pidfd_thread, 0); + + /* Open a thread-specific pidfd for the thread-group leader. */ + pidfd_leader_thread = sys_pidfd_open(pid_leader, PIDFD_THREAD); + ASSERT_GE(pidfd_leader_thread, 0); + + /* + * We can poll and wait for the old thread-group leader to exit + * using a thread-specific pidfd. + * + * This only works until the thread has execed. When the thread + * has execed it will have taken over the old thread-group + * leaders struct pid. Calling poll after the thread execed will + * thus block again because a new thread-group has started (Yes, + * it's fscked.). + */ + fds.events = POLLIN; + fds.fd = pidfd_leader_thread; + nevents = poll(&fds, 1, -1); + ASSERT_EQ(nevents, 1); + /* The thread-group leader has exited. */ + ASSERT_TRUE(!!(fds.revents & POLLIN)); + /* The thread-group leader hasn't been reaped. */ + ASSERT_FALSE(!!(fds.revents & POLLHUP)); + + /* Now that we've opened a thread-specific pidfd the thread can exec. */ + ASSERT_EQ(write_nointr(ipc_sockets[0], &pid_thread, sizeof(pid_thread)), sizeof(pid_thread)); + EXPECT_EQ(close(ipc_sockets[0]), 0); + + /* Wait until the kernel has SIGKILLed the thread. */ + fds.events = POLLHUP; + fds.fd = pidfd_thread; + nevents = poll(&fds, 1, -1); + ASSERT_EQ(nevents, 1); + /* The thread has been reaped. */ + ASSERT_TRUE(!!(fds.revents & POLLHUP)); + + /* Retrieve thread-specific exit info from pidfd. */ + ASSERT_EQ(ioctl(pidfd_thread, PIDFD_GET_INFO, &info), 0); + ASSERT_FALSE(!!(info.mask & PIDFD_INFO_CREDS)); + ASSERT_TRUE(!!(info.mask & PIDFD_INFO_EXIT)); + /* + * While the kernel will have SIGKILLed the whole thread-group + * during exec it will cause the individual threads to exit + * cleanly. + */ + ASSERT_TRUE(WIFEXITED(info.exit_code)); + ASSERT_EQ(WEXITSTATUS(info.exit_code), 0); + + /* + * The thread-group leader is still alive, the thread has taken + * over its struct pid and thus its pid number. + */ + info.mask = PIDFD_INFO_CGROUPID | PIDFD_INFO_EXIT; + ASSERT_EQ(ioctl(pidfd_leader, PIDFD_GET_INFO, &info), 0); + ASSERT_TRUE(!!(info.mask & PIDFD_INFO_CREDS)); + ASSERT_FALSE(!!(info.mask & PIDFD_INFO_EXIT)); + ASSERT_EQ(info.pid, pid_leader); + + /* Take down the thread-group leader. */ + EXPECT_EQ(sys_pidfd_send_signal(pidfd_leader, SIGKILL, NULL, 0), 0); + EXPECT_EQ(sys_waitid(P_PIDFD, pidfd_leader, NULL, WEXITED), 0); + + /* Retrieve exit information for the thread-group leader. */ + info.mask = PIDFD_INFO_CGROUPID | PIDFD_INFO_EXIT; + ASSERT_EQ(ioctl(pidfd_leader, PIDFD_GET_INFO, &info), 0); + ASSERT_FALSE(!!(info.mask & PIDFD_INFO_CREDS)); + ASSERT_TRUE(!!(info.mask & PIDFD_INFO_EXIT)); + + EXPECT_EQ(close(pidfd_leader), 0); + EXPECT_EQ(close(pidfd_thread), 0); +} + TEST_HARNESS_MAIN