On 12/01/2021 16:53, Daniel Bristot de Oliveira wrote: [...] > ----- %< ----- > #!/bin/bash > # Enter on the cgroup directory > cd /sys/fs/cgroup/ > > # Check it if is cgroup v2 and enable cpuset > if [ -e cgroup.subtree_control ]; then > # Enable cpuset controller on cgroup v2 > echo +cpuset > cgroup.subtree_control > fi > > echo LOG: create an exclusive cpuset and assigned the CPU 0 to it > # Create cpuset groups > rmdir dl-group &> /dev/null > mkdir dl-group > > # Restrict the task to the CPU 0 > echo 0 > dl-group/cpuset.mems > echo 0 > dl-group/cpuset.cpus > echo root > dl-group/cpuset.cpus.partition > > echo LOG: dispatching a regular task > sleep 100 & > CPUSET_PID="$!" > > # let it settle down > sleep 1 > > # Assign the second task to the cgroup There is only one task 'CPUSET_PID' involved here? > echo LOG: moving the second DL task to the cpuset > echo "$CPUSET_PID" > dl-group/cgroup.procs 2> /dev/null > > CPUSET_ALLOWED=`cat /proc/$CPUSET_PID/status | grep Cpus_allowed_list | awk '{print $2}'` > > chrt -p -d --sched-period 1000000000 --sched-runtime 100000000 0 $CPUSET_PID > ACCEPTED=$? > > if [ $ACCEPTED == 0 ]; then > echo PASS: the task became DL > else > echo FAIL: the task was rejected as DL > fi [...] > diff --git a/kernel/sched/core.c b/kernel/sched/core.c > index 5961a97541c2..3c2775e6869f 100644 > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -5905,15 +5905,15 @@ static int __sched_setscheduler(struct task_struct *p, > #ifdef CONFIG_SMP > if (dl_bandwidth_enabled() && dl_policy(policy) && > !(attr->sched_flags & SCHED_FLAG_SUGOV)) { > - cpumask_t *span = rq->rd->span; > + struct root_domain *rd = dl_task_rd(p); > > /* > * Don't allow tasks with an affinity mask smaller than > * the entire root_domain to become SCHED_DEADLINE. We > * will also fail if there's no bandwidth available. > */ > - if (!cpumask_subset(span, p->cpus_ptr) || > - rq->rd->dl_bw.bw == 0) { > + if (!cpumask_subset(rd->span, p->cpus_ptr) || > + rd->dl_bw.bw == 0) { > retval = -EPERM; > goto unlock; > } > diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c > index c221e14d5b86..1f6264cb8867 100644 > --- a/kernel/sched/deadline.c > +++ b/kernel/sched/deadline.c > @@ -2678,8 +2678,8 @@ int sched_dl_overflow(struct task_struct *p, int policy, > u64 period = attr->sched_period ?: attr->sched_deadline; > u64 runtime = attr->sched_runtime; > u64 new_bw = dl_policy(policy) ? to_ratio(period, runtime) : 0; > - int cpus, err = -1, cpu = task_cpu(p); > - struct dl_bw *dl_b = dl_bw_of(cpu); > + int cpus, err = -1, cpu = dl_task_cpu(p); > + struct dl_bw *dl_b = dl_task_root_bw(p); > unsigned long cap; > > if (attr->sched_flags & SCHED_FLAG_SUGOV) > Wouldn't it be sufficient to just introduce dl_task_cpu() and use the correct cpu to get rd->span or struct dl_bw in __sched_setscheduler() -> sched_dl_overflow()? diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 5961a97541c2..0573f676696a 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -5905,7 +5905,8 @@ static int __sched_setscheduler(struct task_struct *p, #ifdef CONFIG_SMP if (dl_bandwidth_enabled() && dl_policy(policy) && !(attr->sched_flags & SCHED_FLAG_SUGOV)) { - cpumask_t *span = rq->rd->span; + int cpu = dl_task_cpu(p); + cpumask_t *span = cpu_rq(cpu)->rd->span; /* * Don't allow tasks with an affinity mask smaller than diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index c221e14d5b86..308ecaaf3d28 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c @@ -2678,7 +2678,7 @@ int sched_dl_overflow(struct task_struct *p, int policy, u64 period = attr->sched_period ?: attr->sched_deadline; u64 runtime = attr->sched_runtime; u64 new_bw = dl_policy(policy) ? to_ratio(period, runtime) : 0; - int cpus, err = -1, cpu = task_cpu(p); + int cpus, err = -1, cpu = dl_task_cpu(p); struct dl_bw *dl_b = dl_bw_of(cpu); unsigned long cap;