From: Peter Zijlstra <peterz@infradead.org>
To: Josh Don <joshdon@google.com>
Cc: "Ingo Molnar" <mingo@redhat.com>,
"Juri Lelli" <juri.lelli@redhat.com>,
"Vincent Guittot" <vincent.guittot@linaro.org>,
"Dietmar Eggemann" <dietmar.eggemann@arm.com>,
"Steven Rostedt" <rostedt@goodmis.org>,
"Ben Segall" <bsegall@google.com>, "Mel Gorman" <mgorman@suse.de>,
"Daniel Bristot de Oliveira" <bristot@redhat.com>,
"Valentin Schneider" <vschneid@redhat.com>,
linux-kernel@vger.kernel.org, "Tejun Heo" <tj@kernel.org>,
"Michal Koutný" <mkoutny@suse.com>,
"Christian Brauner" <brauner@kernel.org>,
"Zefan Li" <lizefan.x@bytedance.com>
Subject: Re: [PATCH v3] sched: async unthrottling for cfs bandwidth
Date: Fri, 18 Nov 2022 13:47:17 +0100 [thread overview]
Message-ID: <Y3d+1a9AEnWaxFwq@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <20221117005418.3499691-1-joshdon@google.com>
On Wed, Nov 16, 2022 at 04:54:18PM -0800, Josh Don wrote:
> +#ifdef CONFIG_SMP
> +static void __cfsb_csd_unthrottle(void *arg)
> +{
> + struct rq *rq = arg;
> + struct rq_flags rf;
> + struct cfs_rq *cursor, *tmp;
> +
> + rq_lock(rq, &rf);
> +
> + /*
> + * Since we hold rq lock we're safe from concurrent manipulation of
> + * the CSD list. However, this RCU critical section annotates the
> + * fact that we pair with sched_free_group_rcu(), so that we cannot
> + * race with group being freed in the window between removing it
> + * from the list and advancing to the next entry in the list.
> + */
> + rcu_read_lock();
preempt_disable() -- through rq->lock -- also holds off rcu. Strictly
speaking this here is superfluous. But if you want it as an annotation,
that's fine I suppose.
> +
> + list_for_each_entry_safe(cursor, tmp, &rq->cfsb_csd_list,
> + throttled_csd_list) {
> + list_del_init(&cursor->throttled_csd_list);
> +
> + if (cfs_rq_throttled(cursor))
> + unthrottle_cfs_rq(cursor);
> + }
> +
> + rcu_read_unlock();
> +
> + rq_unlock(rq, &rf);
> +}
> +
> +static inline void __unthrottle_cfs_rq_async(struct cfs_rq *cfs_rq)
> +{
> + struct rq *rq = rq_of(cfs_rq);
> +
> + if (rq == this_rq()) {
> + unthrottle_cfs_rq(cfs_rq);
> + return;
> + }
Ideally we'd first queue all the remotes and then process local, but
given how all this is organized that doesn't seem trivial to arrange.
Maybe have this function return false when local and save that cfs_rq in
a local var to process again later, dunno, that might turn messy.
> +
> + /* Already enqueued */
> + if (SCHED_WARN_ON(!list_empty(&cfs_rq->throttled_csd_list)))
> + return;
> +
> + list_add_tail(&cfs_rq->throttled_csd_list, &rq->cfsb_csd_list);
> +
> + smp_call_function_single_async(cpu_of(rq), &rq->cfsb_csd);
Hurmph.. so I was expecting something like:
first = list_empty(&rq->cfsb_csd_list);
list_add_tail(&cfs_rq->throttled_csd_list, &rq->cfsb_csd_list);
if (first)
smp_call_function_single_async(cpu_of(rq), &rq->cfsb_csd);
But I suppose I'm remembering the 'old' version. I don't think it is
broken as written. There's a very narrow window where you'll end up
sending a second IPI for naught, but meh.
> +}
Let me go queue this thing, we can always improve upon matters later.
next prev parent reply other threads:[~2022-11-18 12:47 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-17 0:54 [PATCH v3] sched: async unthrottling for cfs bandwidth Josh Don
2022-11-18 12:47 ` Peter Zijlstra [this message]
2022-11-18 19:25 ` Josh Don
2022-11-20 2:22 ` Chengming Zhou
2022-11-21 11:58 ` Peter Zijlstra
2022-11-21 19:37 ` Josh Don
2022-11-22 10:35 ` Peter Zijlstra
2022-11-25 8:57 ` Peter Zijlstra
2022-11-25 8:59 ` Peter Zijlstra
2022-11-25 9:12 ` Peter Zijlstra
2022-11-29 1:38 ` Josh Don
2022-11-29 1:32 ` Josh Don
2022-11-21 12:34 ` Peter Zijlstra
2022-11-21 18:02 ` Michal Koutný
2022-11-21 19:31 ` Josh Don
2022-11-22 5:55 ` Aaron Lu
2022-11-22 10:30 ` Peter Zijlstra
2022-11-22 6:08 ` Aaron Lu
2022-11-22 19:41 ` Josh Don
2022-11-24 9:12 ` Peter Zijlstra
2022-12-27 12:13 ` [tip: sched/core] sched: Async " tip-bot2 for Josh Don
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=Y3d+1a9AEnWaxFwq@hirez.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=brauner@kernel.org \
--cc=bristot@redhat.com \
--cc=bsegall@google.com \
--cc=dietmar.eggemann@arm.com \
--cc=joshdon@google.com \
--cc=juri.lelli@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lizefan.x@bytedance.com \
--cc=mgorman@suse.de \
--cc=mingo@redhat.com \
--cc=mkoutny@suse.com \
--cc=rostedt@goodmis.org \
--cc=tj@kernel.org \
--cc=vincent.guittot@linaro.org \
--cc=vschneid@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox