Thread (9 messages) 9 messages, 4 authors, 2008-07-18

Re: [PATCH 01/14] Introduce cpu_enabled_map and friends

From: Russell King <hidden>
Date: 2008-07-18 21:56:14
Also in: linux-acpi, lkml

On Tue, Jul 15, 2008 at 01:15:15PM -0600, Alex Chiang wrote:
quoted hunk ↗ jump to hunk
* Russell King [off-list ref]:
quoted
On Tue, Jul 15, 2008 at 12:16:32PM -0600, Matthew Wilcox wrote:
quoted
On Tue, Jul 15, 2008 at 11:57:40AM -0600, Alex Chiang wrote:
quoted
My thought was that big SMP systems like ia64, possibly sparc and
ppc, and increasingly, x86, might find something like this
useful, as systems get larger and larger, and vendors are going
to want to do RAS-ish features, like the ability to keep CPUs in
firmware across reboots until told otherwise by the sysadmin.

Right now, a 'present' CPU strongly implies 'online' as well,
since we're calling cpu_up() for all 'present' CPUs in
smp_init(). But this hurts if:

	- you don't actually want to bring up all 'present' CPUs
	- you still want to interact with these weirdo zombie
	  CPUs that are 'present' but not 'online'
Have you considered simply failing __cpu_up() for CPUs that are
deconfigured by firmware?
But what if you want to have a system boot with, say, 4 CPUs and
then decide at run time to bring up another 4 CPUs when required?

How about having smp_init() call into arch code to query whether
it should bring up a not-already-online CPU?  Architectures that
want to do something special can then make the decision there and
everyone else can define the test completely away.
So this is exactly what I'm doing. The ia64 patch has this hunk:
@@ -820,6 +824,9 @@ __cpu_up (unsigned int cpu)
        if (cpu_isset(cpu, cpu_callin_map))
                return -EINVAL;

+       if (!cpu_isset(cpu, cpu_enabled_map))
+               return -EINVAL;
+
        per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
        /* Processor goes to start_secondary(), sets online flag */
        ret = do_boot_cpu(sapicid, cpu);
That was the easiest, most-straightforward solution I could think
of. If you have an idea for a version with lower taxes (doesn't
touch all the archs or can be #define'd out), I'm happy to hear
it.
I think I did make a suggestion in the bit you quote from me above.

Let me be more explicit:

static void __init smp_init(void)
{
        unsigned int cpu;

        /* FIXME: This should be done in userspace --RR */
        for_each_present_cpu(cpu) {
                if (num_online_cpus() >= setup_max_cpus)
                        break;
-		if (!cpu_online(cpu))
+		if (smp_cpu_enabled(cpu) && !cpu_online(cpu))
                        cpu_up(cpu);
        }

        /* Any cleanup work */
        printk(KERN_INFO "Brought up %ld CPUs\n", (long)num_online_cpus());
        smp_cpus_done(setup_max_cpus);
}

and have architectures provide 'smp_cpu_enabled(cpu)' which can either
be a function, inline function or a macro (and therefore possible to be
completely eliminated.)

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help