| From 8295c69925ad53ec32ca54ac9fc194ff21bc40e2 Mon Sep 17 00:00:00 2001 |
| From: Xunlei Pang <xlpang@redhat.com> |
| Date: Wed, 2 Dec 2015 19:52:59 +0800 |
| Subject: sched/core: Clear the root_domain cpumasks in init_rootdomain() |
| |
| commit 8295c69925ad53ec32ca54ac9fc194ff21bc40e2 upstream. |
| |
| root_domain::rto_mask allocated through alloc_cpumask_var() |
| contains garbage data, this may cause problems. For instance, |
| When doing pull_rt_task(), it may do useless iterations if |
| rto_mask retains some extra garbage bits. Worse still, this |
| violates the isolated domain rule for clustered scheduling |
| using cpuset, because the tasks(with all the cpus allowed) |
| belongs to one root domain can be pulled away into another |
| root domain. |
| |
| The patch cleans the garbage by using zalloc_cpumask_var() |
| instead of alloc_cpumask_var() for root_domain::rto_mask |
| allocation, thereby addressing the issues. |
| |
| Do the same thing for root_domain's other cpumask memembers: |
| dlo_mask, span, and online. |
| |
| Signed-off-by: Xunlei Pang <xlpang@redhat.com> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Mike Galbraith <efault@gmx.de> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Steven Rostedt <rostedt@goodmis.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Link: http://lkml.kernel.org/r/1449057179-29321-1-git-send-email-xlpang@redhat.com |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| [lizf: there's no rd->dlo_mask, so remove the change to it] |
| Signed-off-by: Zefan Li <lizefan@huawei.com> |
| --- |
| kernel/sched/core.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/kernel/sched/core.c |
| +++ b/kernel/sched/core.c |
| @@ -5931,11 +5931,11 @@ static int init_rootdomain(struct root_d |
| { |
| memset(rd, 0, sizeof(*rd)); |
| |
| - if (!alloc_cpumask_var(&rd->span, GFP_KERNEL)) |
| + if (!zalloc_cpumask_var(&rd->span, GFP_KERNEL)) |
| goto out; |
| - if (!alloc_cpumask_var(&rd->online, GFP_KERNEL)) |
| + if (!zalloc_cpumask_var(&rd->online, GFP_KERNEL)) |
| goto free_span; |
| - if (!alloc_cpumask_var(&rd->rto_mask, GFP_KERNEL)) |
| + if (!zalloc_cpumask_var(&rd->rto_mask, GFP_KERNEL)) |
| goto free_online; |
| |
| if (cpupri_init(&rd->cpupri) != 0) |