From: Oleg Nesterov <oleg@redhat.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH 2/2] do_io_accounting: use sig->stats_lock
Date: Mon, 23 Oct 2023 17:34:05 +0200 [thread overview]
Message-ID: <20231023153405.GA4639@redhat.com> (raw)
In-Reply-To: <20231023153343.GA4629@redhat.com>
rather than lock_task_sighand(), sig->stats_lock was specifically
designed for this type of use.
This way the "if (whole)" branch runs lockless in the likely case.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
fs/proc/base.c | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/fs/proc/base.c b/fs/proc/base.c
index 0a39412332e2..ad4afa73b25b 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -2977,7 +2977,6 @@ static const struct file_operations proc_coredump_filter_operations = {
static int do_io_accounting(struct task_struct *task, struct seq_file *m, int whole)
{
struct task_io_accounting acct;
- unsigned long flags;
int result;
result = down_read_killable(&task->signal->exec_update_lock);
@@ -2989,15 +2988,24 @@ static int do_io_accounting(struct task_struct *task, struct seq_file *m, int wh
goto out_unlock;
}
- if (whole && lock_task_sighand(task, &flags)) {
+ if (whole) {
struct signal_struct *sig = task->signal;
struct task_struct *t;
+ unsigned int seq = 1;
+ unsigned long flags;
+
+ rcu_read_lock();
+ do {
+ seq++; /* 2 on the 1st/lockless path, otherwise odd */
+ flags = read_seqbegin_or_lock_irqsave(&sig->stats_lock, &seq);
- acct = sig->ioac;
- __for_each_thread(sig, t)
- task_io_accounting_add(&acct, &t->ioac);
+ acct = sig->ioac;
+ __for_each_thread(sig, t)
+ task_io_accounting_add(&acct, &t->ioac);
- unlock_task_sighand(task, &flags);
+ } while (need_seqretry(&sig->stats_lock, seq));
+ done_seqretry_irqrestore(&sig->stats_lock, seq, flags);
+ rcu_read_unlock();
} else {
acct = task->ioac;
}
--
2.25.1.362.g51ebf55
prev parent reply other threads:[~2023-10-23 15:36 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-23 15:33 [PATCH 1/2] do_io_accounting: use __for_each_thread() Oleg Nesterov
2023-10-23 15:34 ` Oleg Nesterov [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231023153405.GA4639@redhat.com \
--to=oleg@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=ebiederm@xmission.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.