[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20200630170751.GA4817@hirez.programming.kicks-ass.net>
Date: Tue, 30 Jun 2020 19:07:51 +0200
From: Peter Zijlstra <peterz@...radead.org>
To: Qais Yousef <qais.yousef@....com>
Cc: Ingo Molnar <mingo@...hat.com>,
Valentin Schneider <valentin.schneider@....com>,
Juri Lelli <juri.lelli@...hat.com>,
Vincent Guittot <vincent.guittot@...aro.org>,
Dietmar Eggemann <dietmar.eggemann@....com>,
Steven Rostedt <rostedt@...dmis.org>,
Ben Segall <bsegall@...gle.com>, Mel Gorman <mgorman@...e.de>,
Patrick Bellasi <patrick.bellasi@...bug.net>,
Chris Redpath <chris.redpath@....com>,
Lukasz Luba <lukasz.luba@....com>, linux-kernel@...r.kernel.org
Subject: Re: [PATCH v6 2/2] sched/uclamp: Protect uclamp fast path code with
static key
On Tue, Jun 30, 2020 at 12:21:23PM +0100, Qais Yousef wrote:
> @@ -993,10 +1013,38 @@ static inline void uclamp_rq_dec_id(struct rq *rq, struct task_struct *p,
>
> lockdep_assert_held(&rq->lock);
>
> + /*
> + * If sched_uclamp_used was enabled after task @p was enqueued,
> + * we could end up with unbalanced call to uclamp_rq_dec_id().
> + *
> + * In this case the uc_se->active flag should be false since no uclamp
> + * accounting was performed at enqueue time and we can just return
> + * here.
> + *
> + * Need to be careful of the following enqeueue/dequeue ordering
> + * problem too
> + *
> + * enqueue(taskA)
> + * // sched_uclamp_used gets enabled
> + * enqueue(taskB)
> + * dequeue(taskA)
> + * // Must not decrement bukcet->tasks here
> + * dequeue(taskB)
> + *
> + * where we could end up with stale data in uc_se and
> + * bucket[uc_se->bucket_id].
> + *
> + * The following check here eliminates the possibility of such race.
> + */
> + if (unlikely(!uc_se->active))
> + return;
> +
> bucket = &uc_rq->bucket[uc_se->bucket_id];
> +
> SCHED_WARN_ON(!bucket->tasks);
> if (likely(bucket->tasks))
> bucket->tasks--;
> +
> uc_se->active = false;
>
> /*
> @@ -1221,6 +1289,8 @@ static void __setscheduler_uclamp(struct task_struct *p,
> if (likely(!(attr->sched_flags & SCHED_FLAG_UTIL_CLAMP)))
> return;
>
> + static_branch_enable(&sched_uclamp_used);
> +
> if (attr->sched_flags & SCHED_FLAG_UTIL_CLAMP_MIN) {
> uclamp_se_set(&p->uclamp_req[UCLAMP_MIN],
> attr->sched_util_min, true);
> @@ -7387,6 +7457,8 @@ static ssize_t cpu_uclamp_write(struct kernfs_open_file *of, char *buf,
> if (req.ret)
> return req.ret;
>
> + static_branch_enable(&sched_uclamp_used);
> +
> mutex_lock(&uclamp_mutex);
> rcu_read_lock();
>
There's a fun race described in 9107c89e269d ("perf: Fix race between
event install and jump_labels"), are we sure this isn't also susceptible
to something similar?
I suspect not, but I just wanted to make sure.
Powered by blists - more mailing lists