mb(); 
smp_mb(); 
int __devinit __cpu_up(unsigned int cpu){	int c;	if (!cpu_enable(cpu))		return 0;	if (smp_ops->cpu_bootable && !smp_ops->cpu_bootable(cpu))		return -EINVAL;	paca[cpu].default_decr = tb_ticks_per_jiffy / decr_overclock;	if (!cpu_has_feature(CPU_FTR_SLB)) {		void *tmp;		/* maximum of 48 CPUs on machines with a segment table */		if (cpu >= 48)			BUG();		tmp = &stab_array[PAGE_SIZE * cpu];		memset(tmp, 0, PAGE_SIZE); 		paca[cpu].stab_addr = (unsigned long)tmp;		paca[cpu].stab_real = virt_to_abs(tmp);	}	/* Make sure callin-map entry is 0 (can be leftover a CPU	 * hotplug	 */	cpu_callin_map[cpu] = 0;	/* The information for processor bringup must	 * be written out to main store before we release	 * the processor.	 */	mb();	/* wake up cpus */	DBG("smp: kicking cpu %d\n", cpu);	smp_ops->kick_cpu(cpu);	/*	 * wait to see if the cpu made a callin (is actually up).	 * use this value that I found through experimentation.	 * -- Cort	 */	if (system_state < SYSTEM_RUNNING)		for (c = 5000; c && !cpu_callin_map[cpu]; c--)			udelay(100);#ifdef CONFIG_HOTPLUG_CPU	else		/*		 * CPUs can take much longer to come up in the		 * hotplug case.  Wait five seconds.		 */		for (c = 25; c && !cpu_callin_map[cpu]; c--) {			msleep(200);		}#endif	if (!cpu_callin_map[cpu]) {		printk("Processor %u is stuck.\n", cpu);		return -ENOENT;	}	printk("Processor %u found.\n", cpu);	if (smp_ops->give_timebase)		smp_ops->give_timebase();	/* Wait until cpu puts itself in the online map */	while (!cpu_online(cpu))		cpu_relax();	return 0;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/0d8d4d42f2d00eb65262b49f4edd4cf7ef4eb6fc/smp.c/clean/arch/ppc64/kernel/smp.c