cpuset: fix regression when failed to generate sched domains
PATCH 1/1 cpuset: fix regression when failed to generate sched domains
When cpuset failed to generate sched domains due to kmalloc() failure, the scheduler should fallback to the single partition 'fallback_doms' and rebuild sched domains, but now it only destroys but not rebuilds sched domains.
The regression is introduced by:
commit dfb512ec4834116124da61d6c1ee10fd0aa32bd6
Author: Max Krasnyansky <[email protected]> Date: Fri Aug 29 13:11:41 2008 -0700
sched: arch_reinit_sched_domains() must destroy domains to force rebuild
After the above commit, partition_sched_domains(0, NULL, NULL) will only destroy sched domains and partition_sched_domains(1, NULL, NULL) will create the default sched domain.
---
Should I also CC stable for 2.6.27.xx ?
--- kernel/cpuset.c | 12 ++++++++---- kernel/sched.c | 13 +++++++------ 2 files changed, 15 insertions(+), 10 deletions(-)
kernel/cpuset.c +8 -4
@@ -587,7 +587,6 @@ static int generate_sched_domains(cpumask_t **domains,int ndoms;/* number of sched domains in result */ int nslot;/* next empty doms[] cpumask_t slot */ - ndoms =0 ; doms =NULL ; dattr =NULL ; csa =NULL ;
@@ -674,10 +673,8 @@ restart:* Convert <csn, csa> to <ndoms, doms> and populate cpu masks. */ doms =kmalloc (ndoms *sizeof (cpumask_t),GFP_KERNEL ); -if (!doms) { - ndoms =0 ; +if (!doms) goto done; - }/* * The rest of the code, including the scheduler, can deal with
@@ -732,6 +729,13 @@ restart: done:kfree (csa); +/* +* Fallback to the default domain if kmalloc() failed. +* See comments in partition_sched_domains(). +*/ +if (doms ==NULL ) + ndoms =1 ; + *domains = doms; *attributes = dattr;return ndoms;
kernel/sched.c +7 -6
@@ -7789,13 +7789,14 @@ static int dattrs_equal(struct sched_domain_attr *cur, int idx_cur,* * The passed in 'doms_new' should be kmalloc'd. This routine takes * ownership of it and will kfree it when done with it. If the caller -* failed the kmalloc call, then it can pass in doms_new == NULL, -* and partition_sched_domains() will fallback to the single partition -* 'fallback_doms', it also forces the domains to be rebuilt. +* failed the kmalloc call, then it can pass in doms_new == NULL && +* ndoms_new == 1, and partition_sched_domains() will fallback to +* the single partition 'fallback_doms', it also forces the domains +* to be rebuilt. * -* If doms_new==NULL it will be replaced with cpu_online_map. -* ndoms_new==0 is a special case for destroying existing domains. -* It will not create the default domain. +* If doms_new == NULL it will be replaced with cpu_online_map. +* ndoms_new == 0 is a special case for destroying existing domains, +* and it will not create the default domain. * * Call with hotplug lock held */
Signature · 1 line
1.5.4.rc3
Ingo Molnar
AppliedQuoted 11 lines · Li Zefan
When cpuset failed to generate sched domains due to
kmalloc()failure, the scheduler should fallback to the single partition 'fallback_doms' and rebuild sched domains, but now it only destroys but not rebuilds sched domains.The regression is introduced by:
commit
dfb512ec4834116124da61d6c1ee10fd0aa32bd6Author: Max Krasnyansky <[email protected]> Date: Fri Aug 29 13:11:41 2008 -0700
Quoted 7 lines
sched:
arch_reinit_sched_domains()must destroy domains to force rebuildAfter the above commit,
partition_sched_domains(0, NULL, NULL)will only destroy sched domains andpartition_sched_domains(1, NULL, NULL)will create the default sched domain.Signed-off-by Li Zefan <[email protected]>
applied to tip/sched/urgent, thanks!
Quoted 1 line
Should I also CC stable for 2.6.27.xx ?
i've added a Cc: stable to the commit - that will trigger a -stable backport.
Ingo
Quoted 11 lines · Li Zefan
When cpuset failed to generate sched domains due to
kmalloc()failure, the scheduler should fallback to the single partition 'fallback_doms' and rebuild sched domains, but now it only destroys but not rebuilds sched domains.The regression is introduced by:
commit
dfb512ec4834116124da61d6c1ee10fd0aa32bd6Author: Max Krasnyansky <[email protected]> Date: Fri Aug 29 13:11:41 2008 -0700
Quoted 7 lines
sched:
arch_reinit_sched_domains()must destroy domains to force rebuildAfter the above commit,
partition_sched_domains(0, NULL, NULL)will only destroy sched domains andpartition_sched_domains(1, NULL, NULL)will create the default sched domain.Signed-off-by Li Zefan <[email protected]>
Looks good to me. Thanx for the fix.
Max
Quoted 72 lines
---
Should I also CC stable for 2.6.27.xx ?
--- kernel/cpuset.c | 12 ++++++++---- kernel/sched.c | 13 +++++++------ 2 files changed, 15 insertions(+), 10 deletions(-)kernel/cpuset.c +8
-4@@ -587,7 +587,6 @@ static int generate_sched_domains(cpumask_t **domains,int ndoms;/* number of sched domains in result */ int nslot;/* next empty doms[] cpumask_t slot */ - ndoms =0 ; doms =NULL ; dattr =NULL ; csa =NULL ;@@ -674,10 +673,8 @@ restart:* Convert <csn, csa> to <ndoms, doms> and populate cpu masks. */ doms =kmalloc (ndoms *sizeof (cpumask_t),GFP_KERNEL ); -if (!doms) { - ndoms =0 ; +if (!doms) goto done; - }/* * The rest of the code, including the scheduler, can deal with @@ -732,6 +729,13 @@ restart: done:kfree (csa); +/* +* Fallback to the default domain if kmalloc() failed. +* See comments in partition_sched_domains(). +*/ +if (doms ==NULL ) + ndoms =1 ; + *domains = doms; *attributes = dattr;return ndoms;kernel/sched.c +7
-6@@ -7789,13 +7789,14 @@ static int dattrs_equal(struct sched_domain_attr *cur, int idx_cur,* * The passed in 'doms_new' should be kmalloc'd. This routine takes * ownership of it and will kfree it when done with it. If the caller -* failed the kmalloc call, then it can pass in doms_new == NULL, -* and partition_sched_domains() will fallback to the single partition -* 'fallback_doms', it also forces the domains to be rebuilt. +* failed the kmalloc call, then it can pass in doms_new == NULL && +* ndoms_new == 1, and partition_sched_domains() will fallback to +* the single partition 'fallback_doms', it also forces the domains +* to be rebuilt. * -* If doms_new==NULL it will be replaced with cpu_online_map. -* ndoms_new==0 is a special case for destroying existing domains. -* It will not create the default domain. +* If doms_new == NULL it will be replaced with cpu_online_map. +* ndoms_new == 0 is a special case for destroying existing domains, +* and it will not create the default domain. * * Call with hotplug lock held */