lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 16 Aug 2017 15:20:42 -0600 From: Mathieu Poirier <mathieu.poirier@...aro.org> To: mingo@...hat.com, peterz@...radead.org Cc: tj@...nel.org, vbabka@...e.cz, lizefan@...wei.com, akpm@...ux-foundation.org, weiyongjun1@...wei.com, juri.lelli@....com, rostedt@...dmis.org, claudio@...dence.eu.com, luca.abeni@...tannapisa.it, bristot@...hat.com, linux-kernel@...r.kernel.org, mathieu.poirier@...aro.org Subject: [PATCH 6/7] cgroup: Constrain the addition of CPUs to a new CPUset Care must be taken when CPUs are added to a new CPUset. If an ancestor of that set has its sched_load_balance flag switch off then the CPUs in the new CPUset will be added to a new root domain. If the ancestor also had DL tasks those will end up covering more than one root domain, breaking at the same time the DL integrity model. This patch prevents adding CPUs to a new CPUset if one of its ancestor had its sched_load_balance flag off and had DL tasks assigned to it. Signed-off-by: Mathieu Poirier <mathieu.poirier@...aro.org> --- kernel/cgroup/cpuset.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index 8d2ba5591dfb..fb38feaf3fda 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -530,6 +530,28 @@ static int validate_dl_change(struct cpuset *cur, struct cpuset *trial) goto out; } + /* + * CPUs are being added to a CPUset. If any parent of @trial has its + * sched_load_balance flag switched off this operation will create a + * new root domain spanning trailcs->cpus_allowed. At the same time + * if any parent of @trial has a DL task, that task will end up + * spanning more than one root domain. + */ + if (cpumask_empty(cur->cpus_allowed) && + !cpumask_empty(trial->cpus_allowed)) { + struct cpuset *parent; + + parent = parent_cs(trial); + /* Go up until we reach the top_cpuset */ + while (parent) { + if (cpuset_has_dl_tasks(parent) && + !is_sched_load_balance(parent)) + goto out; + + parent = parent_cs(parent); + } + } + ret = 0; out: return ret; -- 2.7.4
Powered by blists - more mailing lists