summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Brauner <brauner@kernel.org>2025-11-05 00:05:01 +0100
committerChristian Brauner <brauner@kernel.org>2025-11-05 00:09:06 +0100
commit390d967653e17205f0e519f691b7d6be0a05ff45 (patch)
tree019224e3704a07b952731c0f6cab0f68e47cf1dd
parenta45ff1c7c9e9447ffca83a9d219c50e9eb8bdaeb (diff)
pidfs: reduce wait_pidfd lock scope
There's no need to hold the lock after we realized that pid->attr is set. We're holding a reference to struct pid so it won't go away and pidfs_exit() is called once per struct pid. Link: https://patch.msgid.link/20251105-work-pidfs-wait_pidfd-lock-v1-1-02638783be07@kernel.org Signed-off-by: Christian Brauner <brauner@kernel.org>
-rw-r--r--fs/pidfs.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/fs/pidfs.c b/fs/pidfs.c
index 354ceb2126e7..dbbdd2085790 100644
--- a/fs/pidfs.c
+++ b/fs/pidfs.c
@@ -634,17 +634,19 @@ void pidfs_exit(struct task_struct *tsk)
might_sleep();
- guard(spinlock_irq)(&pid->wait_pidfd.lock);
- attr = pid->attr;
- if (!attr) {
- /*
- * No one ever held a pidfd for this struct pid.
- * Mark it as dead so no one can add a pidfs
- * entry anymore. We're about to be reaped and
- * so no exit information would be available.
- */
- pid->attr = PIDFS_PID_DEAD;
- return;
+ /* Synchronize with pidfs_register_pid(). */
+ scoped_guard(spinlock_irq, &pid->wait_pidfd.lock) {
+ attr = pid->attr;
+ if (!attr) {
+ /*
+ * No one ever held a pidfd for this struct pid.
+ * Mark it as dead so no one can add a pidfs
+ * entry anymore. We're about to be reaped and
+ * so no exit information would be available.
+ */
+ pid->attr = PIDFS_PID_DEAD;
+ return;
+ }
}
/*