svn commit: r217006 - releng/8.2/sys/sparc64/sparc64
Marius Strobl
marius at FreeBSD.org
Wed Jan 5 13:40:36 UTC 2011
Author: marius
Date: Wed Jan 5 13:40:35 2011
New Revision: 217006
URL: http://svn.freebsd.org/changeset/base/217006
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.
Approved by: re (kib)
Modified:
releng/8.2/sys/sparc64/sparc64/tlb.c
Directory Properties:
releng/8.2/sys/ (props changed)
releng/8.2/sys/amd64/include/xen/ (props changed)
releng/8.2/sys/cddl/contrib/opensolaris/ (props changed)
releng/8.2/sys/contrib/dev/acpica/ (props changed)
releng/8.2/sys/contrib/pf/ (props changed)
Modified: releng/8.2/sys/sparc64/sparc64/tlb.c
==============================================================================
--- releng/8.2/sys/sparc64/sparc64/tlb.c Wed Jan 5 13:36:59 2011 (r217005)
+++ releng/8.2/sys/sparc64/sparc64/tlb.c Wed Jan 5 13:40:35 2011 (r217006)
@@ -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-all
mailing list