From patchwork Fri Feb 28 12:44:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 13996357 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 A3F9B26B2B1 for ; Fri, 28 Feb 2025 12:44:22 +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=1740746662; cv=none; b=Q+sGOoHtgbCBvkD0o7fFWVJHvYocWQrC2xmddIQrGEitMLkWFct5dvBgDHH0HnIgX14UJ7Kh+0Brx0Zc8U2ZYA+xP0bgncraUyhlXf7BYtmJyp6l6ec92hM43AcJBW6HYNxX9XAHVkeXtf8eze8/35KsJtGZVK43ex/jKSyt2y8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740746662; c=relaxed/simple; bh=ZjULMH8o08Q3tgpr2GVXRlFaT9JjnSTHHYx1rcX56Cg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fegAusJeoojyBa1yg5FSooQCXNWoiGtvc6rCJZOHhF4Kki4GEzkzOVcO99xO3nALyl0ioPJP2KK13LpNCMa4V/PjTrQschcQmSjGiP1XuVudD1r6yiKGuUqZxd1c5iSMQ9TqLwV9zRjhossZfzVlgvK5R5ubNAHRDdUAU8GlH1A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Dix9v1YN; 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="Dix9v1YN" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 11A2BC4CEE9; Fri, 28 Feb 2025 12:44:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740746662; bh=ZjULMH8o08Q3tgpr2GVXRlFaT9JjnSTHHYx1rcX56Cg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Dix9v1YN2gtfpd7d1YpedMBksV+zLJatDnvA1rPhXkTRRAkBTtQlPkz38a7WSyrfr USbJDPFEOJ8EtTwqfCXEg1LVUR9kVXDrGxaG/Kh9kaNhxXZdxGTxXIMf058/nN/Ye2 CEDjkyNaefifcWhLp6gn/kG27mL4mrd861XfVgmNSLqYaBOjd73HlbJTSBnoq2GE/o fGo/oN3fdZiG4azCi8CF+ekGi9YGBItpBcJMLlvX9eXkv6wwhWki/MCBqfpYvVe6oy gZAiYfihtg1x1La5clrsrhCrVZRQ5GKyC8nZsWWMaCgm3En4xsj8JlZtijBYmQbQTw jfo3zpaH+bu3w== From: Christian Brauner Date: Fri, 28 Feb 2025 13:44:01 +0100 Subject: [PATCH RFC 01/10] 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: <20250228-work-pidfs-kill_on_last_close-v1-1-5bd7e6bb428e@kernel.org> References: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@kernel.org> In-Reply-To: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@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=808; i=brauner@kernel.org; h=from:subject:message-id; bh=ZjULMH8o08Q3tgpr2GVXRlFaT9JjnSTHHYx1rcX56Cg=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfXL8og+VhWIPRwtXnH95fnavC8NqouVHF5X1KTJYuw /Lyn8vFO0pZGMS4GGTFFFkc2k3C5ZbzVGw2ytSAmcPKBDKEgYtTACaSUMnI0HVCarbY41e3F2kJ TghoW6Bf5HPHtd33jglX4ILmJZxJBxn+R1h2e9zZ/upvhvHEz3zHajQ643a83/C9+dm/bl7L+QE 83AA= X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 We have a helper that deals with all the required logic. 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 Fri Feb 28 12:44:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 13996358 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 F331426B2B1 for ; Fri, 28 Feb 2025 12:44:24 +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=1740746665; cv=none; b=ld2/0ZhLlkDkE0Y28iFogoYag29q6sj0PanPW6ds7ypuyW1u1yvj5eJwmVkGs57geXoYRRlIpk7uK8+g47N5/DQLzzZquaEtc5bMbkJS5tjarZedYb2oW5qe6oeeMOFyotcRTpiThAMP4vOFlL43XicxrLXOJMGIOhi46IFEeSw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740746665; c=relaxed/simple; bh=xZdRWqml/Qk46PZe4c1qABRXAGdLWAu0Z0kdDnaX9os=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MEIsRXSAk6hi1LOPeouceL1IWjL+9lSI1lNcmc2WKo03owiB61qtlxcRYcxATXBHd+FEE+vRS2xK6w5N/I2kICrAOnhafeQFStTvK/HcNdPU5qnwlhby63hAm+8srFYr9qwCvwcrn/Pgb5NkJPgv/XbvT/QiKRzfM11lxYSlKpI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=d5xh+Riv; 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="d5xh+Riv" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F233FC4CEE4; Fri, 28 Feb 2025 12:44:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740746664; bh=xZdRWqml/Qk46PZe4c1qABRXAGdLWAu0Z0kdDnaX9os=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=d5xh+RivOsP6bmwuHLL+O5WRpgdBscvg5WXQiMQ4pfCiABlAvJovt8GwKvwvIqV98 SB+5dbBLHgVyvue4obIJJaGwLqQ7tLRJLqkM5+ZxdlsiNV8f4KlNNFzRir9Z/rqQPg /2Af1v3zlNrl/ov+os0zvoUBDKuQfBMiQLU1/K4HzleVXJdcSS1JsgqFOqot8MMb0M nbkEhCnqwwcI5hdVgnWfEnPdOfHo9fcqioz8l0ItfgyuHVMtanje2kxKeq406ZIoVH uiEQZdQzLZIOG66wBodSnAJ4rXYhrQJ3wSTNiguICl19No7NlOBvxvL/AzsyMumrM4 p6y4hAbyhAMpA== From: Christian Brauner Date: Fri, 28 Feb 2025 13:44:02 +0100 Subject: [PATCH RFC 02/10] 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: <20250228-work-pidfs-kill_on_last_close-v1-2-5bd7e6bb428e@kernel.org> References: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@kernel.org> In-Reply-To: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@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=1142; i=brauner@kernel.org; h=from:subject:message-id; bh=xZdRWqml/Qk46PZe4c1qABRXAGdLWAu0Z0kdDnaX9os=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfXL+oQSQpb51VilS+WY7/D8XP90yXNTNr1B5YE8m5d YHa2WzdjlIWBjEuBlkxRRaHdpNwueU8FZuNMjVg5rAygQxh4OIUgInE1zIybLhQPbeIJ2C/k8Ir gRze7nY3iWufpvQEvNx+wtQmODrgPsP/Yh555bVuDK/uejIe9c7XslwSpHXVv/sVr4jhofbqI48 YAQ== X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Rely on scope-based cleanup for the allocated file descriptor. 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 Fri Feb 28 12:44:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 13996359 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 947FA26BD90 for ; Fri, 28 Feb 2025 12:44:26 +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=1740746666; cv=none; b=FYhf6Q5XbwlNmW4vWoFXOipmkRLtfPmZQ92YzgopE5xxG4tdTVem3puRQoKe/n36rvSUXUoeGDTZSZqagQob8NcBeM6Kk4rFEUjD7ny+6upbwyGpzMkbHRArvhtyAnLgsiYF7UKvroHEvBxR0KspO/4QM95TJ+XqEtlpJQT6W3o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740746666; c=relaxed/simple; bh=7KUqPOYmOng7iui1b72coPgfSzMK+HLiiXRRUX6TTUA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O6BD0RXFKErkwjHX836ELeaE5QvI7xXkqg8kgebgbKgDrqg+HhrbrWdGrXWd5zvH4+Qo99BlcjM+k2wlN2XaLP/Ti7qmRO/JyF+CVAsCwX/BsdTWPRlSof0ExZ6IllZEm7Mh2xIMsnKRW2lA13H000P7nxqBQ2BzNtK3rMueSGs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tLJxcLja; 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="tLJxcLja" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E0801C4CED6; Fri, 28 Feb 2025 12:44:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740746666; bh=7KUqPOYmOng7iui1b72coPgfSzMK+HLiiXRRUX6TTUA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=tLJxcLjayCEtOZ43mmd0n93aQ5Mz+vh58nFf9KjQ5eVFP9BguuAMZbtu27sirXdo1 eZFILNOF79AvGP9DF2oCQ/pjIEnpUIoDt0fgp4lfNDDXK2YzEooSbrWmna12ra9LrN +wya69sif2It4Jjy2lcGk795T+LX///Tj140EAKQQ8hLPkSbWLFwAXvVdXt5tpIj6I JPaocS5Z+BJggfs9GnN7jQW90RU03p2t7dgdHsn8So+363CyIfRGcVtK3X1RQVbVV2 oPDGbuPB3/1SFSBmykOPQdAHNp2BY+4yVf3c78hD5qtYqH+7fNkiSWvKepu1B84vZ7 rK0ZGRXC8yKNw== From: Christian Brauner Date: Fri, 28 Feb 2025 13:44:03 +0100 Subject: [PATCH RFC 03/10] 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: <20250228-work-pidfs-kill_on_last_close-v1-3-5bd7e6bb428e@kernel.org> References: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@kernel.org> In-Reply-To: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@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=1328; i=brauner@kernel.org; h=from:subject:message-id; bh=7KUqPOYmOng7iui1b72coPgfSzMK+HLiiXRRUX6TTUA=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfXL/o3e9wvqUGgnWdobJZdw+/utV9NnvPJIWncZ8F4 hnaP2vd6yhlYRDjYpAVU2RxaDcJl1vOU7HZKFMDZg4rE8gQBi5OAZiI+VlGhrVtrVIHJVc9Pnx8 r+LWB1GNC11lVMLehc2+YPD/nWz1H3FGhkvZ61LzKvy51abEqk04nzHx+IMHP5Zv+PhU+Zj4E/+ 7jXwA 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. 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..61be98f7ad0b 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 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 Fri Feb 28 12:44:04 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 13996360 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 BD26E26D5A2 for ; Fri, 28 Feb 2025 12:44: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=1740746668; cv=none; b=job4vT5e6cIfyUIezoFVQNYKVyKlVWzhCkZU8PRwxWRkmTUWcNJ5dkqJ8ABS0mOTBI7Y8o2cD1UqewAjKfMyawkjaZe5kEY2JBDr4vkJPEVktVmhyj0IqtChHWKxMQ83H9K/iR+TmTRl/V5BDc+EVE0wQNhy7t0ZTTzUev2qOBc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740746668; c=relaxed/simple; bh=wVAvcrXUGKpuAyKdozZYrLB3mLVYGXlkalKOpFWdUjc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QGtNeLAI778rppIwJkoHVggHwBmLTlqrkOldovG13zWf4JNdbvaQ1ap/tTCipm4u/1BjvVKCA7VT/DM+FLGBJL3l4TBLyPzVwoU47d+yottE0UOvMFVPJFkEx3ci3ll1TZLArVqM+MmZQ5L3EmWAiFBnkFqnD3hNmoWUn2V3uLA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kNigxmhC; 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="kNigxmhC" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 015E3C4CEE9; Fri, 28 Feb 2025 12:44:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740746668; bh=wVAvcrXUGKpuAyKdozZYrLB3mLVYGXlkalKOpFWdUjc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=kNigxmhCmg1Fq2iQbh0zFJEWvY6QTKfedHGCf/OkhFK3cu5/9uAFjmuJR25Ih3oqG 3mg7etJ7AcA/LHn9amnO4PjxVJRepgMedi47dkoCxhTWOmsdq/s/8tzlijzc7KBM35 /NzMWWO7NXl86nr5mGVOu9aXIFwbb4QOir6RNqcKyqhDYvfkINlqDPESql9F9ezU2S NRQlz72VEDKfUhYPsHbQIHWhbdSRHSF0SE2zxHNlKDJ4u+OEh9dMLfsGSwTydVt5cR Jfy/7r61uLpB824hrzmFTR8vWQOyDzxJVzGYrR9tNv+0hDzBwxB2dAC0JUtq85Nx08 GovToqGqQkuOQ== From: Christian Brauner Date: Fri, 28 Feb 2025 13:44:04 +0100 Subject: [PATCH RFC 04/10] pidfs: add inode allocation Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250228-work-pidfs-kill_on_last_close-v1-4-5bd7e6bb428e@kernel.org> References: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@kernel.org> In-Reply-To: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@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=2257; i=brauner@kernel.org; h=from:subject:message-id; bh=wVAvcrXUGKpuAyKdozZYrLB3mLVYGXlkalKOpFWdUjc=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfXL/o6ZZ0o+UVe+eltTz8/6V4ldKWEmmdb9Z174528 MTcZGGO6ihlYRDjYpAVU2RxaDcJl1vOU7HZKFMDZg4rE8gQBi5OAZjIaQWG/8V8346xMM31qPB/ /dzW6O/S+JvnOl2bCjrX6yw0VXosXM/wV6g3oVX5Y2ei1Mzg5G0HN17kuiagxqHVfivEZOWEU7X OXAA= X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 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 61be98f7ad0b..64428697996f 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; + __u64 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 Fri Feb 28 12:44:05 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 13996361 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 2092026E14F for ; Fri, 28 Feb 2025 12:44: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=1740746671; cv=none; b=p+8QpvNLXTRAIA4XiM+i17fTel1qh9T334nTfgnl5QHgoD4Xr8pxqantP4KhBe66G4TwSkFUHAUt6UQhl2xRkRI7DaZCOtzT4BODtZ8Tao6R+3m/OeilM5GQ2KdLTtZ+OAIcg7tKlyRRTMxzcHyQNk706+Q/mEF46aU4F2T8ehc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740746671; c=relaxed/simple; bh=UO80nWRJ1sBDNhKE3ZSEwFMcq8tF25zOfV4tpADWWjs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Eov/mndV0Ebt83D2LrMNWXUFZwiVMB1zK77HWo46v9jY7qM3+t5FueMTAHzcxq8kRgLvPZ833WHOyBpIt9HaUDmt7mDr4HRuGwcL0fNLxBIxqmIbCm39o7h4uJqsAYqyv8AWxkms7EegXADPOQPu8abnjWY0odrt2tONgUBRuL0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QIXv3Sf+; 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="QIXv3Sf+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 13F64C4CED6; Fri, 28 Feb 2025 12:44:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740746670; bh=UO80nWRJ1sBDNhKE3ZSEwFMcq8tF25zOfV4tpADWWjs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=QIXv3Sf+8zZPzcUGZD1cABrbGS0vgKaXBq9liQUuR+mnERMbuR/QPt/6ZcApCIPAQ 1FcQVKijcEtIw0VF+bSY56qG2QowxC5gHm0SSTKYSOr8qhIhob6KjU0wdHYAO0a+sU xsq/BM+rgh/X7hZcm5YeTtzk5vrDsHKGwVJD8aB24vOd6uQW31aS39EIbHjaBMrNmR cxiouq3U4AiSIGUQD0ButvamQzFwcdxX4uaaBiG8ecSbsja5mSjw7mUbPtMyWhd9yv KnZwAepVEO7U2gKFbvUqHd6vK328PBvMqq0OVUjuppOZV37+Yb7H2iuSWGqB/ia1fO 35Ku+QDaIpcug== From: Christian Brauner Date: Fri, 28 Feb 2025 13:44:05 +0100 Subject: [PATCH RFC 05/10] 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: <20250228-work-pidfs-kill_on_last_close-v1-5-5bd7e6bb428e@kernel.org> References: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@kernel.org> In-Reply-To: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@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=4689; i=brauner@kernel.org; h=from:subject:message-id; bh=UO80nWRJ1sBDNhKE3ZSEwFMcq8tF25zOfV4tpADWWjs=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfXL/osNa9HMnZj0xTH74+oeFc8LRI9MopsYCmXycXf 7wv5H85o6OUhUGMi0FWTJHFod0kXG45T8Vmo0wNmDmsTCBDGLg4BWAiU00ZGfZ8TXw97d0Bzkn3 DztahJVei/uf6TGVufTFXnvrkHVeVzMZGZY9X/vW4H72ptarDotP3whhvcq+oYlpeZTsCWOVlXP ff+YFAA== X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Record the exit code and cgroupid in do_exit() and stash in struct pidfs_exit_info so it can be retrieved even after the task has been reaped. Signed-off-by: Christian Brauner --- fs/internal.h | 1 + fs/libfs.c | 4 ++-- fs/pidfs.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ include/linux/pidfs.h | 1 + kernel/exit.c | 2 ++ 5 files changed, 53 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 64428697996f..433f676c066c 100644 --- a/fs/pidfs.c +++ b/fs/pidfs.c @@ -458,6 +458,53 @@ struct pid *pidfd_pid(const struct file *file) return file_inode(file)->i_private; } +/* + * We're called from do_exit(). 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 do_exit(). + * + * If this struct pid is refered 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; + + dentry = stashed_dentry_get(&task_pid(tsk)->stashed); + if (dentry) { + struct inode *inode; + struct pidfs_exit_info *exit_info; +#ifdef CONFIG_CGROUPS + struct cgroup *cgrp; +#endif + inode = d_inode(dentry); + exit_info = &pidfs_i(inode)->exit_info; + + /* TODO: Annoy Oleg to tell me how to do this correctly. */ + if (tsk->signal->flags & SIGNAL_GROUP_EXIT) + exit_info->exit_code = tsk->signal->group_exit_code; + else + exit_info->exit_code = tsk->exit_code; + +#ifdef CONFIG_CGROUPS + rcu_read_lock(); + cgrp = task_dfl_cgroup(tsk); + exit_info->cgroupid = cgroup_id(cgrp); + rcu_read_unlock(); +#endif + + 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..cae475e7858c 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -69,6 +69,7 @@ #include #include #include +#include #include @@ -948,6 +949,7 @@ void __noreturn do_exit(long code) sched_autogroup_exit_task(tsk); cgroup_exit(tsk); + pidfs_exit(tsk); /* * FIXME: do that only when needed, using sched_exit tracepoint From patchwork Fri Feb 28 12:44:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 13996362 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 0690626B966 for ; Fri, 28 Feb 2025 12:44:32 +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=1740746673; cv=none; b=hOa+yPg4Wr4KhSy3ahXffRLjYwTKpvjwyXVGuryT3YTBZo2WMZqBckNam0tvI7kuGbbKcE7IdHLHmwS4eNYyfIYAPp37Xu/HcQ8msMRTZebCbVAcvYiHiP4Yoyr7Y5XXNyh1PvvHo+2KWxJZu/vJ7djLg2Phrp4Qu0wVdM9EOzE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740746673; c=relaxed/simple; bh=zSf5I/rkkApHBPJh7QzGwiMekGpq1+7N8GRWK2zaElA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pKgILcjgKR1n/QgqvFu57o5VG/MHw9ntHNviF93vIfsOsK5w3hqHXvFPADPjlcXLmp012OdhokSC/s0z24ZDyZGwtXu7LDhZ1N+Pctoud0O1iyhy41dol0p1A9klOA8tN6DP9xqVVivUyPqGTXy9Hfl11N3hwC6ddzvti9VKcGc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NrAojW4p; 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="NrAojW4p" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 137DFC4CEE9; Fri, 28 Feb 2025 12:44:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740746672; bh=zSf5I/rkkApHBPJh7QzGwiMekGpq1+7N8GRWK2zaElA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=NrAojW4pKSRHVghGLXbjZjuVoDA5/fF6gFU8yB48UeXEi2I1xS5xjWh0WWx73TOPv 2PaI4HaumTIL47090Pss5S9SE3K5PlDix8YRgrK4NUxTZ1xJAkvCSda8or9/Er8KwT y+sJwV6FGUxS20wK18OvCr3clOF3K7xjONxMsXWPriXwx9yojsAtvYV/R7o7e0lwol 1S4lhUeWKW55i5A4rKyF5J7UwmVbOsngUxImxljDuVR7GnhyUkGS9ONis8suwYUTRt dzZn1GJJJg0PfNiIDQwGZMofp999qc3vRS+aUw9k0OimY/nwMhUDmMeRCxfExykj7r BBf0Dx9/qHvlQ== From: Christian Brauner Date: Fri, 28 Feb 2025 13:44:06 +0100 Subject: [PATCH RFC 06/10] 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: <20250228-work-pidfs-kill_on_last_close-v1-6-5bd7e6bb428e@kernel.org> References: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@kernel.org> In-Reply-To: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@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=6043; i=brauner@kernel.org; h=from:subject:message-id; bh=zSf5I/rkkApHBPJh7QzGwiMekGpq1+7N8GRWK2zaElA=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfXL/o+9TiHhWj9bySfCo8y9wFVlT/fXRoavn8RtdgW davT58f6ihlYRDjYpAVU2RxaDcJl1vOU7HZKFMDZg4rE8gQBi5OAZjI2ShGhhWF4t8WZSs/sHs3 s+Tz4WtXjgZ0WfBE9vZ9mP5u2v9yh1qG36xzd3Ou8/G7846nY+dTgYjvy79sepFyudDshMSGyBd F77kB 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. Signed-off-by: Christian Brauner --- fs/pidfs.c | 70 +++++++++++++++++++++++++++++++++++++--------- include/uapi/linux/pidfd.h | 3 +- 2 files changed, 59 insertions(+), 14 deletions(-) diff --git a/fs/pidfs.c b/fs/pidfs.c index 433f676c066c..e500bc4c5af2 100644 --- a/fs/pidfs.c +++ b/fs/pidfs.c @@ -32,11 +32,12 @@ static struct kmem_cache *pidfs_cachep __ro_after_init; */ struct pidfs_exit_info { __u64 cgroupid; - __u64 exit_code; + __s32 exit_code; }; 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,11 +229,14 @@ 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 long pidfd_info(struct file *file, struct task_struct *task, + unsigned int cmd, unsigned long arg) { struct pidfd_info __user *uinfo = (struct pidfd_info __user *)arg; size_t usize = _IOC_SIZE(cmd); struct pidfd_info kinfo = {}; + struct pidfs_exit_info *exit_info; + struct inode *inode = file_inode(file); struct user_namespace *user_ns; const struct cred *c; __u64 mask; @@ -248,6 +252,39 @@ static long pidfd_info(struct task_struct *task, unsigned int cmd, unsigned long if (copy_from_user(&mask, &uinfo->mask, sizeof(mask))) return -EFAULT; + exit_info = READ_ONCE(pidfs_i(inode)->exit_info); + if (exit_info) { + /* + * TODO: Oleg, I didn't see a reason for putting + * retrieval of the exit status of a task behind some + * form of permission check. Maybe there's some + * potential concerns with seeing the exit status of a + * SIGKILLed suid binary or something but even then I'm + * not sure that's a problem. + * + * If we want this we could put this behind some *uid + * check similar to what ptrace access does by recording + * parts of the creds we'd need for checking this. But + * only if we really need it. + */ + kinfo.exit_code = exit_info->exit_code; +#ifdef CONFIG_CGROUPS + kinfo.cgroupid = exit_info->cgroupid; + kinfo.mask |= PIDFD_INFO_EXIT | PIDFD_INFO_CGROUPID; +#endif + } + + /* + * If the task has already been reaped only exit information + * can be provided. It's entirely possible that the task has + * already been reaped but we managed to grab a reference to it + * before that. So a full set of information about @task doesn't + * mean it hasn't been waited upon. Similarly, a full set of + * information doesn't mean that the task hasn't already exited. + */ + if (!task) + goto copy_out; + c = get_task_cred(task); if (!c) return -ESRCH; @@ -267,11 +304,13 @@ 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) { + rcu_read_lock(); + cgrp = task_dfl_cgroup(task); + kinfo.cgroupid = cgroup_id(cgrp); + kinfo.mask |= PIDFD_INFO_CGROUPID; + rcu_read_unlock(); + } #endif /* @@ -291,6 +330,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 @@ -341,12 +381,13 @@ static long pidfd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) } 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, task, cmd, arg); + + if (!task) + return -ESRCH; if (arg) return -EINVAL; @@ -486,7 +527,7 @@ void pidfs_exit(struct task_struct *tsk) struct cgroup *cgrp; #endif inode = d_inode(dentry); - exit_info = &pidfs_i(inode)->exit_info; + exit_info = &pidfs_i(inode)->__pei; /* TODO: Annoy Oleg to tell me how to do this correctly. */ if (tsk->signal->flags & SIGNAL_GROUP_EXIT) @@ -501,6 +542,8 @@ void pidfs_exit(struct task_struct *tsk) rcu_read_unlock(); #endif + /* Ensure that PIDFD_GET_INFO sees either all or nothing. */ + smp_store_release(&pidfs_i(inode)->exit_info, &pidfs_i(inode)->__pei); dput(dentry); } } @@ -568,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..e5966f1a7743 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) /* Always returned if available, even if not 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 Fri Feb 28 12:44:07 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 13996363 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 0AD3E26B2A9 for ; Fri, 28 Feb 2025 12:44:34 +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=1740746675; cv=none; b=B2ppMXeZnbWeuYHN+di/xNCsjU0SgrNWixdFuTUl9H1XMrNky4QaGoFe3U1mmqK8YqHW2up4fQYo+yGJvxYU+SAlxQqZ0ouoVYwjFuNdaDA9gPIMuxGS8dfeNLsn3HQs+Mm5zvw/r1nx/EADI06glEN1BxZgCdFcjJNoYvIe6PE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740746675; c=relaxed/simple; bh=EwGgtj+ZxbdaCKJagQ3OOvYL6faT/y2Jn1BsqvSUDmE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r1zaArGy+WD1TNUAvkg4M1uIv8rVrIc2UbfuT6ZdEaESonpayHBCcK8g2wQxb4V/xHlySUxXwvzsVoQp+7N8Ox1Y6D5I7lfHuQkBYbinTLDmcNE4nk7uEgO0xuzlP+S5Xt+nqPTLkenAIb9MquwSc85LaUAK3jkYgW1VSyA4vuE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HvOTZ+sa; 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="HvOTZ+sa" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 02D87C4CED6; Fri, 28 Feb 2025 12:44:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740746674; bh=EwGgtj+ZxbdaCKJagQ3OOvYL6faT/y2Jn1BsqvSUDmE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=HvOTZ+sa3DecZxR3IusUnrEwwhvrijf2IqqPnI1y1HEaziLv6Z7C6o8k2kZRXBf5+ zuNAu/ysFONJm1A7dY4PWoHYzUxiwNrTvXQKFpVqUT91U3wFdAzSbjYFJuXxttoaCq gvZDdpB2TY6mugmMDTehBYkR6P+Qzt85DnZmTI/D7gLEhUcs9gAslAS36xfFl+GMPz TaW9t/0MXbZZCokfPFSNUWrsYYVJWYe3uj8m7wUwBVu/S0oLjjPHZdNW9v05NZyaTQ Grx3RLGNOzd+N6tcmKIwgTN0MuRBKQe53u6+NkjlA+BzIlf6pmy3kyOgB25qkdv0K5 nPrnK3MvQFCEw== From: Christian Brauner Date: Fri, 28 Feb 2025 13:44:07 +0100 Subject: [PATCH RFC 07/10] 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: <20250228-work-pidfs-kill_on_last_close-v1-7-5bd7e6bb428e@kernel.org> References: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@kernel.org> In-Reply-To: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@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=652; i=brauner@kernel.org; h=from:subject:message-id; bh=EwGgtj+ZxbdaCKJagQ3OOvYL6faT/y2Jn1BsqvSUDmE=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfXL/osNEFNsOiVktdvu9f7G0O3WiuOXc8ne/L4ccBk eKXA3WqO0pZGMS4GGTFFFkc2k3C5ZbzVGw2ytSAmcPKBDKEgYtTACbi9IXhn9KUlPrQRzlc55wN LtwWyLuV9lDoQEyw6OnZB8+KbIuJvc3IcPqFKq9KI+/DI313tp3gklzKeZD7+GTeiMcvOhr/cqt vZwcA X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Ensure that necessary defines are present. 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 Fri Feb 28 12:44:08 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 13996364 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 DFF5E26B2C8 for ; Fri, 28 Feb 2025 12:44:36 +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=1740746677; cv=none; b=U+M3gVX6wV75zJhVNHcfaQdM/Z9yYridWgxEQX5deOyCsFv2O6VIVTIa1SnX+G1FLJONsLNEd372+Caat0f9XHwOn/uGCIsz3orXqThradYlt0dZ6QBdv+r1PG7KXVDgK6IApQzxS4TqK0MP/Y5SjUFT2Rjsy4Jvg9RNWMkuTek= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740746677; c=relaxed/simple; bh=/DPEsZvaOBJV0BlsE7mEEfJBsCIwh9zyCd6k4r1+RVU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q9Y7Dwr86ucJ1Wa3rZmHQUObAtffFpM4gcscE/5oaP9ZjIKRbHYdJskfkZtrof/tLE1oYn2OxfD0Nsiw5aUu+hU1rqyzqVX5szkbnxVOQfykTuaDiUQnYUYPtxxHnbhNryNhs9Yb2eVpLCAHQ/6ai3aQjvxoEVWUddE1ZFvZ0dM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=S5OEh3K/; 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="S5OEh3K/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E58E6C4CEE5; Fri, 28 Feb 2025 12:44:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740746676; bh=/DPEsZvaOBJV0BlsE7mEEfJBsCIwh9zyCd6k4r1+RVU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=S5OEh3K/SHp+/HSH01NclT6vSknGnRQYu0x3gcehi2G3PjE942RZDMQqutONZgK3A 0upbcFCIOjSImsAHnwcP8lXVc10aN8T270nH5T/Rt83JNgy83fkrxW4YqkwAOpPfpk c3vw7BeMVyjfjj5hTXGQN2nYeaNXZ+jik8LG1d5TgNZAUfz4Bc5Jv8ZxxyaqLPFEJw 6j14Aae5aNy3QtpDrLpSx4+iK3GUspI0OBaapu3O5sHjE5hSkdoZ3xeLKgn1BFG+qt nmy3B41JdPuRUf2Q9dv+slrhjPfxG07eTLS/AMFTeomkR4fECjda7nCSuHv9UL3IvJ 9cLZlmyXpyB7A== From: Christian Brauner Date: Fri, 28 Feb 2025 13:44:08 +0100 Subject: [PATCH RFC 08/10] 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: <20250228-work-pidfs-kill_on_last_close-v1-8-5bd7e6bb428e@kernel.org> References: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@kernel.org> In-Reply-To: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@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=653; i=brauner@kernel.org; h=from:subject:message-id; bh=/DPEsZvaOBJV0BlsE7mEEfJBsCIwh9zyCd6k4r1+RVU=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfXL/oeMiFnQzmWuwXNpumT3MJ3jCbV0f19dEUk3XLT 9ldvS8n2lHKwiDGxSArpsji0G4SLrecp2KzUaYGzBxWJpAhDFycAjCRXnlGhob1EasWCcRmcXU8 +PWsv5n1EYeOyqxHlz/+8v3lW27AJ8LI8KgyOZn93KICue6fles4nq1bavfI/Fz5Kh7xDfeX7+Z YzgwA X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 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 Fri Feb 28 12:44:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 13996365 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 CF84326B2C8 for ; Fri, 28 Feb 2025 12:44:38 +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=1740746678; cv=none; b=c7310qRI3ittrZ1fk7JrJxBM0WstZLsH4uulzA7PiKJbMCizrR6BXqAzi+b8iodldEB8yBknVJzwQA1KS/jDSXgWTedR6YvO82pQVAignxRn9o5ynF7E9SzD9YzHSHlA50bL/yIln5eb3XjAYFhz9lFY4MFaApIsi4kQ3qRr5uI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740746678; c=relaxed/simple; bh=kI9PHcpZLd1x1Zp1Ulfs9kJOBzg2BGQ5YC6LK+/p+6g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qeqrNETztInJiYzbco27QyX1xYotTHLORMjDyLyNsfEKs4h6gwY6z0tnzkcAIMy8D+mPTNNgjsYfP9LDRoeo3sWG/uvLGv96wgIlg5bWrc0GnbMaHZGgRQV/Y7+qz/SUCCz1aTE60XEnjsQjVVxN7RsJyVQ7NzA8eO6CUAJEaRY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZSfvZT0r; 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="ZSfvZT0r" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D0B50C4CED6; Fri, 28 Feb 2025 12:44:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740746678; bh=kI9PHcpZLd1x1Zp1Ulfs9kJOBzg2BGQ5YC6LK+/p+6g=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ZSfvZT0rfLGh/TTs+O5euIAPnwOgMv8REhZjsEdX0+O7ojBEwCvsU+LkGphAd9PGJ MRc7wVQC3cEan+v+Sxjreu99rwdhYSU+B3ASe+BWbHKzDMumCZ1zqZgWC7rAwZg0sy 2LFvtWDwJWOx5ba4NRMdpYkG82YRk7uFLxl6nK3FdqN361TL9bIB2nqJZjUW9QgiTK hdiBKKocrxyoVGieNFO5qVIgs7lkGr2uS0qWbBSQZS7bK4J6GCVhwqLFLi7sBFXLXz nylYZJZSr6uSXi+UGiZ3vsdwEiW8uQNclCuc5/H1IV2MHY8Z2o3mplTs2eHsbukI3E 4CmzOUArUzYjA== From: Christian Brauner Date: Fri, 28 Feb 2025 13:44:09 +0100 Subject: [PATCH RFC 09/10] selftests/pidfd: move more defines to common header Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250228-work-pidfs-kill_on_last_close-v1-9-5bd7e6bb428e@kernel.org> References: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@kernel.org> In-Reply-To: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@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=5710; i=brauner@kernel.org; h=from:subject:message-id; bh=kI9PHcpZLd1x1Zp1Ulfs9kJOBzg2BGQ5YC6LK+/p+6g=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfXL/oLiMH8/d/3nE7y37//RZol9hncfPk9kUfnT6z9 z54dqCOraOUhUGMi0FWTJHFod0kXG45T8Vmo0wNmDmsTCBDGLg4BWAiFf2MDA9YnhbvKqtepdqY vTPVUCzdPFFrhlVU999zi4UZb+kyRDMy7FstsIox5/iFJ7010ZPXzetZIvpw/dKXft8XV8dfXFi 5kgMA X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 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 Fri Feb 28 12:44:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 13996366 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 70E4026B2A9 for ; Fri, 28 Feb 2025 12:44:40 +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=1740746680; cv=none; b=LEdNg3N848PHgoX6BQTV1rnkCFJduZgMDmTBoSr38PEhvmJozOclwkjS2PWhtoOgvDMLhcjATXQSupR5Cl5d8Oq4M+QapcpMZdkek3iFccJP+gMTyyiVo3DgyTXjN6Kk/PP30K5GIoXhVmz/7AMXuP3uLfgbsHurjH3h7qq8SoU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740746680; c=relaxed/simple; bh=f7P6OUeEAvDGFqnznapWB8YeHZzAf5r70IdxbCqXrBo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bcO4Nt5heC10ZzXG0JlpjgyqheOz/lRD8iowU8MOI4uu/eqDt6gZCGV82hVOSN9yyaEwanEs0V33mDoKjU52nK0TjSHlhHgLGKWZPolb6DHGr32k4phuWBS2IkLMNvG4rEJACzQl0y9Q1p6mmSk0qf+iEfGE4rvZoIRN4Ju5gVY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KVvp0dI4; 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="KVvp0dI4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C8C09C4CEE7; Fri, 28 Feb 2025 12:44:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740746680; bh=f7P6OUeEAvDGFqnznapWB8YeHZzAf5r70IdxbCqXrBo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=KVvp0dI4WPdYE8a8DffyNTrj7VLdG8YCVvRHIp9eXIR6uChajSxIJSKijtTNwZPB+ ouAjaHED0GxapVR6fq/C8K35l4Ht5eUNuhX5dwSwZebss2q2gnheA5vW82LA1qgfa4 17omRELwvvaxE1jqP/wsHdXImj2yYlJJY/fTg6LDp9JfW95JLFL38LD6E3Y15y/UxM mqdN8JfSGa0WktqmAF5gwD5KcMJnW4pPCB3XJPJPKGcerTRmLMMbcEEgGs5/aoPKtk 9LL3UabxNzifaxtfpeuoaj2W23j1Aa+RVkroyDx7JUb1pVnhIq504lLjDRyN6H5CL3 AgGFr4mm0VYzg== From: Christian Brauner Date: Fri, 28 Feb 2025 13:44:10 +0100 Subject: [PATCH RFC 10/10] selftests/pidfd: add PIDFD_INFO_EXIT tests Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250228-work-pidfs-kill_on_last_close-v1-10-5bd7e6bb428e@kernel.org> References: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@kernel.org> In-Reply-To: <20250228-work-pidfs-kill_on_last_close-v1-0-5bd7e6bb428e@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=7121; i=brauner@kernel.org; h=from:subject:message-id; bh=f7P6OUeEAvDGFqnznapWB8YeHZzAf5r70IdxbCqXrBo=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfXL/IXHpu8PHFylMerKvdvGbyvi0VLWsndRvP2Fl33 lGgt5YhqaOUhUGMi0FWTJHFod0kXG45T8Vmo0wNmDmsTCBDGLg4BWAiKgKMDP0mXO3t+Zo89872 VdxOcWFOu6zlZ8/h9ojDtrD3bdJ6QUaGJ7M5w3z9XjHP2+bC/HVy0dkz3Nz7/xvEKN/Mjv3ofZy fBwA= X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Test that PIDFD_INFO_EXIT works correctly. 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 | 185 ++++++++++++++++++++++++ 4 files changed, 192 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..e2368ba271fb --- /dev/null +++ b/tools/testing/selftests/pidfd/pidfd_info_test.c @@ -0,0 +1,185 @@ +// 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 "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, + .mask = PIDFD_INFO_EXIT, + }; + + ASSERT_EQ(ioctl(self->child_pidfd1, PIDFD_GET_INFO, &info), 0); + ASSERT_TRUE(!!(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_F(pidfd_info, sigkill_reaped) +{ + struct pidfd_info info = { + .mask = PIDFD_INFO_CGROUPID, + .mask = 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_F(pidfd_info, success_exit) +{ + struct pidfd_info info = { + .mask = PIDFD_INFO_CGROUPID, + .mask = PIDFD_INFO_EXIT, + }; + + ASSERT_EQ(ioctl(self->child_pidfd3, PIDFD_GET_INFO, &info), 0); + ASSERT_TRUE(!!(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_F(pidfd_info, success_reaped) +{ + struct pidfd_info info = { + .mask = PIDFD_INFO_CGROUPID, + .mask = 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