diff options
| author | Christian Brauner <brauner@kernel.org> | 2025-11-05 00:05:01 +0100 |
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2025-11-05 00:09:06 +0100 |
| commit | 390d967653e17205f0e519f691b7d6be0a05ff45 (patch) | |
| tree | 019224e3704a07b952731c0f6cab0f68e47cf1dd | |
| parent | a45ff1c7c9e9447ffca83a9d219c50e9eb8bdaeb (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.c | 24 |
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; + } } /* |