 /* can also deadlock if IPIs are disabled */ WARN_ON((get_eiem() & (1UL<<(CPU_IRQ_MAX - IPI_IRQ))) == 0);  
smp_call_function (void (*func) (void *info), void *info, int retry, int wait){	struct smp_call_struct data;	unsigned long timeout;	static DEFINE_SPINLOCK(lock);	int retries = 0;	if (num_online_cpus() < 2)		return 0;	/* Can deadlock when called with interrupts disabled */	WARN_ON(irqs_disabled());		data.func = func;	data.info = info;	data.wait = wait;	atomic_set(&data.unstarted_count, num_online_cpus() - 1);	atomic_set(&data.unfinished_count, num_online_cpus() - 1);	if (retry) {		spin_lock (&lock);		while (smp_call_function_data != 0)			barrier();	}	else {		spin_lock (&lock);		if (smp_call_function_data) {			spin_unlock (&lock);			return -EBUSY;		}	}	smp_call_function_data = &data;	spin_unlock (&lock);		/*  Send a message to all other CPUs and wait for them to respond  */	send_IPI_allbutself(IPI_CALL_FUNC); retry:	/*  Wait for response  */	timeout = jiffies + HZ;	while ( (atomic_read (&data.unstarted_count) > 0) &&		time_before (jiffies, timeout) )		barrier ();	if (atomic_read (&data.unstarted_count) > 0) {		printk(KERN_CRIT "SMP CALL FUNCTION TIMED OUT! (cpu=%d), try %d\n",		      smp_processor_id(), ++retries);		goto retry;	}	/* We either got one or timed out. Release the lock */	mb();	smp_call_function_data = NULL;	while (wait && atomic_read (&data.unfinished_count) > 0)			barrier ();	return 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/9a8b4584065dd241d6c2bf818e349986bd900b8e/smp.c/buggy/arch/parisc/kernel/smp.c