Messages in this thread | | | Date | Tue, 18 Oct 2022 09:16:48 -0700 | From | Yury Norov <> | Subject | Re: [PATCH v2 5/5] lib/cpumask: add FORCE_NR_CPUS config option |
| |
On Tue, Oct 18, 2022 at 05:15:41PM +0200, Geert Uytterhoeven wrote: > Hi Yuri, > > On Tue, Oct 18, 2022 at 5:01 PM Yury Norov <yury.norov@gmail.com> wrote: > > On Tue, Oct 18, 2022 at 05:44:09PM +0300, Andy Shevchenko wrote: > > > On Tue, Oct 18, 2022 at 07:35:09AM -0700, Yury Norov wrote: > > > > On Tue, Oct 18, 2022 at 03:50:31PM +0200, Geert Uytterhoeven wrote: > > > > > > ... > > > > > > > For those who choose FORCE_NR_CPUS, it's required to set NR_CPUS > > > > to a value that matches to what's parsed from DT.
...
> I haven't tried the patch from your other email yet, but I did try > CONFIG_NR_CPUS=4 and CONFIG_FORCE_NR_CPUS=y on > Icicle earlier today. > > There was no warning, as the number of CPUs did match, but the > fourth CPU (cpu@4, i.e. the fifth core in DT) failed to come online: > > CPU3: failed to come online > smp: Brought up 1 node, 3 CPUs > > BTW, it behaves the same with CONFIG_FORCE_NR_CPUS=n. > Increasing CONFIG_NR_CPUS (before I used 8) makes the fourth > CPU core come online again.
The problem is seemingly unrelated to CONFIG_FORCE_NR_CPUS... If so, we don't need ARCH_UNFORCE_NR_CPUS. Is that right?
This all looks weird. RISCV hasn't an arch code to setup nr_cpu_ids, and therefore should use generic setup_nr_cpu_ids(), which is:
void __init setup_nr_cpu_ids(void) { set_nr_cpu_ids(find_last_bit(cpumask_bits(cpu_possible_mask), NR_CPUS) + 1); }
Where:
static inline void set_nr_cpu_ids(unsigned int nr) { #if (NR_CPUS == 1) || defined(CONFIG_FORCE_NR_CPUS) WARN_ON(nr != nr_cpu_ids); #else nr_cpu_ids = nr; #endif }
As you can see, at this point cpu_possible_mask is initialized based on DT, and even if arch has non-dense cpu_possible_mask, the logic should still be correct.
Wish I could tell more, if I had an access to the hardware...
Thanks, Yury
| |