Skip to content

Commit

Permalink
sparc64: Fix cpu_possible_mask if nr_cpus is set
Browse files Browse the repository at this point in the history
If kernel boot parameter nr_cpus is set, it should define the number
of CPUs that can ever be available in the system i.e.
cpu_possible_mask. setup_nr_cpu_ids() overrides the nr_cpu_ids based
on the cpu_possible_mask during kernel initialization. If
cpu_possible_mask is not set based on the nr_cpus value, earlier part
of the kernel would be initialized using nr_cpus value leading to a
kernel crash.

Set cpu_possible_mask based on nr_cpus value. Thus setup_nr_cpu_ids()
becomes redundant and does not corrupt nr_cpu_ids value.

Signed-off-by: Atish Patra <atish.patra@oracle.com>
Reviewed-by: Bob Picco <bob.picco@oracle.com>
Reviewed-by: Vijay Kumar <vijay.ac.kumar@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Atish Patra authored and David S. Miller committed Sep 28, 2016
1 parent 1e953d8 commit 9b2f753
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 0 deletions.
1 change: 1 addition & 0 deletions arch/sparc/include/asm/smp_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask);
int hard_smp_processor_id(void);
#define raw_smp_processor_id() (current_thread_info()->cpu)

void smp_fill_in_cpu_possible_map(void);
void smp_fill_in_sib_core_maps(void);
void cpu_play_dead(void);

Expand Down
1 change: 1 addition & 0 deletions arch/sparc/kernel/setup_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -650,6 +650,7 @@ void __init setup_arch(char **cmdline_p)

paging_init();
init_sparc64_elf_hwcap();
smp_fill_in_cpu_possible_map();
}

extern int stop_a_enabled;
Expand Down
14 changes: 14 additions & 0 deletions arch/sparc/kernel/smp_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -1227,6 +1227,20 @@ void __init smp_setup_processor_id(void)
xcall_deliver_impl = hypervisor_xcall_deliver;
}

void __init smp_fill_in_cpu_possible_map(void)
{
int possible_cpus = num_possible_cpus();
int i;

if (possible_cpus > nr_cpu_ids)
possible_cpus = nr_cpu_ids;

for (i = 0; i < possible_cpus; i++)
set_cpu_possible(i, true);
for (; i < NR_CPUS; i++)
set_cpu_possible(i, false);
}

void smp_fill_in_sib_core_maps(void)
{
unsigned int i;
Expand Down

0 comments on commit 9b2f753

Please sign in to comment.