if (!cpus) 
/* Holding any lock stops cpus from going down. */ spin_lock(&call_lock); cpus = num_online_cpus() - 1; if (!cpus) { spin_unlock(&call_lock); 
int smp_call_function (void (*func) (void *info), void *info, int nonatomic,			int wait)/* * [SUMMARY] Run a function on all other CPUs. * <func> The function to run. This must be fast and non-blocking. * <info> An arbitrary pointer to pass to the function. * <nonatomic> currently unused. * <wait> If true, wait (atomically) until function has completed on other CPUs. * [RETURNS] 0 on success, else a negative status code. Does not return until * remote CPUs are nearly ready to execute <<func>> or are or have executed. * * You must not call this function with disabled interrupts or from a * hardware interrupt handler or from a bottom half handler. */{	struct call_data_struct data;	int cpus = num_online_cpus()-1;	if (!cpus)		return 0;	/* Can deadlock when called with interrupts disabled */	WARN_ON(irqs_disabled());	data.func = func;	data.info = info;	atomic_set(&data.started, 0);	data.wait = wait;	if (wait)		atomic_set(&data.finished, 0);	spin_lock(&call_lock);	call_data = &data;	mb();		/* Send a message to all other CPUs and wait for them to respond */	send_IPI_allbutself(CALL_FUNCTION_VECTOR);	/* Wait for response */	while (atomic_read(&data.started) != cpus)		cpu_relax();	if (wait)		while (atomic_read(&data.finished) != cpus)			cpu_relax();	spin_unlock(&call_lock);	return 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/f370513640492641b4046bfd9a6e4714f6ae530d/smp.c/buggy/arch/i386/kernel/smp.c