PERFORCE change 101296 for review

John Baldwin jhb at FreeBSD.org
Tue Jul 11 21:06:22 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=101296

Change 101296 by jhb at jhb_mutex on 2006/07/11 21:05:23

	Drop the attempt at allowing certain IPI's to still be handled when
	we would otherwise spin with interrupts disabled as the issue it
	tried to address has been fixed another way.  This can be
	resurrected later if desired.

Affected files ...

.. //depot/projects/smpng/sys/i386/i386/local_apic.c#42 edit
.. //depot/projects/smpng/sys/i386/i386/mp_machdep.c#102 edit
.. //depot/projects/smpng/sys/i386/i386/pmap.c#102 edit
.. //depot/projects/smpng/sys/i386/include/apicvar.h#21 edit
.. //depot/projects/smpng/sys/kern/kern_mutex.c#129 edit

Differences ...

==== //depot/projects/smpng/sys/i386/i386/local_apic.c#42 (text+ko) ====

@@ -917,17 +917,9 @@
 int
 lapic_ipi_wait(int delay)
 {
-	int x, incr, allow_ipis, done;
+	int x, incr;
 
 	/*
-	 * If interrupts are disabled, then hack on the APIC to allow
-	 * safe IPIs to come in while we wait.
-	 */
-	allow_ipis = (read_eflags() & PSL_I) == 0;
-	if (allow_ipis)
-		APIC_IPI_SPINWAIT_ENTER();
-
-	/*
 	 * Wait delay loops for IPI to be sent.  This is highly bogus
 	 * since this is sensitive to CPU clock speed.  If delay is
 	 * -1, we wait forever.
@@ -937,17 +929,12 @@
 		delay = 1;
 	} else
 		incr = 1;
-	done = 0;
 	for (x = 0; x < delay; x += incr) {
-		if ((lapic->icr_lo & APIC_DELSTAT_MASK) == APIC_DELSTAT_IDLE) {
-			done = 1;
-			break;
-		}
+		if ((lapic->icr_lo & APIC_DELSTAT_MASK) == APIC_DELSTAT_IDLE)
+			return (1);
 		ia32_pause();
 	}
-	if (allow_ipis)
-		APIC_IPI_SPINWAIT_EXIT();
-	return (done);
+	return (0);
 }
 
 void

==== //depot/projects/smpng/sys/i386/i386/mp_machdep.c#102 (text+ko) ====

@@ -1008,10 +1008,8 @@
 	smp_tlb_addr2 = addr2;
 	atomic_store_rel_int(&smp_tlb_wait, 0);
 	ipi_all_but_self(vector);
-	APIC_IPI_SPINWAIT_ENTER();
 	while (smp_tlb_wait < ncpu)
 		ia32_pause();
-	APIC_IPI_SPINWAIT_EXIT();
 }
 
 static void
@@ -1047,10 +1045,8 @@
 		ipi_all_but_self(vector);
 	else
 		ipi_selected(mask, vector);
-	APIC_IPI_SPINWAIT_ENTER();
 	while (smp_tlb_wait < ncpu)
 		ia32_pause();
-	APIC_IPI_SPINWAIT_EXIT();
 }
 
 void

==== //depot/projects/smpng/sys/i386/i386/pmap.c#102 (text+ko) ====

@@ -1414,13 +1414,11 @@
 			    (u_int)&pmap->pm_active);
 			atomic_store_rel_int(&lazywait, 0);
 			ipi_selected(mask, IPI_LAZYPMAP);
-			APIC_IPI_SPINWAIT_ENTER();
 			while (lazywait == 0) {
 				ia32_pause();
 				if (--spins == 0)
 					break;
 			}
-			APIC_IPI_SPINWAIT_EXIT();
 		}
 		mtx_unlock_spin(&smp_ipi_mtx);
 		if (spins == 0)

==== //depot/projects/smpng/sys/i386/include/apicvar.h#21 (text+ko) ====

@@ -106,19 +106,11 @@
  * other deadlocks caused by IPI_STOP.
  */ 
 
-/*
- * These interrupt handlers are for IPIs and local interrupts whose handlers
- * do not use any spin locks, so they may still be allowed when a spin lock
- * is held.
- */
-#define	APIC_LOCK_SAFE_INTS (APIC_TIMER_INT + 1)
-
 /* Interrupts for local APIC LVT entries other than the timer. */
-#define	APIC_LOCAL_INTS	APIC_LOCK_SAFE_INTS
+#define	APIC_LOCAL_INTS	240
 #define	APIC_ERROR_INT	APIC_LOCAL_INTS
 #define	APIC_THERMAL_INT (APIC_LOCAL_INTS + 1)
 
-/* Spin lock safe IPIs. */
 #define	APIC_IPI_INTS	(APIC_LOCAL_INTS + 2)
 #define	IPI_RENDEZVOUS	(APIC_IPI_INTS)		/* Inter-CPU rendezvous. */
 #define	IPI_INVLTLB	(APIC_IPI_INTS + 1)	/* TLB Shootdown IPIs */
@@ -163,21 +155,6 @@
 #define	APIC_BUS_PCI		2
 #define	APIC_BUS_MAX		APIC_BUS_PCI
 
-#if 0
-#define	APIC_IPI_SPINWAIT_ENTER() do {					\
-	lapic_set_tpr(APIC_LOCK_SAFE_INTS);				\
-	enable_intr();							\
-} while (0)
-
-#define	APIC_IPI_SPINWAIT_EXIT() do {					\
-	disable_intr();							\
-	lapic_set_tpr(0);						\
-} while (0)
-#else
-#define	APIC_IPI_SPINWAIT_ENTER()
-#define	APIC_IPI_SPINWAIT_EXIT()
-#endif
-
 /*
  * An APIC enumerator is a psuedo bus driver that enumerates APIC's including
  * CPU's and I/O APIC's.

==== //depot/projects/smpng/sys/kern/kern_mutex.c#129 (text+ko) ====

@@ -60,11 +60,6 @@
 #include <sys/turnstile.h>
 #include <sys/vmmeter.h>
 
-#ifdef __i386__
-#include <machine/frame.h>
-#include <machine/intr_machdep.h>
-#include <machine/apicvar.h>
-#endif
 #include <machine/atomic.h>
 #include <machine/bus.h>
 #include <machine/cpu.h>
@@ -606,9 +601,6 @@
 {
 	int i = 0, idlespin = 0;
 	struct thread *td;
-#ifdef __i386__
-	int apic_hack;
-#endif
 
 	if (LOCK_LOG_TEST(&m->mtx_object, opts))
 		CTR1(KTR_LOCK, "_mtx_lock_spin: %p spinning", m);
@@ -620,11 +612,6 @@
 
 		/* Give interrupts a chance while we spin. */
 		spinlock_exit();
-#ifdef __i386__
-		apic_hack = (read_eflags() & PSL_I) == 0;
-		if (apic_hack)
-			APIC_IPI_SPINWAIT_ENTER();
-#endif
 		while (m->mtx_lock != MTX_UNOWNED) {
 			if (i++ < 10000000) {
 				cpu_spinwait();
@@ -650,10 +637,6 @@
 			}
 			cpu_spinwait();
 		}
-#ifdef __i386__
-		if (apic_hack)
-			APIC_IPI_SPINWAIT_EXIT();
-#endif
 		spinlock_enter();
 	}
 


More information about the p4-projects mailing list