/* * I'm not happy about this global shared spinlock in the * MM hot path, but we'll see how contended it is. * Temporarily this turns IRQs off, so that lockups are * detected by the NMI watchdog. */ spin_lock(&tlbstate_lock);  flush_mm = mm; flush_va = va; cpus_or(flush_cpumask, cpumask, flush_cpumask); 
/* Caller has disabled preemption */ sender = smp_processor_id() % NUM_INVALIDATE_TLB_VECTORS; f = &per_cpu(flush_state, sender);  /* Could avoid this lock when num_online_cpus() <= NUM_INVALIDATE_TLB_VECTORS, but it is probably not worth checking this for a cache-hot lock. */ spin_lock(&f->tlbstate_lock);  f->flush_mm = mm; f->flush_va = va; cpus_or(f->flush_cpumask, cpumask, f->flush_cpumask); 
static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,						unsigned long va){	cpumask_t tmp;	/*	 * A couple of (to be removed) sanity checks:	 *	 * - we do not send IPIs to not-yet booted CPUs.	 * - current CPU must not be in mask	 * - mask must exist :)	 */	BUG_ON(cpus_empty(cpumask));	cpus_and(tmp, cpumask, cpu_online_map);	BUG_ON(!cpus_equal(tmp, cpumask));	BUG_ON(cpu_isset(smp_processor_id(), cpumask));	if (!mm)		BUG();	/*	 * I'm not happy about this global shared spinlock in the	 * MM hot path, but we'll see how contended it is.	 * Temporarily this turns IRQs off, so that lockups are	 * detected by the NMI watchdog.	 */	spin_lock(&tlbstate_lock);		flush_mm = mm;	flush_va = va;	cpus_or(flush_cpumask, cpumask, flush_cpumask);	/*	 * We have to send the IPI only to	 * CPUs affected.	 */	send_IPI_mask(cpumask, INVALIDATE_TLB_VECTOR);	while (!cpus_empty(flush_cpumask))		mb();	/* nothing. lockup detection does not belong here */;	flush_mm = NULL;	flush_va = 0;	spin_unlock(&tlbstate_lock);}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/e5bc8b6baf86538f3d0407cf0880f86aec828a13/smp.c/buggy/arch/x86_64/kernel/smp.c