Module Name: src
Committed By: cherry
Date: Mon Jan 9 13:04:13 UTC 2012
Modified Files:
src/sys/arch/amd64/include: pmap.h
src/sys/arch/i386/include: pmap.h
src/sys/arch/xen/x86: x86_xpmap.c
Log Message:
Make cross-cpu pte access MP safe.
XXX: review cases of use of pmap_set_pte() vs direct use of
xpq_queue_pte_update()
To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/amd64/include/pmap.h
cvs rdiff -u -r1.112 -r1.113 src/sys/arch/i386/include/pmap.h
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/xen/x86/x86_xpmap.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/include/pmap.h
diff -u src/sys/arch/amd64/include/pmap.h:1.28 src/sys/arch/amd64/include/pmap.h:1.29
--- src/sys/arch/amd64/include/pmap.h:1.28 Sun Nov 6 15:18:18 2011
+++ src/sys/arch/amd64/include/pmap.h Mon Jan 9 13:04:13 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.28 2011/11/06 15:18:18 cherry Exp $ */
+/* $NetBSD: pmap.h,v 1.29 2012/01/09 13:04:13 cherry Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -263,6 +263,8 @@
atomic_and_ulong((volatile unsigned long *)p, ~(b))
#define pmap_pte_flush() /* nothing */
#else
+extern kmutex_t pte_lock;
+
static __inline pt_entry_t
pmap_pa2pte(paddr_t pa)
{
@@ -277,54 +279,57 @@ pmap_pte2pa(pt_entry_t pte)
static __inline void
pmap_pte_set(pt_entry_t *pte, pt_entry_t npte)
{
- int s = splvm();
+ mutex_enter(&pte_lock);
xpq_queue_pte_update(xpmap_ptetomach(pte), npte);
- splx(s);
+ mutex_exit(&pte_lock);
}
static __inline pt_entry_t
pmap_pte_cas(volatile pt_entry_t *ptep, pt_entry_t o, pt_entry_t n)
{
- int s = splvm();
-
- pt_entry_t opte = *ptep;
+ pt_entry_t opte;
+ mutex_enter(&pte_lock);
+ opte = *ptep;
if (opte == o) {
xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(ptep)), n);
xpq_flush_queue();
}
- splx(s);
+
+ mutex_exit(&pte_lock);
return opte;
}
static __inline pt_entry_t
pmap_pte_testset(volatile pt_entry_t *pte, pt_entry_t npte)
{
- int s = splvm();
- pt_entry_t opte = *pte;
+ pt_entry_t opte;
+
+ mutex_enter(&pte_lock);
+ opte = *pte;
xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(pte)), npte);
xpq_flush_queue();
- splx(s);
+ mutex_exit(&pte_lock);
return opte;
}
static __inline void
pmap_pte_setbits(volatile pt_entry_t *pte, pt_entry_t bits)
{
- int s = splvm();
+ mutex_enter(&pte_lock);
xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(pte)), (*pte) | bits);
xpq_flush_queue();
- splx(s);
+ mutex_exit(&pte_lock);
}
static __inline void
pmap_pte_clearbits(volatile pt_entry_t *pte, pt_entry_t bits)
{
- int s = splvm();
+ mutex_enter(&pte_lock);
xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(pte)),
(*pte) & ~bits);
xpq_flush_queue();
- splx(s);
+ mutex_exit(&pte_lock);
}
static __inline void
Index: src/sys/arch/i386/include/pmap.h
diff -u src/sys/arch/i386/include/pmap.h:1.112 src/sys/arch/i386/include/pmap.h:1.113
--- src/sys/arch/i386/include/pmap.h:1.112 Sun Nov 6 15:18:18 2011
+++ src/sys/arch/i386/include/pmap.h Mon Jan 9 13:04:13 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.112 2011/11/06 15:18:18 cherry Exp $ */
+/* $NetBSD: pmap.h,v 1.113 2012/01/09 13:04:13 cherry Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -354,6 +354,8 @@
#endif /* PAE */
#else /* XEN */
+extern kmutex_t pte_lock;
+
static __inline pt_entry_t
pmap_pa2pte(paddr_t pa)
{
@@ -368,54 +370,57 @@ pmap_pte2pa(pt_entry_t pte)
static __inline void
pmap_pte_set(pt_entry_t *pte, pt_entry_t npte)
{
- int s = splvm();
+ mutex_enter(&pte_lock);
xpq_queue_pte_update(xpmap_ptetomach(pte), npte);
- splx(s);
+ mutex_exit(&pte_lock);
}
static __inline pt_entry_t
pmap_pte_cas(volatile pt_entry_t *ptep, pt_entry_t o, pt_entry_t n)
{
- int s = splvm();
- pt_entry_t opte = *ptep;
+ pt_entry_t opte;
+ mutex_enter(&pte_lock);
+ opte = *ptep;
if (opte == o) {
xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(ptep)), n);
xpq_flush_queue();
}
- splx(s);
+ mutex_exit(&pte_lock);
return opte;
}
static __inline pt_entry_t
pmap_pte_testset(volatile pt_entry_t *pte, pt_entry_t npte)
{
- int s = splvm();
- pt_entry_t opte = *pte;
+ pt_entry_t opte;
+
+ mutex_enter(&pte_lock);
+ opte = *pte;
xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(pte)),
npte);
xpq_flush_queue();
- splx(s);
+ mutex_exit(&pte_lock);
return opte;
}
static __inline void
pmap_pte_setbits(volatile pt_entry_t *pte, pt_entry_t bits)
{
- int s = splvm();
+ mutex_enter(&pte_lock);
xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(pte)), (*pte) | bits);
xpq_flush_queue();
- splx(s);
+ mutex_exit(&pte_lock);
}
static __inline void
pmap_pte_clearbits(volatile pt_entry_t *pte, pt_entry_t bits)
{
- int s = splvm();
+ mutex_enter(&pte_lock);
xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(pte)),
(*pte) & ~bits);
xpq_flush_queue();
- splx(s);
+ mutex_exit(&pte_lock);
}
static __inline void
Index: src/sys/arch/xen/x86/x86_xpmap.c
diff -u src/sys/arch/xen/x86/x86_xpmap.c:1.36 src/sys/arch/xen/x86/x86_xpmap.c:1.37
--- src/sys/arch/xen/x86/x86_xpmap.c:1.36 Sun Nov 6 15:18:19 2011
+++ src/sys/arch/xen/x86/x86_xpmap.c Mon Jan 9 13:04:13 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: x86_xpmap.c,v 1.36 2011/11/06 15:18:19 cherry Exp $ */
+/* $NetBSD: x86_xpmap.c,v 1.37 2012/01/09 13:04:13 cherry Exp $ */
/*
* Copyright (c) 2006 Mathieu Ropert <[email protected]>
@@ -69,7 +69,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: x86_xpmap.c,v 1.36 2011/11/06 15:18:19 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: x86_xpmap.c,v 1.37 2012/01/09 13:04:13 cherry Exp $");
#include "opt_xen.h"
#include "opt_ddb.h"
@@ -117,6 +117,7 @@ volatile shared_info_t *HYPERVISOR_share
/* Xen requires the start_info struct to be page aligned */
union start_info_union start_info_union __aligned(PAGE_SIZE);
unsigned long *xpmap_phys_to_machine_mapping;
+kmutex_t pte_lock;
void xen_failsafe_handler(void);
@@ -652,6 +653,8 @@ bootstrap_again:
/* Finally, flush TLB. */
xpq_queue_tlb_flush();
+ mutex_init(&pte_lock, MUTEX_DEFAULT, IPL_VM);
+
return (init_tables + ((count + l2_4_count) * PAGE_SIZE));
}