ops &= ~(1 << which); 
ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs) {	int this_cpu = smp_processor_id();	struct cpuinfo_parisc *p = &cpu_data[this_cpu];	unsigned long ops;	unsigned long flags;	/* Count this now; we may make a call that never returns. */	p->ipi_count++;	mb();	/* Order interrupt and bit testing. */	for (;;) {		spin_lock_irqsave(&(p->lock),flags);		ops = p->pending_ipi;		p->pending_ipi = 0;		spin_unlock_irqrestore(&(p->lock),flags);		mb(); /* Order bit clearing and data access. */		if (!ops)		    break;		while (ops) {			unsigned long which = ffz(~ops);			switch (which) {			case IPI_RESCHEDULE:#if (kDEBUG>=100)				printk(KERN_DEBUG "CPU%d IPI_RESCHEDULE\n",this_cpu);#endif /* kDEBUG */				ops &= ~(1 << IPI_RESCHEDULE);				/*				 * Reschedule callback.  Everything to be				 * done is done by the interrupt return path.				 */				break;			case IPI_CALL_FUNC:#if (kDEBUG>=100)				printk(KERN_DEBUG "CPU%d IPI_CALL_FUNC\n",this_cpu);#endif /* kDEBUG */				ops &= ~(1 << IPI_CALL_FUNC);				{					volatile struct smp_call_struct *data;					void (*func)(void *info);					void *info;					int wait;					data = smp_call_function_data;					func = data->func;					info = data->info;					wait = data->wait;					mb();					atomic_dec ((atomic_t *)&data->unstarted_count);					/* At this point, *data can't					 * be relied upon.					 */					(*func)(info);					/* Notify the sending CPU that the					 * task is done.					 */					mb();					if (wait)						atomic_dec ((atomic_t *)&data->unfinished_count);				}				break;			case IPI_CPU_START:#if (kDEBUG>=100)				printk(KERN_DEBUG "CPU%d IPI_CPU_START\n",this_cpu);#endif /* kDEBUG */				ops &= ~(1 << IPI_CPU_START);#ifdef ENTRY_SYS_CPUS				p->state = STATE_RUNNING;#endif				break;			case IPI_CPU_STOP:#if (kDEBUG>=100)				printk(KERN_DEBUG "CPU%d IPI_CPU_STOP\n",this_cpu);#endif /* kDEBUG */				ops &= ~(1 << IPI_CPU_STOP);#ifdef ENTRY_SYS_CPUS#else				halt_processor();#endif				break;			case IPI_CPU_TEST:#if (kDEBUG>=100)				printk(KERN_DEBUG "CPU%d is alive!\n",this_cpu);#endif /* kDEBUG */				ops &= ~(1 << IPI_CPU_TEST);				break;			default:				printk(KERN_CRIT "Unknown IPI num on CPU%d: %lu\n",					this_cpu, which);				ops &= ~(1 << which);				return IRQ_NONE;			} /* Switch */		} /* while (ops) */	}	return IRQ_HANDLED;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/d911aed8adf74e1fae88d082b8474b2175b7f1da/smp.c/buggy/arch/parisc/kernel/smp.c