[Toybox] more general sched_setattr/sched_getattr command?

Rob Landley rob at landley.net
Sat Dec 18 09:29:00 PST 2021


On 12/10/21 2:05 PM, enh wrote:
> On Fri, Dec 10, 2021 at 3:46 AM Rob Landley <rob at landley.net
>     Could you ask them what uclamp_validate() in kernel/sched/core.c is trying to
>     do? It seems like if you've set container limits for the largest or smallest
>     allowed uclamp values (like that wiki page was going on about). then it checks
>     THOSE instead of the ones provided by the user to see if they cross. Overwrites
>     the ones provided by the user entirely, and doesn't check them. So I THINK if I
>     set the container min limit to 1 and the container max limit to 1023, I could
>     then have a process within the container request a min of 1000 and a max of 100
>     and it would pass this function? (Or am I misreading it?)
> 
> i must be misreading it too, because i don't even know which lines you're
> referring to, unless we were looking at different versions...
> https://elixir.bootlin.com/linux/latest/source/kernel/sched/core.c#L1780

Yup, that part:

static int uclamp_validate(struct task_struct *p,
			   const struct sched_attr *attr)
{
	int util_min = p->uclamp_req[UCLAMP_MIN].value;
	int util_max = p->uclamp_req[UCLAMP_MAX].value;

	if (attr->sched_flags & SCHED_FLAG_UTIL_CLAMP_MIN) {
		util_min = attr->sched_util_min;

		if (util_min + 1 > SCHED_CAPACITY_SCALE + 1)
			return -EINVAL;
	}

	if (attr->sched_flags & SCHED_FLAG_UTIL_CLAMP_MAX) {
		util_max = attr->sched_util_max;

		if (util_max + 1 > SCHED_CAPACITY_SCALE + 1)
			return -EINVAL;
	}

	if (util_min != -1 && util_max != -1 && util_min > util_max)
		return -EINVAL;

See how util_min is set from uclamp_req at the start, but when
SCHED_FLAG_UTIL_CLAMP_MIN the local variable gets overwritten by the attr->
version, and there's only one util_min > util_max test?

If SCHED_FLAG_UTIIL_CLAMP_BLAH is set, the uclamp_req versions of sched_util_min
and sched_util_max are never examined by this function. Just fetched and then
overwritten.

I.E:

static int uclamp_validate(struct task_struct *p,
			   const struct sched_attr *attr)
{
	int util_min = p->uclamp_req[UCLAMP_MIN].value;

	if (attr->sched_flags & SCHED_FLAG_UTIL_CLAMP_MIN)
		util_min = attr->sched_util_min;

	if (test util_min)
		return -EINVAL;


Rob



More information about the Toybox mailing list