LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH 0/2] A couple of sched_getattr() fixes for DL
@ 2021-07-27 10:11 Quentin Perret
2021-07-27 10:11 ` [PATCH 1/2] sched/deadline: Fix reset_on_fork reporting of DL tasks Quentin Perret
2021-07-27 10:11 ` [PATCH 2/2] sched: Don't report SCHED_FLAG_SUGOV in sched_getattr() Quentin Perret
0 siblings, 2 replies; 11+ messages in thread
From: Quentin Perret @ 2021-07-27 10:11 UTC (permalink / raw)
To: Ingo Molnar, Peter Zijlstra, Juri Lelli, Vincent Guittot,
Dietmar Eggemann, Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, linux-kernel
Cc: Quentin Perret
Hi all,
In the context of [1] it became apparent that the way __getparam_dl()
copies the sched_flags into the dl_entity struct for deadline tasks can
have undesirable side effects. This series fixes two issues in that area
causing sched_getattr() to report stale values or things it shouldn't
report to userspace.
Thanks,
Quentin
[1] https://lore.kernel.org/lkml/ad30be79-8fb2-023d-9936-01f7173164e4@arm.com/
Quentin Perret (2):
sched/deadline: Fix reset_on_fork reporting of DL tasks
sched: Don't report SCHED_FLAG_SUGOV in sched_getattr()
kernel/sched/core.c | 1 +
kernel/sched/deadline.c | 7 ++++---
kernel/sched/sched.h | 2 ++
3 files changed, 7 insertions(+), 3 deletions(-)
--
2.32.0.432.gabb21c7263-goog
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/2] sched/deadline: Fix reset_on_fork reporting of DL tasks
2021-07-27 10:11 [PATCH 0/2] A couple of sched_getattr() fixes for DL Quentin Perret
@ 2021-07-27 10:11 ` Quentin Perret
2021-07-29 16:26 ` Dietmar Eggemann
2021-08-05 9:34 ` [tip: sched/core] " tip-bot2 for Quentin Perret
2021-07-27 10:11 ` [PATCH 2/2] sched: Don't report SCHED_FLAG_SUGOV in sched_getattr() Quentin Perret
1 sibling, 2 replies; 11+ messages in thread
From: Quentin Perret @ 2021-07-27 10:11 UTC (permalink / raw)
To: Ingo Molnar, Peter Zijlstra, Juri Lelli, Vincent Guittot,
Dietmar Eggemann, Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, linux-kernel
Cc: Quentin Perret
It is possible for sched_getattr() to incorrectly report the state of
the reset_on_fork flag when called on a deadline task.
Indeed, if the flag was set on a deadline task using sched_setattr()
with flags (SCHED_FLAG_RESET_ON_FORK | SCHED_FLAG_KEEP_PARAMS), then
p->sched_reset_on_fork will be set, but __setscheduler() will bail out
early, which means that the dl_se->flags will not get updated by
__setscheduler_params()->__setparam_dl(). Consequently, if
sched_getattr() is then called on the task, __getparam_dl() will
override kattr.sched_flags with the now out-of-date copy in dl_se->flags
and report the stale value to userspace.
To fix this, make sure to only copy the flags that are relevant to
sched_deadline to and from the dl_se->flags field.
Signed-off-by: Quentin Perret <qperret@google.com>
---
kernel/sched/deadline.c | 7 ++++---
kernel/sched/sched.h | 2 ++
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index aaacd6cfd42f..5cafc642e647 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -2741,7 +2741,7 @@ void __setparam_dl(struct task_struct *p, const struct sched_attr *attr)
dl_se->dl_runtime = attr->sched_runtime;
dl_se->dl_deadline = attr->sched_deadline;
dl_se->dl_period = attr->sched_period ?: dl_se->dl_deadline;
- dl_se->flags = attr->sched_flags;
+ dl_se->flags = attr->sched_flags & SCHED_DL_FLAGS;
dl_se->dl_bw = to_ratio(dl_se->dl_period, dl_se->dl_runtime);
dl_se->dl_density = to_ratio(dl_se->dl_deadline, dl_se->dl_runtime);
}
@@ -2754,7 +2754,8 @@ void __getparam_dl(struct task_struct *p, struct sched_attr *attr)
attr->sched_runtime = dl_se->dl_runtime;
attr->sched_deadline = dl_se->dl_deadline;
attr->sched_period = dl_se->dl_period;
- attr->sched_flags = dl_se->flags;
+ attr->sched_flags &= ~SCHED_DL_FLAGS;
+ attr->sched_flags |= dl_se->flags;
}
/*
@@ -2851,7 +2852,7 @@ bool dl_param_changed(struct task_struct *p, const struct sched_attr *attr)
if (dl_se->dl_runtime != attr->sched_runtime ||
dl_se->dl_deadline != attr->sched_deadline ||
dl_se->dl_period != attr->sched_period ||
- dl_se->flags != attr->sched_flags)
+ dl_se->flags != (attr->sched_flags & SCHED_DL_FLAGS))
return true;
return false;
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 14a41a243f7b..ad3aee63db26 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -227,6 +227,8 @@ static inline void update_avg(u64 *avg, u64 sample)
*/
#define SCHED_FLAG_SUGOV 0x10000000
+#define SCHED_DL_FLAGS (SCHED_FLAG_RECLAIM | SCHED_FLAG_DL_OVERRUN | SCHED_FLAG_SUGOV)
+
static inline bool dl_entity_is_special(struct sched_dl_entity *dl_se)
{
#ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL
--
2.32.0.432.gabb21c7263-goog
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/2] sched: Don't report SCHED_FLAG_SUGOV in sched_getattr()
2021-07-27 10:11 [PATCH 0/2] A couple of sched_getattr() fixes for DL Quentin Perret
2021-07-27 10:11 ` [PATCH 1/2] sched/deadline: Fix reset_on_fork reporting of DL tasks Quentin Perret
@ 2021-07-27 10:11 ` Quentin Perret
2021-07-28 9:12 ` Juri Lelli
2021-08-05 9:34 ` [tip: sched/core] " tip-bot2 for Quentin Perret
1 sibling, 2 replies; 11+ messages in thread
From: Quentin Perret @ 2021-07-27 10:11 UTC (permalink / raw)
To: Ingo Molnar, Peter Zijlstra, Juri Lelli, Vincent Guittot,
Dietmar Eggemann, Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, linux-kernel
Cc: Quentin Perret
SCHED_FLAG_SUGOV is supposed to be a kernel-only flag that userspace
cannot interact with. However, sched_getattr() currently reports it
in sched_flags if called on a sugov worker even though it is not
actually defined in a UAPI header. To avoid this, make sure to
clean-up the sched_flags field in sched_getattr() before returning to
userspace.
Signed-off-by: Quentin Perret <qperret@google.com>
---
kernel/sched/core.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 2d9ff40f4661..d8f489dcc383 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -7535,6 +7535,7 @@ SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr,
kattr.sched_priority = p->rt_priority;
else
kattr.sched_nice = task_nice(p);
+ kattr.sched_flags &= SCHED_FLAG_ALL;
#ifdef CONFIG_UCLAMP_TASK
/*
--
2.32.0.432.gabb21c7263-goog
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 2/2] sched: Don't report SCHED_FLAG_SUGOV in sched_getattr()
2021-07-27 10:11 ` [PATCH 2/2] sched: Don't report SCHED_FLAG_SUGOV in sched_getattr() Quentin Perret
@ 2021-07-28 9:12 ` Juri Lelli
2021-07-28 9:39 ` Quentin Perret
2021-08-05 9:34 ` [tip: sched/core] " tip-bot2 for Quentin Perret
1 sibling, 1 reply; 11+ messages in thread
From: Juri Lelli @ 2021-07-28 9:12 UTC (permalink / raw)
To: Quentin Perret
Cc: Ingo Molnar, Peter Zijlstra, Vincent Guittot, Dietmar Eggemann,
Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, linux-kernel
Hi Quentin,
On 27/07/21 11:11, Quentin Perret wrote:
> SCHED_FLAG_SUGOV is supposed to be a kernel-only flag that userspace
> cannot interact with. However, sched_getattr() currently reports it
> in sched_flags if called on a sugov worker even though it is not
> actually defined in a UAPI header. To avoid this, make sure to
> clean-up the sched_flags field in sched_getattr() before returning to
> userspace.
>
> Signed-off-by: Quentin Perret <qperret@google.com>
> ---
> kernel/sched/core.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 2d9ff40f4661..d8f489dcc383 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -7535,6 +7535,7 @@ SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr,
> kattr.sched_priority = p->rt_priority;
> else
> kattr.sched_nice = task_nice(p);
> + kattr.sched_flags &= SCHED_FLAG_ALL;
Maybe we can do this in the previous patch so that it's kept confined to
deadline bits?
Thanks,
Juri
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/2] sched: Don't report SCHED_FLAG_SUGOV in sched_getattr()
2021-07-28 9:12 ` Juri Lelli
@ 2021-07-28 9:39 ` Quentin Perret
2021-07-28 12:36 ` Juri Lelli
0 siblings, 1 reply; 11+ messages in thread
From: Quentin Perret @ 2021-07-28 9:39 UTC (permalink / raw)
To: Juri Lelli
Cc: Ingo Molnar, Peter Zijlstra, Vincent Guittot, Dietmar Eggemann,
Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, linux-kernel
On Wednesday 28 Jul 2021 at 11:12:03 (+0200), Juri Lelli wrote:
> Hi Quentin,
>
> On 27/07/21 11:11, Quentin Perret wrote:
> > SCHED_FLAG_SUGOV is supposed to be a kernel-only flag that userspace
> > cannot interact with. However, sched_getattr() currently reports it
> > in sched_flags if called on a sugov worker even though it is not
> > actually defined in a UAPI header. To avoid this, make sure to
> > clean-up the sched_flags field in sched_getattr() before returning to
> > userspace.
> >
> > Signed-off-by: Quentin Perret <qperret@google.com>
> > ---
> > kernel/sched/core.c | 1 +
> > 1 file changed, 1 insertion(+)
> >
> > diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> > index 2d9ff40f4661..d8f489dcc383 100644
> > --- a/kernel/sched/core.c
> > +++ b/kernel/sched/core.c
> > @@ -7535,6 +7535,7 @@ SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr,
> > kattr.sched_priority = p->rt_priority;
> > else
> > kattr.sched_nice = task_nice(p);
> > + kattr.sched_flags &= SCHED_FLAG_ALL;
>
> Maybe we can do this in the previous patch so that it's kept confined to
> deadline bits?
That works too, it just felt like this could happen again if we start
using non-standard flags outside of deadline for any reason at some
point in the future. But no strong opinion really.
Cheers,
Quentin
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/2] sched: Don't report SCHED_FLAG_SUGOV in sched_getattr()
2021-07-28 9:39 ` Quentin Perret
@ 2021-07-28 12:36 ` Juri Lelli
2021-07-29 17:21 ` Dietmar Eggemann
0 siblings, 1 reply; 11+ messages in thread
From: Juri Lelli @ 2021-07-28 12:36 UTC (permalink / raw)
To: Quentin Perret
Cc: Ingo Molnar, Peter Zijlstra, Vincent Guittot, Dietmar Eggemann,
Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, linux-kernel
On 28/07/21 10:39, Quentin Perret wrote:
> On Wednesday 28 Jul 2021 at 11:12:03 (+0200), Juri Lelli wrote:
> > Hi Quentin,
> >
> > On 27/07/21 11:11, Quentin Perret wrote:
> > > SCHED_FLAG_SUGOV is supposed to be a kernel-only flag that userspace
> > > cannot interact with. However, sched_getattr() currently reports it
> > > in sched_flags if called on a sugov worker even though it is not
> > > actually defined in a UAPI header. To avoid this, make sure to
> > > clean-up the sched_flags field in sched_getattr() before returning to
> > > userspace.
> > >
> > > Signed-off-by: Quentin Perret <qperret@google.com>
> > > ---
> > > kernel/sched/core.c | 1 +
> > > 1 file changed, 1 insertion(+)
> > >
> > > diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> > > index 2d9ff40f4661..d8f489dcc383 100644
> > > --- a/kernel/sched/core.c
> > > +++ b/kernel/sched/core.c
> > > @@ -7535,6 +7535,7 @@ SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr,
> > > kattr.sched_priority = p->rt_priority;
> > > else
> > > kattr.sched_nice = task_nice(p);
> > > + kattr.sched_flags &= SCHED_FLAG_ALL;
> >
> > Maybe we can do this in the previous patch so that it's kept confined to
> > deadline bits?
>
> That works too, it just felt like this could happen again if we start
> using non-standard flags outside of deadline for any reason at some
> point in the future. But no strong opinion really.
Yeah, I also see this point. :)
So no prob with me to keep it in core.c as you do here.
Best,
Juri
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] sched/deadline: Fix reset_on_fork reporting of DL tasks
2021-07-27 10:11 ` [PATCH 1/2] sched/deadline: Fix reset_on_fork reporting of DL tasks Quentin Perret
@ 2021-07-29 16:26 ` Dietmar Eggemann
2021-08-05 9:34 ` [tip: sched/core] " tip-bot2 for Quentin Perret
1 sibling, 0 replies; 11+ messages in thread
From: Dietmar Eggemann @ 2021-07-29 16:26 UTC (permalink / raw)
To: Quentin Perret, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, linux-kernel
On 27/07/2021 12:11, Quentin Perret wrote:
> It is possible for sched_getattr() to incorrectly report the state of
> the reset_on_fork flag when called on a deadline task.
>
> Indeed, if the flag was set on a deadline task using sched_setattr()
> with flags (SCHED_FLAG_RESET_ON_FORK | SCHED_FLAG_KEEP_PARAMS), then
> p->sched_reset_on_fork will be set, but __setscheduler() will bail out
> early, which means that the dl_se->flags will not get updated by
> __setscheduler_params()->__setparam_dl(). Consequently, if
True, but it would also be awkward if non-DL related flags would have to
be stored in dl_se->flags.
> sched_getattr() is then called on the task, __getparam_dl() will
> override kattr.sched_flags with the now out-of-date copy in dl_se->flags
> and report the stale value to userspace.
>
> To fix this, make sure to only copy the flags that are relevant to
> sched_deadline to and from the dl_se->flags field.
It also fixes the 'hidden' issue that a
uclampset -mX -MY -p dl_task
would end up at 'change:' label because of
dl_se->flags != attr->sched_flags
and not because of
attr->sched_flags & SCHED_FLAG_UTIL_CLAMP
And it also unblocks the uclamp-dl issue raised in
https://lkml.kernel.org/r/ad30be79-8fb2-023d-9936-01f7173164e4@arm.com
which surfaced when using `get_params()->__getparam_dl()` in
SYSCALL_DEFINE3(sched_setattr,...).
Just for reference, IIRC, you mentioned this already on irc.
Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
[...]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/2] sched: Don't report SCHED_FLAG_SUGOV in sched_getattr()
2021-07-28 12:36 ` Juri Lelli
@ 2021-07-29 17:21 ` Dietmar Eggemann
2021-07-29 17:28 ` Quentin Perret
0 siblings, 1 reply; 11+ messages in thread
From: Dietmar Eggemann @ 2021-07-29 17:21 UTC (permalink / raw)
To: Juri Lelli, Quentin Perret
Cc: Ingo Molnar, Peter Zijlstra, Vincent Guittot, Steven Rostedt,
Ben Segall, Mel Gorman, Daniel Bristot de Oliveira, linux-kernel
On 28/07/2021 14:36, Juri Lelli wrote:
> On 28/07/21 10:39, Quentin Perret wrote:
>> On Wednesday 28 Jul 2021 at 11:12:03 (+0200), Juri Lelli wrote:
[...]
>>> Maybe we can do this in the previous patch so that it's kept confined to
>>> deadline bits?
>>
>> That works too, it just felt like this could happen again if we start
>> using non-standard flags outside of deadline for any reason at some
>> point in the future. But no strong opinion really.
>
> Yeah, I also see this point. :)
>
> So no prob with me to keep it in core.c as you do here.
>
> Best,
> Juri
>
I would vote for not exporting SCHED_FLAG_SUGOV from __getparam_dl() in
patch 1/2 to underpin the idea that this flag is a hack.
@ -2759,7 +2759,7 @@ void __getparam_dl(struct task_struct *p, struct
sched_attr *attr)
attr->sched_deadline = dl_se->dl_deadline;
attr->sched_period = dl_se->dl_period;
attr->sched_flags &= ~SCHED_DL_FLAGS;
- attr->sched_flags |= dl_se->flags;
+ attr->sched_flags |= dl_se->flags & ~SCHED_FLAG_SUGOV;
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/2] sched: Don't report SCHED_FLAG_SUGOV in sched_getattr()
2021-07-29 17:21 ` Dietmar Eggemann
@ 2021-07-29 17:28 ` Quentin Perret
0 siblings, 0 replies; 11+ messages in thread
From: Quentin Perret @ 2021-07-29 17:28 UTC (permalink / raw)
To: Dietmar Eggemann
Cc: Juri Lelli, Ingo Molnar, Peter Zijlstra, Vincent Guittot,
Steven Rostedt, Ben Segall, Mel Gorman,
Daniel Bristot de Oliveira, linux-kernel
On Thursday 29 Jul 2021 at 19:21:03 (+0200), Dietmar Eggemann wrote:
> On 28/07/2021 14:36, Juri Lelli wrote:
> > On 28/07/21 10:39, Quentin Perret wrote:
> >> On Wednesday 28 Jul 2021 at 11:12:03 (+0200), Juri Lelli wrote:
>
> [...]
>
> >>> Maybe we can do this in the previous patch so that it's kept confined to
> >>> deadline bits?
> >>
> >> That works too, it just felt like this could happen again if we start
> >> using non-standard flags outside of deadline for any reason at some
> >> point in the future. But no strong opinion really.
> >
> > Yeah, I also see this point. :)
> >
> > So no prob with me to keep it in core.c as you do here.
> >
> > Best,
> > Juri
> >
>
> I would vote for not exporting SCHED_FLAG_SUGOV from __getparam_dl() in
> patch 1/2 to underpin the idea that this flag is a hack.
>
> @ -2759,7 +2759,7 @@ void __getparam_dl(struct task_struct *p, struct
> sched_attr *attr)
> attr->sched_deadline = dl_se->dl_deadline;
> attr->sched_period = dl_se->dl_period;
> attr->sched_flags &= ~SCHED_DL_FLAGS;
> - attr->sched_flags |= dl_se->flags;
> + attr->sched_flags |= dl_se->flags & ~SCHED_FLAG_SUGOV;
Alright, that's 2 votes against 1, you win!
I'll post a v2 shortly.
Cheers,
Quentin
^ permalink raw reply [flat|nested] 11+ messages in thread
* [tip: sched/core] sched: Don't report SCHED_FLAG_SUGOV in sched_getattr()
2021-07-27 10:11 ` [PATCH 2/2] sched: Don't report SCHED_FLAG_SUGOV in sched_getattr() Quentin Perret
2021-07-28 9:12 ` Juri Lelli
@ 2021-08-05 9:34 ` tip-bot2 for Quentin Perret
1 sibling, 0 replies; 11+ messages in thread
From: tip-bot2 for Quentin Perret @ 2021-08-05 9:34 UTC (permalink / raw)
To: linux-tip-commits
Cc: Quentin Perret, Peter Zijlstra (Intel), x86, linux-kernel
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 7ad721bf10718a4e480a27ded8bb16b8f6feb2d1
Gitweb: https://git.kernel.org/tip/7ad721bf10718a4e480a27ded8bb16b8f6feb2d1
Author: Quentin Perret <qperret@google.com>
AuthorDate: Tue, 27 Jul 2021 11:11:02 +01:00
Committer: Peter Zijlstra <peterz@infradead.org>
CommitterDate: Wed, 04 Aug 2021 15:16:44 +02:00
sched: Don't report SCHED_FLAG_SUGOV in sched_getattr()
SCHED_FLAG_SUGOV is supposed to be a kernel-only flag that userspace
cannot interact with. However, sched_getattr() currently reports it
in sched_flags if called on a sugov worker even though it is not
actually defined in a UAPI header. To avoid this, make sure to
clean-up the sched_flags field in sched_getattr() before returning to
userspace.
Signed-off-by: Quentin Perret <qperret@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20210727101103.2729607-3-qperret@google.com
---
kernel/sched/core.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 6c562ad..314f70d 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -7530,6 +7530,7 @@ SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr,
kattr.sched_priority = p->rt_priority;
else
kattr.sched_nice = task_nice(p);
+ kattr.sched_flags &= SCHED_FLAG_ALL;
#ifdef CONFIG_UCLAMP_TASK
/*
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [tip: sched/core] sched/deadline: Fix reset_on_fork reporting of DL tasks
2021-07-27 10:11 ` [PATCH 1/2] sched/deadline: Fix reset_on_fork reporting of DL tasks Quentin Perret
2021-07-29 16:26 ` Dietmar Eggemann
@ 2021-08-05 9:34 ` tip-bot2 for Quentin Perret
1 sibling, 0 replies; 11+ messages in thread
From: tip-bot2 for Quentin Perret @ 2021-08-05 9:34 UTC (permalink / raw)
To: linux-tip-commits
Cc: Quentin Perret, Peter Zijlstra (Intel), x86, linux-kernel
The following commit has been merged into the sched/core branch of tip:
Commit-ID: f95091536f78971b269ec321b057b8d630b0ad8a
Gitweb: https://git.kernel.org/tip/f95091536f78971b269ec321b057b8d630b0ad8a
Author: Quentin Perret <qperret@google.com>
AuthorDate: Tue, 27 Jul 2021 11:11:01 +01:00
Committer: Peter Zijlstra <peterz@infradead.org>
CommitterDate: Wed, 04 Aug 2021 15:16:43 +02:00
sched/deadline: Fix reset_on_fork reporting of DL tasks
It is possible for sched_getattr() to incorrectly report the state of
the reset_on_fork flag when called on a deadline task.
Indeed, if the flag was set on a deadline task using sched_setattr()
with flags (SCHED_FLAG_RESET_ON_FORK | SCHED_FLAG_KEEP_PARAMS), then
p->sched_reset_on_fork will be set, but __setscheduler() will bail out
early, which means that the dl_se->flags will not get updated by
__setscheduler_params()->__setparam_dl(). Consequently, if
sched_getattr() is then called on the task, __getparam_dl() will
override kattr.sched_flags with the now out-of-date copy in dl_se->flags
and report the stale value to userspace.
To fix this, make sure to only copy the flags that are relevant to
sched_deadline to and from the dl_se->flags field.
Signed-off-by: Quentin Perret <qperret@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20210727101103.2729607-2-qperret@google.com
---
kernel/sched/deadline.c | 7 ++++---
kernel/sched/sched.h | 2 ++
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index aaacd6c..5cafc64 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -2741,7 +2741,7 @@ void __setparam_dl(struct task_struct *p, const struct sched_attr *attr)
dl_se->dl_runtime = attr->sched_runtime;
dl_se->dl_deadline = attr->sched_deadline;
dl_se->dl_period = attr->sched_period ?: dl_se->dl_deadline;
- dl_se->flags = attr->sched_flags;
+ dl_se->flags = attr->sched_flags & SCHED_DL_FLAGS;
dl_se->dl_bw = to_ratio(dl_se->dl_period, dl_se->dl_runtime);
dl_se->dl_density = to_ratio(dl_se->dl_deadline, dl_se->dl_runtime);
}
@@ -2754,7 +2754,8 @@ void __getparam_dl(struct task_struct *p, struct sched_attr *attr)
attr->sched_runtime = dl_se->dl_runtime;
attr->sched_deadline = dl_se->dl_deadline;
attr->sched_period = dl_se->dl_period;
- attr->sched_flags = dl_se->flags;
+ attr->sched_flags &= ~SCHED_DL_FLAGS;
+ attr->sched_flags |= dl_se->flags;
}
/*
@@ -2851,7 +2852,7 @@ bool dl_param_changed(struct task_struct *p, const struct sched_attr *attr)
if (dl_se->dl_runtime != attr->sched_runtime ||
dl_se->dl_deadline != attr->sched_deadline ||
dl_se->dl_period != attr->sched_period ||
- dl_se->flags != attr->sched_flags)
+ dl_se->flags != (attr->sched_flags & SCHED_DL_FLAGS))
return true;
return false;
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 9a1c6ae..75a5c12 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -227,6 +227,8 @@ static inline void update_avg(u64 *avg, u64 sample)
*/
#define SCHED_FLAG_SUGOV 0x10000000
+#define SCHED_DL_FLAGS (SCHED_FLAG_RECLAIM | SCHED_FLAG_DL_OVERRUN | SCHED_FLAG_SUGOV)
+
static inline bool dl_entity_is_special(struct sched_dl_entity *dl_se)
{
#ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL
^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2021-08-05 9:34 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-27 10:11 [PATCH 0/2] A couple of sched_getattr() fixes for DL Quentin Perret
2021-07-27 10:11 ` [PATCH 1/2] sched/deadline: Fix reset_on_fork reporting of DL tasks Quentin Perret
2021-07-29 16:26 ` Dietmar Eggemann
2021-08-05 9:34 ` [tip: sched/core] " tip-bot2 for Quentin Perret
2021-07-27 10:11 ` [PATCH 2/2] sched: Don't report SCHED_FLAG_SUGOV in sched_getattr() Quentin Perret
2021-07-28 9:12 ` Juri Lelli
2021-07-28 9:39 ` Quentin Perret
2021-07-28 12:36 ` Juri Lelli
2021-07-29 17:21 ` Dietmar Eggemann
2021-07-29 17:28 ` Quentin Perret
2021-08-05 9:34 ` [tip: sched/core] " tip-bot2 for Quentin Perret
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).