Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

[PATCH] s390: smp initialization speed

The last changes that introduced the additional_cpus command line parameter
also introduced a regression regarding smp initialization speed. In
smp_setup_cpu_possible_map() cpu_present_map is set to the same value as
cpu_possible_map. Especially that means that bits in the present map will be
set for cpus that are not present. This will cause a slow down in the initial
cpu_up() loop in smp_init() since trying to take cpus online that aren't
present takes a while.

Fix this by setting only bits for present cpus in cpu_present_map and set
cpu_present_map to cpu_possible_map in smp_cpus_done().

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Heiko Carstens and committed by
Linus Torvalds
54330456 37a33026

+10 -5
+10 -5
arch/s390/kernel/smp.c
··· 677 677 678 678 void __init smp_setup_cpu_possible_map(void) 679 679 { 680 - unsigned int pcpus, cpu; 680 + unsigned int phy_cpus, pos_cpus, cpu; 681 681 682 - pcpus = min(smp_count_cpus() + additional_cpus, (unsigned int) NR_CPUS); 682 + phy_cpus = smp_count_cpus(); 683 + pos_cpus = min(phy_cpus + additional_cpus, (unsigned int) NR_CPUS); 683 684 684 685 if (possible_cpus) 685 - pcpus = min(possible_cpus, (unsigned int) NR_CPUS); 686 + pos_cpus = min(possible_cpus, (unsigned int) NR_CPUS); 686 687 687 - for (cpu = 0; cpu < pcpus; cpu++) 688 + for (cpu = 0; cpu < pos_cpus; cpu++) 688 689 cpu_set(cpu, cpu_possible_map); 689 690 690 - cpu_present_map = cpu_possible_map; 691 + phy_cpus = min(phy_cpus, pos_cpus); 692 + 693 + for (cpu = 0; cpu < phy_cpus; cpu++) 694 + cpu_set(cpu, cpu_present_map); 691 695 } 692 696 693 697 #ifdef CONFIG_HOTPLUG_CPU ··· 847 843 848 844 void smp_cpus_done(unsigned int max_cpus) 849 845 { 846 + cpu_present_map = cpu_possible_map; 850 847 } 851 848 852 849 /*