From patchwork Tue Mar 4 09:41: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: 14000327 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 030471FDA97 for ; Tue, 4 Mar 2025 09:41:19 +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=1741081281; cv=none; b=JOzPY9JtCoc14cBtzSXPiiKJ2Zfpfk9ckkhzZI1F7qLRdxKsfIwrzNag4Ss2fXKLi60EkqV8lvJmH5H1ZnT3FV07KU0rsvspIz5JCI5ZfhRDkx/n1f4G+uNusmCbML8XOhZeKAWEmbjhlaXHzgLpFVgZFnAgb3kJIPjfRbtJuSc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081281; c=relaxed/simple; bh=ZjULMH8o08Q3tgpr2GVXRlFaT9JjnSTHHYx1rcX56Cg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Y3CRU6OloJSnD7g92OuzkGt9fn5AYHr6s7FVsrYJARfUnS5pIQkfXiTfizf1m+rEjHBAhlQU53XwHBslslTH9/QbxyQDYoleFqVLrW0cgEyCDb3cp5+2+KTOB75zcpsSOd+1am99ALakITZbdVR4J8W/W/wVzpDXI2P7r9s53lQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YfGwYt5i; 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="YfGwYt5i" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DFF59C4CEED; Tue, 4 Mar 2025 09:41:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081279; bh=ZjULMH8o08Q3tgpr2GVXRlFaT9JjnSTHHYx1rcX56Cg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=YfGwYt5iQinBQDvXypOkdsVFizI+ksPqhOYBE6HI70iRe1SDd47P1EjD3r7MmRHf5 lPIklbU+zlMkn9q0ackgtkxIM7rdh/GuQpexvba/Q6Q5SLzZJfGuRaidUKw9RzdzmB dbGriGPKQjVIPqSHK1KF5AN8ecK4SweYnkatkFmPMbyj3LYwFrOr1tC0QuCXla1161 fEs8c6iG5Uc1yXKhnhiAzZgqKQSgxTUXMWUB1nY7i1ixhHZfu0RGqXQitsK+PfQO81 ZAkFX7Mba4e2dJpgh60v8n0Or4k4iZJbxOK3JGd4uI7OZDC74fojnbWWRwrUVPO51T qoRVT1TGPAigg== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:01 +0100 Subject: [PATCH v2 01/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-1-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7Vrl2VqQEyDVp2jfW7p+akP1lsqKIaaiSev3tUhL /YyTNyzo5SFQYyLQVZMkcWh3SRcbjlPxWajTA2YOaxMIEMYuDgFYCL/rzP80xUqOCM8YebJza/U l4nOzL0tNWXDpQ8Gr9Zybcw97Xp4oxEjwwbdBbYG677EOYYHX79+6d69uNr8lLPet3o/JxZUvuP +ywwA 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 Reviewed-by: Jeff Layton --- 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 Tue Mar 4 09:41: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: 14000328 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 875E91FDE2F for ; Tue, 4 Mar 2025 09:41:21 +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=1741081281; cv=none; b=TcEgKj+LmUwiIOyJbGERaVeCbC8/4OBxse1oSXh0e1HL4AJYusxi6ra8Jvyr7dkYXiuEL+7cwuWtPAR7Xx/h6hghg2i8Co26CjbEhfw09kW1OZ399DOrd0tM/HCMQm8YIMUqT10fUWs4oDqO5oB03KlgHfM8xV2odx+acmGELFY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081281; c=relaxed/simple; bh=xZdRWqml/Qk46PZe4c1qABRXAGdLWAu0Z0kdDnaX9os=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IluzzXfqbVfpG4Wg69EuOHipg049mnCNhmS9zi9hwgAVLhQhOK1GctMSn1BiJHjfaJ8xe9TBHF8n1AlBcBHbdeySUU5JyqxahHAOcqwmZbr+A+fZRUf6VieycpsT0IusiZMpjY3f/B4LA25M6J230+ofLpIajQOVGqsOcx5ENxk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VrIEAcWY; 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="VrIEAcWY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E6020C4CEE5; Tue, 4 Mar 2025 09:41:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081281; bh=xZdRWqml/Qk46PZe4c1qABRXAGdLWAu0Z0kdDnaX9os=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=VrIEAcWYOBWYlR16Dri/AA/vitIb15tBncCYFewPqJQ6+q2gazwve2byB/1/xsQXT Bu5mMHBZndfDQjOMptO5sZKou+DkA8IPmMJcQh/mqR00Mp941Vxt9rJN1vsM9YBT9n vRL6nfZbh3foA04+AYiADKt1PCOcimCX+gEIvtgL7JFYQVTQCDfMEKOTuwfScraYeS jKuAHqMWEEfrvtlAta/5Rssfyowvc26cLGKkl/J6X/bnBgyuC+RetUtwcMjryWR4gF JITPh4MHrjyd38gR3qGWh9EclOW1YI96KOUv5u19vNsrCCaBmvIqaIjsPeXedeB2lK utax5GL6gJY8A== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:02 +0100 Subject: [PATCH v2 02/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-2-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7Vr5Yk7jGwC5wWZRE5n1X+eMHvelcLvV3SXNs761 15/9MadvR2lLAxiXAyyYoosDu0m4XLLeSo2G2VqwMxhZQIZwsDFKQAT4Y5k+Cvgel3uksfRGOtl Dl+M9k2+cH3DTwH1lLuXdj1c6320+vQthn9mj9mV3QQilC8z2cnOrHfknCTl8mZrm76/nJFp8ga POZwA 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 Acked-by: Jeff Layton --- 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 Tue Mar 4 09:41: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: 14000329 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 CEF811FDE08 for ; Tue, 4 Mar 2025 09:41:23 +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=1741081283; cv=none; b=uExZHuNp2DOs04TtbsDilKLr8ZaiR0ccKr551TS0jfVCpDaAKNxIjsOEK0yticePpJ1vn4xU73ga6BW0/dkunSH2g1GywEkTYIToYvovjyepdBftS/gUAwNigu+uKY+1kQTkKgqowCpP9fE+QzevyuDU69ftMURVwWxdIkgXCbg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081283; c=relaxed/simple; bh=axP2pjvEX4Nb309FegHVqfpLcC7ZJq5Ljce5fNX+woU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O8EAwZNFMonLiSDzTKZGP3GkkIM61cqmlaYUhOigkcsr3HU9qjILkEYVWfT/6VWC7bQC0bDNUHRYhGjhACqA8gt1o2ZD3Ed5Gs1fNSXM1AKSHSLygO0Kh53fvSK+ULr/afmbNNRuJP7h7AZ+jPAdTmpeCsHVLXCt2K9X2P07HYA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OJp76jF2; 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="OJp76jF2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CDF51C4CEE8; Tue, 4 Mar 2025 09:41:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081283; bh=axP2pjvEX4Nb309FegHVqfpLcC7ZJq5Ljce5fNX+woU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=OJp76jF2/uduXDRjeKWLTT8vzyQWodGX+2TjOujJW7Sbpgpf6uHAt8K360NEXTCR/ j0U8PPi/9llPpC6DoO6K4Bk1gQSXMfyNipw8DlwoD33kmwVZWPC9090ZMdQKf5461C uWlcU5sromLVq0bF3k+rSjmGpzx5kWbZqj7yx7peQiVjrifqZnYq3MAYhqCRK3Q/6M tCZdr70RCQRFEctvuGQ/mgoM5ZzX8plUJUgbXUZ3njRRMbC/hdCNz13y/u2wkhFD0i C380D1pawhvbM7Knul6ohPV+V2Y1qtLihXo6vL5NVqXYk1Icj60KVgPkFxMlnhsxyG PQiGWHiAfPHCw== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:03 +0100 Subject: [PATCH v2 03/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-3-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=1331; i=brauner@kernel.org; h=from:subject:message-id; bh=axP2pjvEX4Nb309FegHVqfpLcC7ZJq5Ljce5fNX+woU=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7Vr7fMFrBIN0ycv/FtdqbS+5ItftezDO7+Zi/arr z5mvEfrX0cpC4MYF4OsmCKLQ7tJuNxynorNRpkaMHNYmUCGMHBxCsBETrMzMuz1a0z1cdtdysZt e+zXm66ZGyevPHXMhelNbsskuRyDPcIM/10duZ6sMJDK7z8wqfFe1vvHPFfaGxct5HYP4eDxnKY /kwMA 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 Reviewed-by: Jeff Layton --- 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 Tue Mar 4 09:41: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: 14000330 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 C0B201FE463 for ; Tue, 4 Mar 2025 09:41:25 +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=1741081285; cv=none; b=d7bCA1Rw8QsnC+C4+YihVD3uXjVMSdlhCLkv6Uyo5kTkYGzT58fp85X+0/CTWRnZ3P6uPLGEK+9eOjcrD7SZ3efn/6GTcZOxL21/4IC4TuYAuK8iUBJ/aVjgAOX77Ybx34NyxjXxPlikZjXvnuYMv/fu0Eo3Xq3U4NJyTqTetCw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081285; c=relaxed/simple; bh=5UJ5+NEk52qrd6NpAEn4HqD7lO+VX1y3AJVnvn5cRms=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gSSRjbpq8IWedcRmE+xT22Gy0oEBceZ8EEWcQMphxYubegz9qUOAb1ly7D5hoDypGy15ZP9f0gsmSf0G4dPrjqtRl8LhF/Bs0lby/VumBJ9sPOmUwtEfLfNY+6otoHJgCM/vIyFpTHG0guVNoldarUlNKlhVJmZ/moG2PISGzPQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Amd2FO/r; 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="Amd2FO/r" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BAC68C4CEE9; Tue, 4 Mar 2025 09:41:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081285; bh=5UJ5+NEk52qrd6NpAEn4HqD7lO+VX1y3AJVnvn5cRms=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Amd2FO/rPqYXYe/UksFl2uS52iDkatuJBVY5P0rAxy5/OVX96w+a05Cr2CIjblhfV ztlT1bQ9aVqsN9a4p+p5niUdzCl/vlOArHwWGzPhFPIKdYwoqouS+9jaoZEwGY/64Y Ttdfox4/xN+lkRM2XpdMWXmgGdtQpgCJ5tUOfwsb8sy1SwBmK/RUWS3YtTtYl4fM9x 9RYliOx0lxd39jK0Rg6lP5AHW9Pgrr4TALVCfiewnajBPkuq1VkxpBSdkcL4pVDI91 uJjy2XUFzls58woQqS5pymozLEHjGdaAHssHTlPCW1bgVRePo+TvJUuDca5PZbaI2X pinWyKhBXlXyA== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:04 +0100 Subject: [PATCH v2 04/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-4-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=5UJ5+NEk52qrd6NpAEn4HqD7lO+VX1y3AJVnvn5cRms=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7VLqFSrfFFy0lU2PdcL8pdUlKK2Xpv927SBqzbVc 8XkI8bbOkpZGMS4GGTFFFkc2k3C5ZbzVGw2ytSAmcPKBDKEgYtTACYSU8DIcOOh89zPVf33lsfp 7zisJ86uv6d7eclVFvU5nPaGUX4KmxgZTp65ZBFvMZ9bm0vYVuif4do3XNIXLh5I/v78YU25Yic /CwA= X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Signed-off-by: Christian Brauner Reviewed-by: Jeff Layton --- fs/pidfs.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/fs/pidfs.c b/fs/pidfs.c index ecc0dd886714..eaecb0a947f0 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 Tue Mar 4 09:41: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: 14000331 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 62AF61FE45B for ; Tue, 4 Mar 2025 09:41:27 +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=1741081287; cv=none; b=Jt4boip89d2RSJ5lKullynTpz2AL7hUinre8s3DaqUeFatIhbPiVFtUgu2jUrkBEk8q1O/p0jCVmuGFJVTynkVaPJnUdQbDnL8Q0iP/Mu38cvB3bKPDs5YmbuULB+OAEvNF741JVHZW9rRCLmifi/ELESwAiDCjzVuOuJhYcg9M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081287; c=relaxed/simple; bh=TYE4iFEVdG9VIp4MYrNzinTHKElGftXfRUJU/Zd8M/0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aEMf53N6uWJPkzdOFAEmiAAOy0Av3VvkWOGUr5O8K7aOkme6JAS7VWBlutxVP/obY37Iokf0Odz+TLG7Y6XzueWzkwmeoihdst01QG1FWm28fCUDpH+E26NR6qxREpc9CSM7Lvpo5h7t7D6rdrK+J3kbQ8oYCMPmf0SjgxgBfiM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=p3MhY94p; 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="p3MhY94p" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A5799C4CEE8; Tue, 4 Mar 2025 09:41:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081287; bh=TYE4iFEVdG9VIp4MYrNzinTHKElGftXfRUJU/Zd8M/0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=p3MhY94phBStHob9ceT0BaJWt/ASZaUHreA0HiB9/f4IXvk6QVaVJzCFLwRn4n8Jd JFKpnzeFuSxrRlX6rstL8boFTqL5AYOh/e/6RfYdzeaYal7Ol3NLH0JrMB7yi6f2k2 eQHAoFkL1I2IrVHOpMe+g1khISekrviPXsiJUWXTRRSXpkvzTVAwwJhI62xE+nG0Oe b02q+z1c0/rz/6FyAGcbLjgWeauGVafAysBoHNhhG6DPiUdlNRBvgspzO3PhkhMlj0 ZX072+NoTaE6r1EIl5AFVxzWlsPQ2xgPHwkdvKsN72BgbtkxsnEv5OAZs7JtGxavVK +ggMze9yNejIw== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:05 +0100 Subject: [PATCH v2 05/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-5-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=4655; i=brauner@kernel.org; h=from:subject:message-id; bh=TYE4iFEVdG9VIp4MYrNzinTHKElGftXfRUJU/Zd8M/0=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7XLpD1W5AZnrjmXUO4tM1erXeaXCrZXz5Ff0/iT6 cOuo7bHOkpZGMS4GGTFFFkc2k3C5ZbzVGw2ytSAmcPKBDKEgYtTACbSZMXw363C9/ujD/bbjau6 bdoWcehNrQldfurFqUUMD0yFpof/CmFkeF7x1jl8gsCeYqb+jzP3fA8907Rx+cff39qVa2SPrJg SwQEA 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 Reviewed-by: Jeff Layton --- fs/internal.h | 1 + fs/libfs.c | 4 ++-- fs/pidfs.c | 41 ++++++++++++++++++++++++++++++++++++++++- include/linux/pidfs.h | 1 + kernel/exit.c | 2 ++ 5 files changed, 46 insertions(+), 3 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 eaecb0a947f0..258e1c13ee56 100644 --- a/fs/pidfs.c +++ b/fs/pidfs.c @@ -32,7 +32,7 @@ static struct kmem_cache *pidfs_cachep __ro_after_init; */ struct pidfs_exit_info { __u64 cgroupid; - __u64 exit_code; + __s32 exit_code; }; struct pidfs_inode { @@ -458,6 +458,45 @@ 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 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 = 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..98d292120296 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -69,6 +69,7 @@ #include #include #include +#include #include @@ -254,6 +255,7 @@ void release_task(struct task_struct *p) write_lock_irq(&tasklist_lock); ptrace_release_task(p); thread_pid = get_pid(p->thread_pid); + pidfs_exit(p); __exit_signal(p); /* From patchwork Tue Mar 4 09:41: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: 14000332 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 E07621FE463 for ; Tue, 4 Mar 2025 09:41:29 +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=1741081290; cv=none; b=ptfXiTovR0j0vqXuqXBAfaHxx25VXFwvlCIP6gd7TW1o9+u1tABZO4GYCbzL48eZ59wo++gYN5FGi6SauyMq4VHPXv3CC3tcWEyBsOQWXP934sl5KZxc7aHLZRkgnQ3htgzsBl7F0LLZJprrslESB23n+v/th1SSGUpDy/jZLa8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081290; c=relaxed/simple; bh=XN9X/td8salsDDg7E0zBTJF3WWiZhQidQo1kRxEKXEs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uZa+eHa98qOsPRhZdg0lN5VYBq7dcY4JFKL1cmhIunjJZ5C2wnrR6uE1iA32vmmZ7lCugN/7adFSY4zrOJPvMYTkXwZnOEpbRKc/BhY2gBs1rwDx8zvD/SBPmuOrKj6uTIIWGPOcTei4eop7YMLPuUKXlw9OcpcY9yP/Tw7gzC0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tMvdX24R; 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="tMvdX24R" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B1627C4CEE5; Tue, 4 Mar 2025 09:41:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081289; bh=XN9X/td8salsDDg7E0zBTJF3WWiZhQidQo1kRxEKXEs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=tMvdX24RoFEVwckI156+nSj/0WSiF2gzpQz6X2Ot/RxxtBMzGelQUoK9A76IPbcvg nMTwCbGL3gyzaksWBUJu4YPYXbUmwpxkb4ODHoNgptW6RN9kGTTOSnPQMZRGf0xSTK mcFwq75yZ4EDrtfayab6rJtPjVy9lL8phLMpneg0j5QGzPfvUKOvbDW9rkoC2aURyJ SpWFnJvE6mrCern/FSgWhfJM40hxR/SQBBNot5G6IDpz0S7L8IZ6kbXF9u6Vk4JKgb H3H+l2L8BGxtRs2+du/knCugFaHoCT5+cEHQna/8U9Jn5JAk9IqFc3feQP9AHDTm8f 8Xm0qWq3hxy8Q== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:06 +0100 Subject: [PATCH v2 06/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-6-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=7026; i=brauner@kernel.org; h=from:subject:message-id; bh=XN9X/td8salsDDg7E0zBTJF3WWiZhQidQo1kRxEKXEs=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7Xry0r2SaGGu3Y06t84qXY4YiO72IXibhkhbTftD 3cXf8hu7yhlYRDjYpAVU2RxaDcJl1vOU7HZKFMDZg4rE8gQBi5OAZhI/mRGho05m6pKD69r29BS 8ZXxcd0U9+Urb1rUbGr4d6f3G5tSYxAjw7NefXOZBX8+T7bezyj/TZGfVfi6hIlU7Q+nN6l3dr9 +wwYA 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 Reviewed-by: Jeff Layton --- fs/pidfs.c | 88 ++++++++++++++++++++++++++++++++++++---------- include/uapi/linux/pidfd.h | 3 +- kernel/exit.c | 2 +- 3 files changed, 73 insertions(+), 20 deletions(-) diff --git a/fs/pidfs.c b/fs/pidfs.c index 258e1c13ee56..11744d7fe177 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 current_in_pidns(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 pid *pid = pidfd_pid(file); 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; + 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; + task = get_pid_task(pid, PIDTYPE_PID); + if (!task) { + if (!(mask & PIDFD_INFO_EXIT)) + return -ESRCH; + + if (!current_in_pidns(pid)) + return -ESRCH; + } + + if (mask & PIDFD_INFO_EXIT) { + exit_info = READ_ONCE(pidfs_i(inode)->exit_info); + if (exit_info) { +#ifdef CONFIG_CGROUPS + kinfo.cgroupid = exit_info->cgroupid; + kinfo.mask |= PIDFD_INFO_EXIT | PIDFD_INFO_CGROUPID; +#endif + kinfo.exit_code = exit_info->exit_code; + } + } + + /* + * 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 +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; @@ -479,10 +526,12 @@ 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; + struct pidfs_exit_info *exit_info = &pidfs_i(inode)->__pei; #ifdef CONFIG_CGROUPS struct cgroup *cgrp; @@ -493,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); } } @@ -560,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 diff --git a/kernel/exit.c b/kernel/exit.c index 98d292120296..9916305e34d3 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -250,12 +250,12 @@ 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); ptrace_release_task(p); thread_pid = get_pid(p->thread_pid); - pidfs_exit(p); __exit_signal(p); /* From patchwork Tue Mar 4 09:41: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: 14000333 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 C73031FAC56 for ; Tue, 4 Mar 2025 09:41:31 +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=1741081292; cv=none; b=aCFHc0nLyIWS7aDrl9ncBfK1sTl2oq57EzIXTtl4wivR1DfrKpB0PF79DnuQfswxpB5vpY808XW5NwWy5gsqVrCRvnA0GYGQ1+jFiRiYtIfG8wOSbdl0ep6/TOG3H2i620Fj8RoDZkHD0EU7Cuk4eVeaQ0PZOn2c/IPbr7xpfno= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081292; c=relaxed/simple; bh=EwGgtj+ZxbdaCKJagQ3OOvYL6faT/y2Jn1BsqvSUDmE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tXuYhAgiNHzlFsUn4Bz8VlWlKvUqmaJB+YUQ2KFAbNFQ4D/a95qzu+SBPhuQaYdg7Q5Fz2apWFZ2XRRwPxvj2zzCBFlz42PEyeVrtwlR7tNZFUmfr91RXHvFjxSejgCtryRDB94UqFCXjFzKjvYyW5TyoFHpDiddM3ws/235+Yw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oJIG2tUZ; 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="oJIG2tUZ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B8C67C4CEE8; Tue, 4 Mar 2025 09:41:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081291; bh=EwGgtj+ZxbdaCKJagQ3OOvYL6faT/y2Jn1BsqvSUDmE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=oJIG2tUZjXAAjZCwrgKTM7R+K5yQz/t7DtG2pPgF+eCqSM4ENfM9zpwGtVXh5gDD6 pxcGkOiwolgV+9J53fDdX/V34ZGi56apLWrvQAC0C7XifmNJuoCcreZh+iUVUl+l/l pxASoIv9eis5IKm+yixRqWq3gRGm+fEGfo5Eqtun7e27b5FNG4slWOJeKFpC+j+EXv YW7UyqOnDd08w4vKcdMeMu92+0yaTBSg24wbamkjZwf4orcG05XwBdeFsUKoapdzER Gw16uvLIymj6Rpqdj0qj622ReYfuGioqUJbUIglg/y1oemCrpMOUhs9ZeF82oFfBUI 3pM734jY76icQ== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:07 +0100 Subject: [PATCH v2 07/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-7-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7UrrLH82VXJoi1e3J+Drh85r63LnBPYbfrTpnLTi gent82o7ChlYRDjYpAVU2RxaDcJl1vOU7HZKFMDZg4rE8gQBi5OAZjIlWRGho8b42vnOEVdFz/3 j73ld/d3zZ386ybJuJb9m6rapyE4pYSR4Q7/0521m2r32O7rXThj9oF/q5KdFH/c/RurfTh9hv+ CSF4A 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 Tue Mar 4 09:41: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: 14000334 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 D166D1FECB0 for ; Tue, 4 Mar 2025 09:41: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=1741081293; cv=none; b=TXE+WLs0+0hQ9ySHSELnWzwNNnv/LbHy7YdsjcWOAV1lulL+lAafoUyS2msLW9FkdwH05I2CN5RZyUIR5jDKttqJGYC2vQJnSsl2IqdRzv0ylfMyFaxvNL1zauFdQ+OazBDZP7Bli1vJvMzirzOUL2h53hPPZrrS59udx+OIw9Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081293; c=relaxed/simple; bh=/DPEsZvaOBJV0BlsE7mEEfJBsCIwh9zyCd6k4r1+RVU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lc2ZrlLjxFJJ5tyNGUG7Cv7QYgWmlrEuVrJU909NZA9GDMSzDOMDOuVVPYvd5GzJmU471sYOvPrXyKOc79N7wD240vdY53Y0U0ftvXoUAWzG53RclDyZD4+2twrcqqcvOfbja3WDOSrAr32IFRHCbJRt+unfSGsTBNp5Q61O1Ec= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=L78yF2mU; 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="L78yF2mU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B763DC4CEEC; Tue, 4 Mar 2025 09:41:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081293; bh=/DPEsZvaOBJV0BlsE7mEEfJBsCIwh9zyCd6k4r1+RVU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=L78yF2mUMd9R12k6jQJ4pdwfU1DBTcSOvHqb43ONt8f8dqEUmoMs98tGQk76UWcza qYLnF2jMAPSaC13zfOjiT88D9NfaKTGJT22MHQChHTaZR6RO+LhqQpDGU2Rrwk4efu RCJGyEzMJ9R6TUwxM9CqUgOJus+9qmbnWblXv3dZh6NjAW4NhMGq/8wMkk96ayhHcl y3lvs86IIHP7BBoyBxA6zDcCJa0ni5hleolVX2fCTFFD03+iF/3LbiuvTVx/tUmavF yq2W4u8xSFNsr3kXsWMOG7aaXhzaVuiXKPkohILA/EbTs5dry67EY9a2A177sPt0vz JkJcVbpaOE1bQ== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:08 +0100 Subject: [PATCH v2 08/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-8-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7V7YuqaV7vf5ptv+8BzjOHspzP3Vz1pY9hQtCnpe 3gHXwdHYEcpC4MYF4OsmCKLQ7tJuNxynorNRpkaMHNYmUCGMHBxCsBExNgY/vtejq8z/KjLmSFz yuORiPvftD3nJvMoiD9ekVK0IXDRy0UMf8UN9KZURHyW93NdINy1rzxUUW7RPKNtR1nDTrJ82l4 iwQkA 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 Tue Mar 4 09:41: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: 14000335 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 D77531FCD00 for ; Tue, 4 Mar 2025 09:41: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=1741081295; cv=none; b=IS1k2NbwNRJ405/ghlwBCsPWE8RJO+lRNgNa8leO9N6zFMaWgHM4B3la/1FNyvpN1nTEyDMNuGF5b8/T40hwtcR+48FFs4ynA4bTU1EHrsIKdfhEPOfZK8lGgi9XpvTOKB8R0NNGdeIba8iNX+Q18TxtM81DvU+ampt5lsR0KZM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081295; c=relaxed/simple; bh=kI9PHcpZLd1x1Zp1Ulfs9kJOBzg2BGQ5YC6LK+/p+6g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=X7jXZ8UQ7n/6TGSDLicd6gsJm7FrX51qg4rCFhe7TrbDBXxGtUbhcccpbNMp3nlT6KeTHh/wpneSH7iXy9lNgQdQGzrD/hWmYtJwjgtb1Exd6If9T+4k6WJsGafnM5XDaXGceRfwzi/era/a6s2MjV9SjKxxOupconW0uVxd9/E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YWtAqNL4; 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="YWtAqNL4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C1FDAC4CEED; Tue, 4 Mar 2025 09:41:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081295; bh=kI9PHcpZLd1x1Zp1Ulfs9kJOBzg2BGQ5YC6LK+/p+6g=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=YWtAqNL4cdj0CpV/u9kvnd+AH/KIFCtumuxv/0d3sjK+dUyOwvkeO/msAx51pfF3/ pkiWN1LXeZrEEYjEChYkegxH88q5eKlakAvQByVMg3e4rli7Mfh7XbsLE3K5pLZP00 jvG2t2jdWZEoJu2Qk2kFbbf4lC3TQWVgEL2K7n5FsU8rwOAxDuoJdnvzaLLThP+j+u Z9VnGk9Tjko77sh2o5jF39GPfy3vu0gZZQES6HtD1RtrWBNsIav0NbFBdF8mPCm5wh wEMlBuJoMEzmFiyDYZ59lCGDuKaK7aeSU4l+wOdR3E6Lz7g6gos8Pz80llu7/7R2Ge G7kgAFqseZyGQ== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:09 +0100 Subject: [PATCH v2 09/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-9-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7Xbcv3363WCR0Vu+SaHWSv6L/j++bgO87lpc7Mak sOdvJxPd5SyMIhxMciKKbI4tJuEyy3nqdhslKkBM4eVCWQIAxenAEzEVo/hf8n6sisPvp7zOKwh z6OYZ9S/Yc+F/er8r/M53ZeLnjjeKMnwzz7Kz/ZdRNK8c/8+nL/jxdkcv2NGsF7N3tLe0I074p9 d4gIA 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 Tue Mar 4 09:41: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: 14000336 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 E23471FCF44 for ; Tue, 4 Mar 2025 09:41: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=1741081298; cv=none; b=Dgy4yjBnK1y5cwfv/rVs7XDG+RDTKBBZC7u+wnAS+Tj1AvfrcuqkQFMaoVu5IXt4DGWrBJIhISqUQaHWK2Dy4RwExcgIiE1iUtwrqa5MruHzoLP+c8irKunb9/0s6uSosa4x9aXN8nUthAczCOcZqK5r3FkTmPj9BUZ6EBNj5Oc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081298; c=relaxed/simple; bh=VbhTqeaRLkm4FVHnB2shDFKLyYt42RFHeFtvkr9tcHI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BTzLn/p6S7vXj3A6xnsx6eK6g1dTBiprJ3A5lCbdOoskSM6QeTsvU6ff2wmY7s71sTxl+dsqHZVFA2mnLcKAL5GGOgpHnqD2V5bkNFn8gL3JhZHs8FLI/s5zQIn9nmabJ/JvLa5WLBc2F9+J0Taj5/ax9BI4C32wG9V1SuW86sQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=O2Y0QMxZ; 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="O2Y0QMxZ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C8D88C4CEE5; Tue, 4 Mar 2025 09:41:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081297; bh=VbhTqeaRLkm4FVHnB2shDFKLyYt42RFHeFtvkr9tcHI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=O2Y0QMxZpvYctd3rbZBBv7ebJhGv45vkBYA+mfNmobJJuDlYlqNuCLxaCbcIReFeP O2tA1SYuJZz/8BqaGMliHTOEixByJ1tCnF+/zjnjjF0j2ALmdBGcMi0m0JlABijclb N4EDdXvfkC9jQbIRfC7ioYfhOgSD12c14P4tLVkakt6NN4shro8kYjWYtoxEWsz7dD N+TB4d2xMqt6vDl+nR4DAwVZOeSS3ZVu09xWzs8kZ8y5iJT47G1tdp7NMfEiSKMv1U Yqfct+9pdb+R7OvH4k85gDYjFZmghINFNrOoDZdb4OGvYuaqlGoPKVj2V1xGtQPxiI zO1uFPKacjxPQ== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:10 +0100 Subject: [PATCH v2 10/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-10-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=6086; i=brauner@kernel.org; h=from:subject:message-id; bh=VbhTqeaRLkm4FVHnB2shDFKLyYt42RFHeFtvkr9tcHI=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7X77gOjy0l6XA5z5Aq+Z6nN+iL/6ETK/NZNByXEL 6vnzA+b1lHKwiDGxSArpsji0G4SLrecp2KzUaYGzBxWJpAhDFycAjCRB4YM/yy9JszqzmD/u37X ZPuPGZsYHE7qHxMtebnsHOO/twsEb71mZLjZmKfiqjDLge3FwittgrpdpbmzTlqtWad04Gd9kcF hZh4A 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 | 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 Tue Mar 4 09:41: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: 14000337 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 F0AA41F8BCB for ; Tue, 4 Mar 2025 09:41: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=1741081300; cv=none; b=q2VgMvtJ+3fCAvFyPJ2h75RaDdPTQneMCtwRLArLWCO3u+/5g1hO/uN7+n2LOAQpKHE2temDzQJFEOCAS4XqJECS+Cx12TobgBR8E5XBbb/mQUePqgPu+W66nQ2YsQdtKxpkTqVngFpa6deFgbxEjMPHrDE7TmHTJHbj4G2PP1A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081300; c=relaxed/simple; bh=UGeeT2+jg9AmN+yurFJkqAxGf9SX4b826fWEeFpnTxE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YbL40DOulqFEG+SGX3tOPkpYqdkVhGLlrhynSdJeGYx9iL5ZK7E65EDcYZPvlfXpvzA8pYg/1AmIQjzyXUMHdt76e/MUknTdHJp3zZ4pm0DvIXGgGK5DLfA2H3BTskTeDYqtcpkUl3gbAdSxc9CBXw8pQzScrK9USCBDJtVUfsE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hpaWyRtF; 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="hpaWyRtF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D2354C4CEEA; Tue, 4 Mar 2025 09:41:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081299; bh=UGeeT2+jg9AmN+yurFJkqAxGf9SX4b826fWEeFpnTxE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=hpaWyRtFBn0RgekdpN9tGowxSYZ72BVvdNE7LJY8IEBx5zYiaRWWegDVZ8KLKizzl xAKKlfQUvh6giiWIDPin9hRBwZeNrCVKexrFgLLaSDwvWFWDpzZJC9Rz+UxofA6CsW b1VozmzOR6tQ7cTNBO7IV8SlnNlwbrxPRngo+J2I5rnaLMGVAmqJoozH8PvWHrcSv+ helenOYTUkj0nsz0r/UKUcI+PbgTUO+TBZp6fESN9QVkZ9fSYMxqSToGWcbaLhuIjd Gaz5m5dWRPXCCMASBvCiPLKsJN43na1U1jq+TCjWux6vyPLbM5befznKLuQr0NmjoR DB+RrQ+BfKIIg== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:11 +0100 Subject: [PATCH v2 11/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-11-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=1240; i=brauner@kernel.org; h=from:subject:message-id; bh=UGeeT2+jg9AmN+yurFJkqAxGf9SX4b826fWEeFpnTxE=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7X77k5pu7LCGfllr8utvzr9yz9VX2osrvh1omTrb QWTyiNTOkpZGMS4GGTFFFkc2k3C5ZbzVGw2ytSAmcPKBDKEgYtTACbiYs7IcERo359atXDJ14fN vyaGnrlQq6KVX8hwr7t4g5BTTnOGMsP/eqEH217+vGInX8KSGvan8O++uF+fb8Y/X3x9zoKba6X DGAA= 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/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 Tue Mar 4 09:41: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: 14000338 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 8EA811FCF7C for ; Tue, 4 Mar 2025 09:41: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=1741081301; cv=none; b=OSOxizzSygZ47zdwfkl4366034oipqxI1gwClIarnaq2KzhvXPmmt0Gna5uTIPnnSyRevy/ttLscLSc5prwdgX0F7vAnTARI/SeI3ZaegxaGbJNpPJc0i9QSnwIhImF2MZJslYd0N4H/YY9FaPRZU6TjSZYDCIkRIfISg51YOLE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081301; c=relaxed/simple; bh=hJe53uv68cH4hf2dDpYw68f12OpI2dT1XrSeuwL+Mno=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PfRQM2VGA0PeCHYcTEGkvM8BIoXh4mk5ClHiNRRiiD38URf0Z5YzjUlEBopWgfaqR4nbqr+bz8gzQPjUlLVKXqcuAaPEAf2hzbaso+A2oba4LrQG70Iu2roMvgicq+pxfphCiYUZH91HvvzDVwaL25FpIwcSgk9QQArjE4XA9Vk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SfMqxlFk; 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="SfMqxlFk" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DEBCBC4CEE9; Tue, 4 Mar 2025 09:41:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081301; bh=hJe53uv68cH4hf2dDpYw68f12OpI2dT1XrSeuwL+Mno=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=SfMqxlFkRVzBLVHbyPUBovGb09kZO9mdYHYqaSSp57JwekPYoYykBrn2vO0nPWOLh 2O3wZMP3rDnHl9LLD2s8RF371aok8qzWrlOdiskdj13xLJ1gq2YX1bSSzrKSNSN4cy 9jJahG/ayhWz1lmFak5WjIBu6FpUCeEDTupsSGCX/T4lJaZrpEQAnKEBmcweb9Gqzg Too0zw1IuHnp1uGzoOVkdFNDEX08ry/Sx/afPgPphu4a2oulPCCN4E4eff5o3oqUbZ HncKd0755u/LQsCkElBvCh1e8NK5RyxmrYbZaX1IGu+bSXoZU1AyOaPmjdVRBRfvN/ Ig/HoLkNilI/w== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:12 +0100 Subject: [PATCH v2 12/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-12-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=1192; i=brauner@kernel.org; h=from:subject:message-id; bh=hJe53uv68cH4hf2dDpYw68f12OpI2dT1XrSeuwL+Mno=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7X7mkF0hUjRljvvNx0MntXnoPFp5WaLlwI26rtvT Zm7ojN4TUcpC4MYF4OsmCKLQ7tJuNxynorNRpkaMHNYmUCGMHBxCsBE7s5gZDiw4lX23u8PLaSq dt53Wl9VyLl5cef2JKUQ/qPp5uG/VW0Z/hmqLt6R8fziO5X5qwO28696K7Fcotmypzv1pNGp6Tz 3n7EBAA== 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/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 Tue Mar 4 09:41: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: 14000339 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 E83F31FCFC1 for ; Tue, 4 Mar 2025 09:41: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=1741081306; cv=none; b=plkuys8C0CLNExQiB8J8XVhAU2E8+4lVKqnAT3d9V2e/jHgMEIcf3Qg4Ql/bD3Ek3GrZMiUBPmmqw8J4iBynTTjOESW6MJfxvpfY30s8lsB7+5j0LaMbXRWxGim4LDTgJqDwCSMtGctcJhwaTnazpinnAQmvLwyef4z1BZtMB04= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081306; c=relaxed/simple; bh=FhKNsJ55OVok6P5QTIj8iE3Kv7bGxeoGFF0N6sn7W4I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WsndNm+3vI8qLW0eniLWIQG87R9SRsjVBoha4o04Px8EKr/n6ytZLSXtEHcARJ/wvMpggJaGnbzy1KXjs3v/S8UmXAxszqjbWAdW/fduy+XUpLzsVk156Awrz1ce8IOiZLpm6gDu0W5Nehz/rFnrZfLfTm55plYZ0SyCpigEexg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Up4W/a3X; 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="Up4W/a3X" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DEAACC4CEE8; Tue, 4 Mar 2025 09:41:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081303; bh=FhKNsJ55OVok6P5QTIj8iE3Kv7bGxeoGFF0N6sn7W4I=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Up4W/a3XSxTaBPpRfZ2BVVhIv2BGqxg1QATZ7qn0JjaMkDy8VUz+xLVwjdaGdTSvS Hr/nAetqAmTMnS6ae939ke5Oswn+VxNngy1aqIFk8Gw3jZRuBcNx3hvtkAlVzot1fZ iLH4FTQdg/W+lNcuBmuFGVHXqmpB2U2zPUuZHb9vtBD0MHYgS3rZTBRLe1tyaeQRCt 647hVxdy3VbY23VZWR22Xogf0iDt1W/9SGmK6I5R5mfnDaAx/t+hHIH+mJr4jWbal7 O23Up0qJ6PvCLxWJ0M+baD8iEGuPeHj4ZqqWmdDTfq82lcRFKZfDFY7EQA8UqklowI 37cc9OgYwNuyA== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:13 +0100 Subject: [PATCH v2 13/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-13-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=1235; i=brauner@kernel.org; h=from:subject:message-id; bh=FhKNsJ55OVok6P5QTIj8iE3Kv7bGxeoGFF0N6sn7W4I=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7V7iZRzza042ZUn7BfqH4lWeflApPvpMeNl8bsVu D/EGDk+6ihlYRDjYpAVU2RxaDcJl1vOU7HZKFMDZg4rE8gQBi5OAZhIqxvDP6XJB27Wz9jzPl9b YO0u56dxd18L9zNwvmheeZZhb3Re71lGhi4ZrsakXWGh9/QCLyQznlu1fc2NWY+ea72yu1CY9// dZQ4A 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/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 Tue Mar 4 09:41: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: 14000340 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 E83931FC11A for ; Tue, 4 Mar 2025 09:41: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=1741081306; cv=none; b=T+CpaE/7P9zXaR0jmc+HI1C1Mld6VG1cdEyjp27vNwnxAJKH6zzDFQ+IZ59T+UebmS9jfKFEqPWQfVCIZXsb0H2vajsuw8nhWcXA5H32wQRExpvJ0OWPOGdRL+AXCzBEMCPE0DTJXeQ0Dkx10RKUThkXYj4nFu08Upv9F3tl8Ao= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081306; c=relaxed/simple; bh=09EI8zIEUUfNNhCutUmrWMQ1gF9fbyxFdOpSnbEaNr0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qreeDfH/yCtrqErH2i+svL3W8MVH+BMjKc1Sz4taHp4dY+xMvVw+dvfCr55DXNOwtGgXNr5PgVUeVH2dSctOzhJnD3ppfgbz9UDd0xVZ/XewaAU5IM7HyNbBDfootSKdPIrw/Z1nIzmd2OcIGgoVi0GZfwRpHebvj4d/+gtgUX0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EvjfiLuP; 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="EvjfiLuP" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F0DBFC4CEE5; Tue, 4 Mar 2025 09:41:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081305; bh=09EI8zIEUUfNNhCutUmrWMQ1gF9fbyxFdOpSnbEaNr0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=EvjfiLuPprxlbC0eaW/7x/b2b6XTpOdbZXQ6Nz9Ik3Cpe/Ld90BJQTIi2Gj8hmuel ugAL3kVL3rXUilszhanGwiNF2wyEXAw6070TBilwp9lIHFF2VBxSXq0XT70yiolDmK OixA/m0h2OHK2UPDRK4V6z0r2es9U+3r14wWSb8Q1mI53A8+NjZJ9wZwN6lkjIK9hv 3zaoKv9iDANYpVqGHvGPrybBcTRA/UFRPoj9oSiVl/EF+uvdqUPVbQX9uS6aVfgfpj reJMn4oFoCegZmvclNvtMIOeUlasYJrca41fTs9IixuJUHEovpJEGnvutidaXObFge eo+/Sv9HQDjbg== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:14 +0100 Subject: [PATCH v2 14/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-14-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=1284; i=brauner@kernel.org; h=from:subject:message-id; bh=09EI8zIEUUfNNhCutUmrWMQ1gF9fbyxFdOpSnbEaNr0=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7X76DmbJ2dXP9sRbtQ9faqE/9LJD91/B5a1lS4Xt ysyuVE1o6OUhUGMi0FWTJHFod0kXG45T8Vmo0wNmDmsTCBDGLg4BWAi6i8Z/keKqm01S+v9m7HY aUXAPR3u/Z1zBRNu3T0yteusRNekjOMM/90VZq1idD64iPFj5Ta99ddfvlmW8HGCenhnt5Tg/Rs idfwA 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/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 Tue Mar 4 09:41: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: 14000341 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 03B421FC0F0 for ; Tue, 4 Mar 2025 09:41: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=1741081308; cv=none; b=qS0w/0ZsS81IKEk+HG4dfI4H47qIuHFE4ixriE2Yq5L0dBx6stdlsilJ7PNRMZmKRwSO4GVM0Xrdg6DmcP+kXexqyQpln71M8UdotGIOyFCD3a0jkqpqAvQJkCs0rs4fNOIkC9Rju73S7OpDhvwG+7RjfLexx/b4e9Zwm5I4gGs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741081308; c=relaxed/simple; bh=NB4wYrYB2xSU7+HpfTxfvQl8syAvc8zDhO/ZC76uTwQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J8AWX++Qf3uWnFODzT1xnXDlqzZaNlj2rHUprteO17qVhqQwxA9wHmEABdlnR8iuAdtkJCH2ZM19fNDzDCYuj9IQMAORwjZA7/tu3jCCkfibc9PZU2K72e9pJE8ODNy4v758ib4Yd7cnuuxk3ST+fAHNvZ3vHiiaL55fxYxMJdI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=L18CJL+g; 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="L18CJL+g" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E87F6C4CEE9; Tue, 4 Mar 2025 09:41:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741081307; bh=NB4wYrYB2xSU7+HpfTxfvQl8syAvc8zDhO/ZC76uTwQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=L18CJL+gODcuEjukY6CInkoiQeoawNHiaz3K/cqRRXlgxszgS3y7b8+RiYuivq51x 152PJGz5Wyb6J9mgVJk4nAFuwG2knDH0Mii4eLKD3VkF/ZULY1MG6BkZ6AHEfNjQC5 wEPEWo9CaIFiYt/RnK2xEQG3C+HdWeTDRqlMpIBQxj3hnboaQ7L6FFwKPNVtSoikOd kUNV3y1ge44MK8L/HznYkdsDJ8aa2SI1QUxLMx5ogWUkNJnTakVSXTHr12Tpji8dlp tCTeM7sB3l8akE0RMVYOloJ/K0Xp2QusaFtWRQImrCiOuPvbhnuYGEqH8UA1X/Jc+x R/5Cok4vSr/aA== From: Christian Brauner Date: Tue, 04 Mar 2025 10:41:15 +0100 Subject: [PATCH v2 15/15] 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: <20250304-work-pidfs-kill_on_last_close-v2-15-44fdacfaa7b7@kernel.org> References: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@kernel.org> In-Reply-To: <20250304-work-pidfs-kill_on_last_close-v2-0-44fdacfaa7b7@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=6642; i=brauner@kernel.org; h=from:subject:message-id; bh=NB4wYrYB2xSU7+HpfTxfvQl8syAvc8zDhO/ZC76uTwQ=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMaQfO7V7igbTu29BV7j32itM4VlcfzbxAnvNF/2EDQX3c z0+r7B41FHKwiDGxSArpsji0G4SLrecp2KzUaYGzBxWJpAhDFycAnCTJRkZ1oZkBVV5uk1+yvK8 8tG1GfW87S5+xyMzZ+mZ/YpYFqrPysiwN6E6b8Vx6bevlrCcnpZ8ofvp59fbJJ+XpT6NMozw3tv OBgA= 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/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