svn commit: r216989 - stable/8/sys/sparc64/sparc64

Marius Strobl marius at FreeBSD.org
Wed Jan 5 11:29:07 UTC 2011


Author: marius
Date: Wed Jan  5 11:29:07 2011
New Revision: 216989
URL: http://svn.freebsd.org/changeset/base/216989

Log:
  MFC: r216891
  
  Extend the section in which interrupts are disabled in the TLB demap
  functions, otherwise if we get preempted after checking whether a certain
  pmap is active on the current CPU but before disabling interrupts we might
  operate on an outdated state as the pmap might have been deactivated in
  the meantime. As the same issue may arises when the TLB demap function is
  interrupted by a TLB demap IPI, just entering a critical section before
  the check isn't sufficient so we have to fully disable interrupts instead.

Modified:
  stable/8/sys/sparc64/sparc64/tlb.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/sparc64/sparc64/tlb.c
==============================================================================
--- stable/8/sys/sparc64/sparc64/tlb.c	Wed Jan  5 09:58:41 2011	(r216988)
+++ stable/8/sys/sparc64/sparc64/tlb.c	Wed Jan  5 11:29:07 2011	(r216989)
@@ -80,15 +80,15 @@ tlb_context_demap(struct pmap *pm)
 	 */
 	PMAP_STATS_INC(tlb_ncontext_demap);
 	cookie = ipi_tlb_context_demap(pm);
+	s = intr_disable();
 	if (pm->pm_active & PCPU_GET(cpumask)) {
 		KASSERT(pm->pm_context[curcpu] != -1,
 		    ("tlb_context_demap: inactive pmap?"));
-		s = intr_disable();
 		stxa(TLB_DEMAP_PRIMARY | TLB_DEMAP_CONTEXT, ASI_DMMU_DEMAP, 0);
 		stxa(TLB_DEMAP_PRIMARY | TLB_DEMAP_CONTEXT, ASI_IMMU_DEMAP, 0);
 		flush(KERNBASE);
-		intr_restore(s);
 	}
+	intr_restore(s);
 	ipi_wait(cookie);
 }
 
@@ -101,6 +101,7 @@ tlb_page_demap(struct pmap *pm, vm_offse
 
 	PMAP_STATS_INC(tlb_npage_demap);
 	cookie = ipi_tlb_page_demap(pm, va);
+	s = intr_disable();
 	if (pm->pm_active & PCPU_GET(cpumask)) {
 		KASSERT(pm->pm_context[curcpu] != -1,
 		    ("tlb_page_demap: inactive pmap?"));
@@ -109,12 +110,11 @@ tlb_page_demap(struct pmap *pm, vm_offse
 		else
 			flags = TLB_DEMAP_PRIMARY | TLB_DEMAP_PAGE;
 
-		s = intr_disable();
 		stxa(TLB_DEMAP_VA(va) | flags, ASI_DMMU_DEMAP, 0);
 		stxa(TLB_DEMAP_VA(va) | flags, ASI_IMMU_DEMAP, 0);
 		flush(KERNBASE);
-		intr_restore(s);
 	}
+	intr_restore(s);
 	ipi_wait(cookie);
 }
 
@@ -128,6 +128,7 @@ tlb_range_demap(struct pmap *pm, vm_offs
 
 	PMAP_STATS_INC(tlb_nrange_demap);
 	cookie = ipi_tlb_range_demap(pm, start, end);
+	s = intr_disable();
 	if (pm->pm_active & PCPU_GET(cpumask)) {
 		KASSERT(pm->pm_context[curcpu] != -1,
 		    ("tlb_range_demap: inactive pmap?"));
@@ -136,13 +137,12 @@ tlb_range_demap(struct pmap *pm, vm_offs
 		else
 			flags = TLB_DEMAP_PRIMARY | TLB_DEMAP_PAGE;
 
-		s = intr_disable();
 		for (va = start; va < end; va += PAGE_SIZE) {
 			stxa(TLB_DEMAP_VA(va) | flags, ASI_DMMU_DEMAP, 0);
 			stxa(TLB_DEMAP_VA(va) | flags, ASI_IMMU_DEMAP, 0);
 			flush(KERNBASE);
 		}
-		intr_restore(s);
 	}
+	intr_restore(s);
 	ipi_wait(cookie);
 }


More information about the svn-src-stable-8 mailing list