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 <m...@adviseo.fr> @@ -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)); }