@@ -49,6 +49,9 @@ extern unsigned int debug_smp_processor_id(void); /* from linux/smp.h */
#define get_lppaca() (get_paca()->lppaca_ptr)
#define get_slb_shadow() (get_paca()->slb_shadow_ptr)
+/* Maximum number of threads per core. */
+#define MAX_SMT 8
+
struct task_struct;
/*
@@ -209,6 +209,7 @@ void __init allocate_pacas(void)
{
u64 limit;
int cpu;
+ unsigned int nr_cpus_aligned;
#ifdef CONFIG_PPC_BOOK3S_64
/*
@@ -220,20 +221,28 @@ void __init allocate_pacas(void)
limit = ppc64_rma_size;
#endif
- paca_size = PAGE_ALIGN(sizeof(struct paca_struct) * nr_cpu_ids);
+ /*
+ * Alloc the paca[] align up to SMT threads.
+ * This will help us to prepare for a situation where
+ * boot cpu id > nr_cpus.
+ * We keep the semantics of nr_cpus in kernel cmdline, but
+ * waste a bit memory
+ */
+ nr_cpus_aligned = _ALIGN_UP(nr_cpu_ids, MAX_SMT);
+ paca_size = PAGE_ALIGN(sizeof(struct paca_struct) * nr_cpus_aligned);
paca = __va(memblock_alloc_base(paca_size, PAGE_SIZE, limit));
memset(paca, 0, paca_size);
printk(KERN_DEBUG "Allocated %u bytes for %u pacas at %p\n",
- paca_size, nr_cpu_ids, paca);
+ paca_size, nr_cpus_aligned, paca);
- allocate_lppacas(nr_cpu_ids, limit);
+ allocate_lppacas(nr_cpus_aligned, limit);
- allocate_slb_shadows(nr_cpu_ids, limit);
+ allocate_slb_shadows(nr_cpus_aligned, limit);
/* Can't use for_each_*_cpu, as they aren't functional yet */
- for (cpu = 0; cpu < nr_cpu_ids; cpu++)
+ for (cpu = 0; cpu < nr_cpus_aligned; cpu++)
initialise_paca(&paca[cpu], cpu);
}