Index: Makefile =================================================================== RCS file: /var/cvs/linux-2.6/Makefile,v retrieving revision 1.162 diff -u -p -r1.162 Makefile --- a/Makefile 31 Mar 2004 16:17:23 -0000 1.162 +++ b/Makefile 1 Apr 2004 18:05:33 -0000 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 5 -EXTRAVERSION =-rc3-pa3 +EXTRAVERSION =-rc3-SMP NAME=Feisty Dunnart # *DOCUMENTATION* Index: arch/parisc/kernel/pdc_cons.c =================================================================== RCS file: /var/cvs/linux-2.6/arch/parisc/kernel/pdc_cons.c,v retrieving revision 1.6 diff -u -p -r1.6 pdc_cons.c --- a/arch/parisc/kernel/pdc_cons.c 19 Jan 2004 05:15:47 -0000 1.6 +++ b/arch/parisc/kernel/pdc_cons.c 1 Apr 2004 18:05:36 -0000 @@ -41,7 +41,7 @@ /* Define EARLY_BOOTUP_DEBUG to debug kernel related boot problems. * On production kernels EARLY_BOOTUP_DEBUG should be undefined. */ -#undef EARLY_BOOTUP_DEBUG +#define EARLY_BOOTUP_DEBUG #include Index: arch/parisc/kernel/processor.c =================================================================== RCS file: /var/cvs/linux-2.6/arch/parisc/kernel/processor.c,v retrieving revision 1.3 diff -u -p -r1.3 processor.c --- a/arch/parisc/kernel/processor.c 18 Oct 2003 01:01:12 -0000 1.3 +++ b/arch/parisc/kernel/processor.c 1 Apr 2004 18:05:36 -0000 @@ -204,36 +204,36 @@ void __init collect_boot_cpu_data(void) /* get CPU-Model Information... */ #define p ((unsigned long *)&boot_cpu_data.pdc.model) - if (pdc_model_info(&boot_cpu_data.pdc.model) == PDC_OK) - printk(KERN_INFO - "model %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", + if (pdc_model_info(&boot_cpu_data.pdc.model) != PDC_OK) + printk(KERN_INFO "Model_info Failed! %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8]); #undef p - if (pdc_model_versions(&boot_cpu_data.pdc.versions, 0) == PDC_OK) - printk(KERN_INFO "vers %08lx\n", + if (pdc_model_versions(&boot_cpu_data.pdc.versions, 0) != PDC_OK) + printk(KERN_INFO "pdc_model_versions() failed %08lx\n", boot_cpu_data.pdc.versions); + printk(KERN_INFO); if (pdc_model_cpuid(&boot_cpu_data.pdc.cpuid) == PDC_OK) - printk(KERN_INFO "CPUID vers %ld rev %ld (0x%08lx)\n", + printk("CPUID vers %ld rev %ld (0x%08lx)", (boot_cpu_data.pdc.cpuid >> 5) & 127, boot_cpu_data.pdc.cpuid & 31, boot_cpu_data.pdc.cpuid); if (pdc_model_capabilities(&boot_cpu_data.pdc.capabilities) == PDC_OK) - printk(KERN_INFO "capabilities 0x%lx\n", + printk(" Cap 0x%lx", boot_cpu_data.pdc.capabilities); if (pdc_model_sysmodel(boot_cpu_data.pdc.sys_model_name) == PDC_OK) - printk(KERN_INFO "model %s\n", + printk(" SysModel %s", boot_cpu_data.pdc.sys_model_name); + printk("\n"); + boot_cpu_data.hversion = boot_cpu_data.pdc.model.hversion; boot_cpu_data.sversion = boot_cpu_data.pdc.model.sversion; - boot_cpu_data.cpu_type = - parisc_get_cpu_type(boot_cpu_data.hversion); - + boot_cpu_data.cpu_type = parisc_get_cpu_type(boot_cpu_data.hversion); boot_cpu_data.cpu_name = cpu_name_version[boot_cpu_data.cpu_type][0]; boot_cpu_data.family_name = cpu_name_version[boot_cpu_data.cpu_type][1]; } Index: arch/parisc/kernel/smp.c =================================================================== RCS file: /var/cvs/linux-2.6/arch/parisc/kernel/smp.c,v retrieving revision 1.6 diff -u -p -r1.6 smp.c --- a/arch/parisc/kernel/smp.c 16 Mar 2004 15:39:55 -0000 1.6 +++ b/arch/parisc/kernel/smp.c 1 Apr 2004 18:05:36 -0000 @@ -3,7 +3,7 @@ ** ** Copyright (C) 1999 Walt Drummond ** Copyright (C) 1999 David Mosberger-Tang -** Copyright (C) 2001 Grant Grundler +** Copyright (C) 2001,2004 Grant Grundler ** ** Lots of stuff stolen from arch/alpha/kernel/smp.c ** ...and then parisc stole from arch/ia64/kernel/smp.c. Thanks David! :^) @@ -60,20 +60,16 @@ spinlock_t smp_lock = SPIN_LOCK_UNLOCKED volatile struct task_struct *smp_init_current_idle_task; -static volatile int smp_commenced = 0; /* Set when the idlers are all forked */ -static volatile int cpu_now_booting = 0; /* track which CPU is booting */ -cpumask_t cpu_online_map = CPU_MASK_NONE; /* Bitmap of online CPUs */ -#define IS_LOGGED_IN(cpunum) (cpu_isset(cpunum, cpu_online_map)) +static volatile int cpu_now_booting = 0; /* track which CPU is booting */ +static int parisc_max_cpus = -1; /* Command line */ -EXPORT_SYMBOL(cpu_online_map); +unsigned long cache_decay_ticks; /* declared by include/linux/sched.h */ +cpumask_t cpu_online_map = CPU_MASK_NONE; /* Bitmap of online CPUs */ +cpumask_t cpu_possible_map = CPU_MASK_NONE; /* Bitmap of Present CPUs */ -int smp_num_cpus = 1; -int smp_threads_ready = 0; -unsigned long cache_decay_ticks; -static int max_cpus = -1; /* Command line */ -cpumask_t cpu_present_mask; +EXPORT_SYMBOL(cpu_online_map); +EXPORT_SYMBOL(cpu_possible_map); -EXPORT_SYMBOL(cpu_present_mask); struct smp_call_struct { void (*func) (void *info); @@ -114,7 +110,7 @@ ipi_init(int cpuid) #error verify IRQ_OFFSET(IPI_IRQ) is ipi_interrupt() in new IRQ region - if(IS_LOGGED_IN(cpuid) ) + if(cpu_online(cpuid) ) { switch_to_idle_task(current); } @@ -293,12 +289,13 @@ send_IPI_allbutself(enum ipi_message_typ { int i; - for (i = 0; i < smp_num_cpus; i++) { - if (i != smp_processor_id()) + for (i = 0; i < parisc_max_cpus; i++) { + if (cpu_online(i) && i != smp_processor_id()) send_IPI_single(i, op); } } + inline void smp_send_stop(void) { send_IPI_allbutself(IPI_CPU_STOP); } @@ -331,8 +328,8 @@ smp_call_function (void (*func) (void *i data.func = func; data.info = info; data.wait = wait; - atomic_set(&data.unstarted_count, smp_num_cpus - 1); - atomic_set(&data.unfinished_count, smp_num_cpus - 1); + atomic_set(&data.unstarted_count, num_online_cpus() - 1); + atomic_set(&data.unfinished_count, num_online_cpus() - 1); if (retry) { spin_lock (&lock); @@ -392,7 +389,7 @@ EXPORT_SYMBOL(smp_call_function); static int __init nosmp(char *str) { - max_cpus = 0; + parisc_max_cpus = 0; return 1; } @@ -400,7 +397,7 @@ __setup("nosmp", nosmp); static int __init maxcpus(char *str) { - get_option(&str, &max_cpus); + get_option(&str, &parisc_max_cpus); return 1; } @@ -496,17 +493,13 @@ void __init smp_callin(void) local_irq_enable(); /* Interrupts have been off until now */ - /* Slaves wait here until Big Poppa daddy say "jump" */ - mb(); /* PARANOID */ - while (!smp_commenced) ; - mb(); /* PARANOID */ - cpu_idle(); /* Wait for timer to schedule some work */ /* NOTREACHED */ panic("smp_callin() AAAAaaaaahhhh....\n"); } +#if 0 /* * Create the idle task for a new Slave CPU. DO NOT use kernel_thread() * because that could end up calling schedule(). If it did, the new idle @@ -528,7 +521,7 @@ static struct task_struct *fork_by_hand( /* * Bring one cpu online. */ -static int __init smp_boot_one_cpu(int cpuid, int cpunum) +int __init smp_boot_one_cpu(int cpuid, int cpunum) { struct task_struct *idle; long timeout; @@ -573,12 +566,11 @@ static int __init smp_boot_one_cpu(int c /* * OK, wait a bit for that CPU to finish staggering about. - * Slave will set a bit when it reaches smp_cpu_init() and then - * wait for smp_commenced to be 1. - * Once we see the bit change, we can move on. + * Slave will set a bit when it reaches smp_cpu_init(). + * Once the "monarch CPU" sees the bit change, it can move on. */ for (timeout = 0; timeout < 10000; timeout++) { - if(IS_LOGGED_IN(cpunum)) { + if(cpu_online(cpunum)) { /* Which implies Slave has started up */ cpu_now_booting = 0; smp_init_current_idle_task = NULL; @@ -605,120 +597,56 @@ alive: #endif return 0; } +#endif - - -/* -** inventory.c:do_inventory() has already 'discovered' the additional CPU's. -** We are ready to wrest them from PDC's control now. -** Called by smp_init bring all the secondaries online and hold them. -** -** o Setup of the IPI irq handler is done in irq.c. -** o MEM_RENDEZ is initialzed in head.S:stext() -** -*/ -void __init smp_boot_cpus(void) +void __devinit smp_prepare_boot_cpu(void) { - int i, cpu_count = 1; - unsigned long bogosum = cpu_data[0].loops_per_jiffy; /* Count Monarch */ - - /* REVISIT - assumes first CPU reported by PAT PDC is BSP */ int bootstrap_processor=cpu_data[0].cpuid; /* CPU ID of BSP */ +#ifdef ENTRY_SYS_CPUS + cpu_data[0].state = STATE_RUNNING; +#endif + /* Setup BSP mappings */ printk(KERN_DEBUG "SMP: bootstrap CPU ID is %d\n",bootstrap_processor); init_task.thread_info->cpu = bootstrap_processor; current->thread_info->cpu = bootstrap_processor; - /* Mark Boostrap processor as present */ - cpu_online_map = cpumask_of_cpu(bootstrap_processor); - current->active_mm = &init_mm; -#ifdef ENTRY_SYS_CPUS - cpu_data[0].state = STATE_RUNNING; -#endif - cpu_present_mask = cpumask_of_cpu(bootstrap_processor); + cpu_set(bootstrap_processor, cpu_online_map); + cpu_set(bootstrap_processor, cpu_possible_map); - /* Nothing to do when told not to. */ - if (max_cpus == 0) { - printk(KERN_INFO "SMP mode deactivated.\n"); - return; - } - - if (max_cpus != -1) - printk(KERN_INFO "Limiting CPUs to %d\n", max_cpus); + /* Mark Boostrap processor as present */ + current->active_mm = &init_mm; - /* We found more than one CPU.... */ - if (boot_cpu_data.cpu_count > 1) { + cache_decay_ticks = HZ/100; /* FIXME very rough. */ +} - for (i = 0; i < NR_CPUS; i++) { - if (cpu_data[i].cpuid == NO_PROC_ID || - cpu_data[i].cpuid == bootstrap_processor) - continue; - if (smp_boot_one_cpu(cpu_data[i].cpuid, cpu_count) < 0) - continue; - bogosum += cpu_data[i].loops_per_jiffy; - cpu_count++; /* Count good CPUs only... */ - - cpu_present_mask |= 1UL << i; - - /* Bail when we've started as many CPUS as told to */ - if (cpu_count == max_cpus) - break; - } - } - if (cpu_count == 1) { - printk(KERN_INFO "SMP: Bootstrap processor only.\n"); - } +/* +** inventory.c:do_inventory() hasn't yet been run and thus we +** don't 'discover' the additional CPU's until later. +*/ +void __init smp_prepare_cpus(unsigned int max_cpus) +{ - /* - * FIXME very rough. - */ - cache_decay_ticks = HZ/100; + if (max_cpus != -1) + printk(KERN_INFO "SMP: Limited to %d CPUs\n", max_cpus); - printk(KERN_INFO "SMP: Total %d of %d processors activated " - "(%lu.%02lu BogoMIPS noticed) (Present Mask: %lu).\n", - cpu_count, boot_cpu_data.cpu_count, (bogosum + 25) / 5000, - ((bogosum + 25) / 50) % 100, cpu_present_mask); + printk(KERN_INFO "SMP: Monarch CPU activated (%lu.%02lu BogoMIPS)\n", + (cpu_data[0].loops_per_jiffy + 25) / 5000, + ((cpu_data[0].loops_per_jiffy + 25) / 50) % 100); - smp_num_cpus = cpu_count; -#ifdef PER_CPU_IRQ_REGION - ipi_init(); -#endif return; } -/* - * Called from main.c by Monarch Processor. - * After this, any CPU can schedule any task. - */ -void smp_commence(void) -{ - smp_commenced = 1; - mb(); - return; -} -/* - * XXX FIXME : do nothing - */ void smp_cpus_done(unsigned int cpu_max) { - smp_threads_ready = 1; -} - -void __init smp_prepare_cpus(unsigned int max_cpus) -{ - smp_boot_cpus(); + return; } -void __devinit smp_prepare_boot_cpu(void) -{ - cpu_set(smp_processor_id(), cpu_online_map); - cpu_set(smp_processor_id(), cpu_present_mask); -} int __devinit __cpu_up(unsigned int cpu) { @@ -745,7 +673,7 @@ int sys_cpus(int argc, char **argv) #ifdef DUMP_MORE_STATE for(i=0; icpu) -#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map) - -#define cpu_possible_map cpu_present_map +#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map) #endif /* CONFIG_SMP */ Index: init/main.c =================================================================== RCS file: /var/cvs/linux-2.6/init/main.c,v retrieving revision 1.14 diff -u -p -r1.14 main.c --- a/init/main.c 20 Mar 2004 20:29:57 -0000 1.14 +++ b/init/main.c 1 Apr 2004 18:05:44 -0000 @@ -390,8 +390,11 @@ static void __init smp_init(void) static void noinline rest_init(void) { +printk("rest_init: calling kernel_thread\n"); mdelay(100); kernel_thread(init, NULL, CLONE_FS | CLONE_SIGHAND); +printk("rest_init: calling unlock_kernel\n"); mdelay(100); unlock_kernel(); +printk("rest_init: calling cpu_idle\n"); mdelay(100); cpu_idle(); } @@ -481,6 +484,7 @@ asmlinkage void __init start_kernel(void #endif check_bugs(); printk("POSIX conformance testing by UNIFIX\n"); +printk("calling init_idle(%p, %d)\n", current, smp_processor_id()); /* * We count on the initial thread going ok @@ -489,6 +493,7 @@ asmlinkage void __init start_kernel(void */ init_idle(current, smp_processor_id()); +printk("init_idle() completed\n"); /* Do the rest non-__init'ed, we're now alive */ rest_init(); } Index: kernel/sched.c =================================================================== RCS file: /var/cvs/linux-2.6/kernel/sched.c,v retrieving revision 1.20 diff -u -p -r1.20 sched.c --- a/kernel/sched.c 30 Mar 2004 12:42:47 -0000 1.20 +++ b/kernel/sched.c 1 Apr 2004 18:05:45 -0000 @@ -2662,6 +2662,10 @@ void __init init_idle(task_t *idle, int runqueue_t *idle_rq = cpu_rq(cpu), *rq = cpu_rq(task_cpu(idle)); unsigned long flags; +printk("init_idle(%p, %d) idle_rq %p rq %p\n", idle, cpu, idle_rq, rq); +mdelay(100); + + idle_rq->curr = idle_rq->idle = idle; local_irq_save(flags); double_rq_lock(idle_rq, rq); Index: mm/shmem.c =================================================================== RCS file: /var/cvs/linux-2.6/mm/shmem.c,v retrieving revision 1.9 diff -u -p -r1.9 shmem.c --- a/mm/shmem.c 20 Mar 2004 20:29:58 -0000 1.9 +++ b/mm/shmem.c 1 Apr 2004 18:05:45 -0000 @@ -374,7 +374,7 @@ static int shmem_free_swp(swp_entry_t *d return freed; } -static void shmem_truncate(struct inode *inode) +/* static gcc-3.3 OPD bug - GGG */ void shmem_truncate(struct inode *inode) { struct shmem_inode_info *info = SHMEM_I(inode); unsigned long idx;