Re: [PATCH v4 2/2] sched: Skip priority checks with SCHED_FLAG_KEEP_PARAMS

From: Quentin Perret
Date: Mon Jul 26 2021 - 09:56:19 EST


On Thursday 22 Jul 2021 at 10:47:33 (+0200), Dietmar Eggemann wrote:
> (*) This changes the behaviour when setting uclamp values on a DL task.
>
> Before uclamp values could be set but now, because of
>
> void __getparam_dl(struct task_struct *p, struct sched_attr *attr)
> ..
> attr->sched_flags = dl_se->flags
>
> SCHED_FLAG_UTIL_CLAMP gets overwritten and __sched_setscheduler() bails in:
>
> if (unlikely(policy == p->policy)) {
> ...
> retval = 0;
> goto unlock;
> }
> change:
>
> I.e. the:
>
> if (attr->sched_flags & SCHED_FLAG_UTIL_CLAMP)
> goto change;
>
> can't trigger anymore.

Bah, as you said it doesn't seem to be a big deal, but clearly that was
unintentional. Let me try and fix this.

> > + else if (task_has_rt_policy(p))
> > + attr->sched_priority = p->rt_priority;
> > + else
> > + attr->sched_nice = task_nice(p);
> > +}
> > +
> > /**
> > * sys_sched_setscheduler - set/change the scheduler policy and RT priority
> > * @pid: the pid in question.
> > @@ -7393,6 +7403,8 @@ SYSCALL_DEFINE3(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr,
> > rcu_read_unlock();
> >
> > if (likely(p)) {
> > + if (attr.sched_flags & SCHED_FLAG_KEEP_PARAMS)
> > + get_params(p, &attr);
>
> SCHED_FLAG_KEEP_PARAMS is handled here but SCHED_FLAG_KEEP_POLICY
> outside (before) the `if (likely(p))`?

Because I need to dereference p while SCHED_FLAG_KEEP_POLICY doesn't :)

> > retval = sched_setattr(p, &attr);
> > put_task_struct(p);
> > }
>
> [...]