Messages in this thread | | | Date | Mon, 23 Jan 2012 10:52:43 +0530 | From | "Srivatsa S. Bhat" <> | Subject | Re: [PATCH] Avoid mask based num_possible_cpus and num_online_cpus |
| |
On 01/21/2012 05:25 AM, Venki Pallipadi wrote:
> On Fri, Jan 20, 2012 at 3:45 PM, KOSAKI Motohiro > <kosaki.motohiro@gmail.com> wrote: >>>>> +int nr_online_cpus __read_mostly; >>>>> +EXPORT_SYMBOL(nr_online_cpus); >>>>> + >>>>> void set_cpu_possible(unsigned int cpu, bool possible) >>>>> { >>>>> if (possible) >>>> >>>> >>>> Did you forget to add: >>>> >>>> nr_possible_cpus = cpumask_weight(cpu_possible_mask); >>>> >>>> inside set_cpu_possible() ? >>> >>> No. That was intentional as I have that coupled with nr_cpu_ids and >>> set once after all the bits are set in setup_nr_cpu_ids() instead of >>> doing for each bit set. >> >> But, Srivatsa's way seems more safer, no? Is there any advantage to make couple >> with nr_cpu_ids? > > I think it is a tradeoff between safer and cleaner :). infact, that's > how I had coded the patch first. But, then I changed it to be in sync > with nr_cpu_ids as it seemed a bit cleaner (and also to make sure 2048 > CPU guys won't come after me for doing the mask calculation 2048 times > during the boot). >
I knew you were trying to optimize further when I saw your patch. That's precisely the reason I cross-checked the code to ensure that the optimization didn't go beyond correctness :)
And this is what I found:
start_kernel() setup_nr_cpu_ids() // This is not the end of setting up cpu_possible_mask rest_init() kernel_init() smp_prepare_cpus();
And on x86, this becomes: native_smp_prepare_cpus(); smp_sanity_check(); // cpu_possible_mask & nr_cpu_ids can change here! ^^^^^^^^^
And there is another place where things can change: prefill_possible_map(). But this is called in setup_arch(), which is called before setup_nr_cpu_ids(). So we need not worry about this.
(Btw, I checked only the x86 arch. Not sure how other architectures handle things.)
Regards, Srivatsa S. Bhat IBM Linux Technology Center
| |