wmb(); 
smp_wmb(); 
int smp_call_function (void (*func) (void *info), void *info, int nonatomic,		       int wait){ 	struct call_data_struct data;	int ret = -1, cpus;	unsigned long timeout;	/* 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);	/* Must grab online cpu count with preempt disabled, otherwise	 * it can change. */	cpus = num_online_cpus() - 1;	if (!cpus) {		ret = 0;		goto out;	}	call_data = &data;	wmb();	/* Send a message to all other CPUs and wait for them to respond */	smp_ops->message_pass(MSG_ALL_BUT_SELF, PPC_MSG_CALL_FUNCTION);	/* Wait for response */	timeout = SMP_CALL_TIMEOUT;	while (atomic_read(&data.started) != cpus) {		HMT_low();		if (--timeout == 0) {			printk("smp_call_function on cpu %d: other cpus not "			       "responding (%d)\n", smp_processor_id(),			       atomic_read(&data.started));			debugger(NULL);			goto out;		}	}	if (wait) {		timeout = SMP_CALL_TIMEOUT;		while (atomic_read(&data.finished) != cpus) {			HMT_low();			if (--timeout == 0) {				printk("smp_call_function on cpu %d: other "				       "cpus not finishing (%d/%d)\n",				       smp_processor_id(),				       atomic_read(&data.finished),				       atomic_read(&data.started));				debugger(NULL);				goto out;			}		}	}	ret = 0;out:	call_data = NULL;	HMT_medium();	spin_unlock(&call_lock);	return ret;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/0d8d4d42f2d00eb65262b49f4edd4cf7ef4eb6fc/smp.c/clean/arch/ppc64/kernel/smp.c