Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 2 May 2011 13:56:48 +0000 (UTC)
From:      Attilio Rao <attilio@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r221322 - projects/largeSMP/sys/i386/xen
Message-ID:  <201105021356.p42Dum3V040817@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: attilio
Date: Mon May  2 13:56:47 2011
New Revision: 221322
URL: http://svn.freebsd.org/changeset/base/221322

Log:
  - Merge a fix fixup for the last lazyfix removal
  - Sync xen with i386 about the ipi_send_cpu() usage

Modified:
  projects/largeSMP/sys/i386/xen/mp_machdep.c
  projects/largeSMP/sys/i386/xen/pmap.c

Modified: projects/largeSMP/sys/i386/xen/mp_machdep.c
==============================================================================
--- projects/largeSMP/sys/i386/xen/mp_machdep.c	Mon May  2 10:42:19 2011	(r221321)
+++ projects/largeSMP/sys/i386/xen/mp_machdep.c	Mon May  2 13:56:47 2011	(r221322)
@@ -153,7 +153,6 @@ static cpumask_t	hyperthreading_cpus_mas
 
 extern void Xhypervisor_callback(void);
 extern void failsafe_callback(void);
-extern void pmap_lazyfix_action(void);
 
 struct cpu_group *
 cpu_topo(void)
@@ -340,24 +339,16 @@ iv_invlcache(uintptr_t a, uintptr_t b)
 	atomic_add_int(&smp_tlb_wait, 1);
 }
 
-static void
-iv_lazypmap(uintptr_t a, uintptr_t b)
-{
-	pmap_lazyfix_action();
-	atomic_add_int(&smp_tlb_wait, 1);
-}
-
 /*
  * These start from "IPI offset" APIC_IPI_INTS
  */
-static call_data_func_t *ipi_vectors[6] = 
+static call_data_func_t *ipi_vectors[5] = 
 {
   iv_rendezvous,
   iv_invltlb,
   iv_invlpg,
   iv_invlrng,
   iv_invlcache,
-  iv_lazypmap,
 };
 
 /*
@@ -957,6 +948,30 @@ start_ap(int apic_id)
 }
 
 /*
+ * send an IPI to a specific CPU.
+ */
+static void
+ipi_send_cpu(int cpu, u_int ipi)
+{
+	u_int bitmap, old_pending, new_pending;
+
+	if (IPI_IS_BITMAPED(ipi)) { 
+		bitmap = 1 << ipi;
+		ipi = IPI_BITMAP_VECTOR;
+		do {
+			old_pending = cpu_ipi_pending[cpu];
+			new_pending = old_pending | bitmap;
+		} while  (!atomic_cmpset_int(&cpu_ipi_pending[cpu],
+		    old_pending, new_pending));	
+		if (!old_pending)
+			ipi_pcpu(cpu, RESCHEDULE_VECTOR);
+	} else {
+		KASSERT(call_data != NULL, ("call_data not set"));
+		ipi_pcpu(cpu, CALL_FUNCTION_VECTOR);
+	}
+}
+
+/*
  * Flush the TLB on all other CPU's
  */
 static void
@@ -1098,14 +1113,6 @@ void
 ipi_selected(cpumask_t cpus, u_int ipi)
 {
 	int cpu;
-	u_int bitmap = 0;
-	u_int old_pending;
-	u_int new_pending;
-	
-	if (IPI_IS_BITMAPED(ipi)) { 
-		bitmap = 1 << ipi;
-		ipi = IPI_BITMAP_VECTOR;
-	} 
 
 	/*
 	 * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
@@ -1115,23 +1122,11 @@ ipi_selected(cpumask_t cpus, u_int ipi)
 	if (ipi == IPI_STOP_HARD)
 		atomic_set_int(&ipi_nmi_pending, cpus);
 
-	CTR3(KTR_SMP, "%s: cpus: %x ipi: %x", __func__, cpus, ipi);
 	while ((cpu = ffs(cpus)) != 0) {
 		cpu--;
 		cpus &= ~(1 << cpu);
-
-		if (bitmap) {
-			do {
-				old_pending = cpu_ipi_pending[cpu];
-				new_pending = old_pending | bitmap;
-			} while  (!atomic_cmpset_int(&cpu_ipi_pending[cpu],
-			    old_pending, new_pending));	
-			if (!old_pending)
-				ipi_pcpu(cpu, RESCHEDULE_VECTOR);
-		} else {
-			KASSERT(call_data != NULL, ("call_data not set"));
-			ipi_pcpu(cpu, CALL_FUNCTION_VECTOR);
-		}
+		CTR3(KTR_SMP, "%s: cpu: %d ipi: %x", __func__, cpu, ipi);
+		ipi_send_cpu(cpu, ipi);
 	}
 }
 
@@ -1141,14 +1136,6 @@ ipi_selected(cpumask_t cpus, u_int ipi)
 void
 ipi_cpu(int cpu, u_int ipi)
 {
-	u_int bitmap = 0;
-	u_int old_pending;
-	u_int new_pending;
-	
-	if (IPI_IS_BITMAPED(ipi)) { 
-		bitmap = 1 << ipi;
-		ipi = IPI_BITMAP_VECTOR;
-	} 
 
 	/*
 	 * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
@@ -1159,19 +1146,7 @@ ipi_cpu(int cpu, u_int ipi)
 		atomic_set_int(&ipi_nmi_pending, 1 << cpu);
 
 	CTR3(KTR_SMP, "%s: cpu: %d ipi: %x", __func__, cpu, ipi);
-
-	if (bitmap) {
-		do {
-			old_pending = cpu_ipi_pending[cpu];
-			new_pending = old_pending | bitmap;
-		} while  (!atomic_cmpset_int(&cpu_ipi_pending[cpu],
-		    old_pending, new_pending));	
-		if (!old_pending)
-			ipi_pcpu(cpu, RESCHEDULE_VECTOR);
-	} else {
-		KASSERT(call_data != NULL, ("call_data not set"));
-		ipi_pcpu(cpu, CALL_FUNCTION_VECTOR);
-	}
+	ipi_send_cpu(cpu, ipi);
 }
 
 /*

Modified: projects/largeSMP/sys/i386/xen/pmap.c
==============================================================================
--- projects/largeSMP/sys/i386/xen/pmap.c	Mon May  2 10:42:19 2011	(r221321)
+++ projects/largeSMP/sys/i386/xen/pmap.c	Mon May  2 13:56:47 2011	(r221322)
@@ -1706,7 +1706,6 @@ pmap_release(pmap_t pmap)
 	mtx_lock(&createdelete_lock);
 #endif
 
-	pmap_lazyfix(pmap);
 	mtx_lock_spin(&allpmaps_lock);
 	LIST_REMOVE(pmap, pm_list);
 	mtx_unlock_spin(&allpmaps_lock);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201105021356.p42Dum3V040817>