Re: [PATCH v4 3/4] sched: Allow sched_{get,set}attr to change latency_nice of the task

From: Pavan Kondeti
Date: Tue Feb 25 2020 - 22:44:38 EST


On Tue, Feb 25, 2020 at 08:33:53PM +0530, Parth Shah wrote:
>
>
> On 2/25/20 12:24 PM, Pavan Kondeti wrote:
> > On Mon, Feb 24, 2020 at 02:29:17PM +0530, Parth Shah wrote:
> >
> > [...]
> >
> >> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> >> index 65b6c00d6dac..e1dc536d4ca3 100644
> >> --- a/kernel/sched/core.c
> >> +++ b/kernel/sched/core.c
> >> @@ -4723,6 +4723,8 @@ static void __setscheduler_params(struct task_struct *p,
> >> p->rt_priority = attr->sched_priority;
> >> p->normal_prio = normal_prio(p);
> >> set_load_weight(p, true);
> >> +
> >> + p->latency_nice = attr->sched_latency_nice;
> >> }
> >
> > We don't want this when SCHED_FLAG_LATENCY_NICE is not set in
> > attr->flags.
> >
> > The user may pass SCHED_FLAG_KEEP_PARAMS | SCHED_FLAG_LATENCY_NICE to
> > change only latency nice value. So we have to update latency_nice
> > outside __setscheduler_params(), I think.
>
>
> AFAICT, passing SCHED_FLAG_KEEP_PARAMS with any other flag will prevent us
> from changing the latency_nice value because of the below code flow:
>
> __sched_setscheduler()
> __setscheduler()
> if (attr->sched_flags & SCHED_FLAG_KEEP_PARAMS) return;
> __setscheduler_params()
>

I thought the user space could set SCHED_FLAG_KEEP_ALL | SCHED_FLAG_LATENCY_NICE
and be able to modify the nice value alone. This does not work since we skip
setting the latency nice value when SCHED_FLAG_KEEP_PARAMS is set. So to
change the nice value alone, we first have to do getattr() and modify the nice
value and pass it to setattr(). It is not a big deal. so I will leave it here.

> whereas, one thing we still can do is add if condition when setting the
> value, i.e.,
>
> @@ -4724,7 +4724,8 @@ static void __setscheduler_params(struct task_struct *p,
> p->normal_prio = normal_prio(p);
> set_load_weight(p, true);
>
> - p->latency_nice = attr->sched_latency_nice;
> + if (attr->sched_flags & SCHED_FLAG_LATENCY_NICE)
> + p->latency_nice = attr->sched_latency_nice;
> }
>

Yes, without this, we accidently override latency value when other attributes
are modified.

Thanks,
Pavan

--
Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.