Module Name: src Committed By: cherry Date: Sat Aug 13 12:09:39 UTC 2011
Modified Files: src/sys/arch/amd64/include: pmap.h src/sys/arch/i386/i386: machdep.c src/sys/arch/i386/include: pmap.h src/sys/arch/x86/include: pmap.h src/sys/arch/xen/x86: x86_xpmap.c xen_pmap.c xenfunc.c Log Message: Add locking around ops to the hypervisor MMU "queue". To generate a diff of this commit: cvs rdiff -u -r1.24 -r1.25 src/sys/arch/amd64/include/pmap.h cvs rdiff -u -r1.708 -r1.709 src/sys/arch/i386/i386/machdep.c cvs rdiff -u -r1.109 -r1.110 src/sys/arch/i386/include/pmap.h cvs rdiff -u -r1.40 -r1.41 src/sys/arch/x86/include/pmap.h cvs rdiff -u -r1.30 -r1.31 src/sys/arch/xen/x86/x86_xpmap.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/xen/x86/xen_pmap.c cvs rdiff -u -r1.11 -r1.12 src/sys/arch/xen/x86/xenfunc.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.24 src/sys/arch/amd64/include/pmap.h:1.25 --- src/sys/arch/amd64/include/pmap.h:1.24 Tue Feb 1 20:09:08 2011 +++ src/sys/arch/amd64/include/pmap.h Sat Aug 13 12:09:38 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.24 2011/02/01 20:09:08 chuck Exp $ */ +/* $NetBSD: pmap.h,v 1.25 2011/08/13 12:09:38 cherry Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -276,7 +276,9 @@ pmap_pte_set(pt_entry_t *pte, pt_entry_t npte) { int s = splvm(); + xpq_queue_lock(); xpq_queue_pte_update(xpmap_ptetomach(pte), npte); + xpq_queue_unlock(); splx(s); } @@ -284,12 +286,15 @@ pmap_pte_cas(volatile pt_entry_t *ptep, pt_entry_t o, pt_entry_t n) { int s = splvm(); + + xpq_queue_lock(); pt_entry_t opte = *ptep; if (opte == o) { xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(ptep)), n); xpq_flush_queue(); } + xpq_queue_unlock(); splx(s); return opte; } @@ -298,9 +303,11 @@ pmap_pte_testset(volatile pt_entry_t *pte, pt_entry_t npte) { int s = splvm(); + xpq_queue_lock(); pt_entry_t opte = *pte; xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(pte)), npte); xpq_flush_queue(); + xpq_queue_unlock(); splx(s); return opte; } @@ -309,8 +316,10 @@ pmap_pte_setbits(volatile pt_entry_t *pte, pt_entry_t bits) { int s = splvm(); + xpq_queue_lock(); xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(pte)), (*pte) | bits); xpq_flush_queue(); + xpq_queue_unlock(); splx(s); } @@ -318,9 +327,11 @@ pmap_pte_clearbits(volatile pt_entry_t *pte, pt_entry_t bits) { int s = splvm(); + xpq_queue_lock(); xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(pte)), (*pte) & ~bits); xpq_flush_queue(); + xpq_queue_unlock(); splx(s); } @@ -328,7 +339,9 @@ pmap_pte_flush(void) { int s = splvm(); + xpq_queue_lock(); xpq_flush_queue(); + xpq_queue_unlock(); splx(s); } #endif Index: src/sys/arch/i386/i386/machdep.c diff -u src/sys/arch/i386/i386/machdep.c:1.708 src/sys/arch/i386/i386/machdep.c:1.709 --- src/sys/arch/i386/i386/machdep.c:1.708 Thu Aug 11 18:11:17 2011 +++ src/sys/arch/i386/i386/machdep.c Sat Aug 13 12:09:38 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.708 2011/08/11 18:11:17 cherry Exp $ */ +/* $NetBSD: machdep.c,v 1.709 2011/08/13 12:09:38 cherry Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 2000, 2004, 2006, 2008, 2009 @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.708 2011/08/11 18:11:17 cherry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.709 2011/08/13 12:09:38 cherry Exp $"); #include "opt_beep.h" #include "opt_compat_ibcs2.h" @@ -1194,8 +1194,10 @@ npte = pmap_pa2pte((vaddr_t)gdt - KERNBASE); npte |= PG_RO | pg_nx | PG_V; + xpq_queue_lock(); xpq_queue_pte_update(xpmap_ptetomach(pte), npte); xpq_flush_queue(); + xpq_queue_unlock(); } XENPRINTK(("loading gdt %lx, %d entries\n", frames[0] << PAGE_SHIFT, Index: src/sys/arch/i386/include/pmap.h diff -u src/sys/arch/i386/include/pmap.h:1.109 src/sys/arch/i386/include/pmap.h:1.110 --- src/sys/arch/i386/include/pmap.h:1.109 Tue Feb 1 20:09:08 2011 +++ src/sys/arch/i386/include/pmap.h Sat Aug 13 12:09:38 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.109 2011/02/01 20:09:08 chuck Exp $ */ +/* $NetBSD: pmap.h,v 1.110 2011/08/13 12:09:38 cherry Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -369,7 +369,9 @@ pmap_pte_set(pt_entry_t *pte, pt_entry_t npte) { int s = splvm(); + xpq_queue_lock(); xpq_queue_pte_update(xpmap_ptetomach(pte), npte); + xpq_queue_unlock(); splx(s); } @@ -377,12 +379,14 @@ pmap_pte_cas(volatile pt_entry_t *ptep, pt_entry_t o, pt_entry_t n) { int s = splvm(); + xpq_queue_lock(); pt_entry_t opte = *ptep; if (opte == o) { xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(ptep)), n); xpq_flush_queue(); } + xpq_queue_unlock(); splx(s); return opte; } @@ -391,10 +395,12 @@ pmap_pte_testset(volatile pt_entry_t *pte, pt_entry_t npte) { int s = splvm(); + xpq_queue_lock(); pt_entry_t opte = *pte; xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(pte)), npte); xpq_flush_queue(); + xpq_queue_unlock(); splx(s); return opte; } @@ -403,8 +409,10 @@ pmap_pte_setbits(volatile pt_entry_t *pte, pt_entry_t bits) { int s = splvm(); + xpq_queue_lock(); xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(pte)), (*pte) | bits); xpq_flush_queue(); + xpq_queue_unlock(); splx(s); } @@ -412,9 +420,11 @@ pmap_pte_clearbits(volatile pt_entry_t *pte, pt_entry_t bits) { int s = splvm(); + xpq_queue_lock(); xpq_queue_pte_update(xpmap_ptetomach(__UNVOLATILE(pte)), (*pte) & ~bits); xpq_flush_queue(); + xpq_queue_unlock(); splx(s); } @@ -422,7 +432,9 @@ pmap_pte_flush(void) { int s = splvm(); + xpq_queue_lock(); xpq_flush_queue(); + xpq_queue_unlock(); splx(s); } Index: src/sys/arch/x86/include/pmap.h diff -u src/sys/arch/x86/include/pmap.h:1.40 src/sys/arch/x86/include/pmap.h:1.41 --- src/sys/arch/x86/include/pmap.h:1.40 Mon Jun 13 04:30:40 2011 +++ src/sys/arch/x86/include/pmap.h Sat Aug 13 12:09:38 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.40 2011/06/13 04:30:40 tls Exp $ */ +/* $NetBSD: pmap.h,v 1.41 2011/08/13 12:09:38 cherry Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -432,8 +432,10 @@ { int s = splvm(); + xpq_queue_lock(); xpq_queue_pte_update(xpmap_ptetomach(pte), npte); xpq_flush_queue(); + xpq_queue_unlock(); splx(s); } Index: src/sys/arch/xen/x86/x86_xpmap.c diff -u src/sys/arch/xen/x86/x86_xpmap.c:1.30 src/sys/arch/xen/x86/x86_xpmap.c:1.31 --- src/sys/arch/xen/x86/x86_xpmap.c:1.30 Sat Aug 13 11:41:57 2011 +++ src/sys/arch/xen/x86/x86_xpmap.c Sat Aug 13 12:09:38 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: x86_xpmap.c,v 1.30 2011/08/13 11:41:57 cherry Exp $ */ +/* $NetBSD: x86_xpmap.c,v 1.31 2011/08/13 12:09:38 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.30 2011/08/13 11:41:57 cherry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: x86_xpmap.c,v 1.31 2011/08/13 12:09:38 cherry Exp $"); #include "opt_xen.h" #include "opt_ddb.h" @@ -668,12 +668,13 @@ (UPAGES + 1) * NBPG); /* Finally, flush TLB. */ + xpq_queue_lock(); xpq_queue_tlb_flush(); + xpq_queue_unlock(); return (init_tables + ((count + l2_4_count) * PAGE_SIZE)); } - /* * Build a new table and switch to it * old_count is # of old tables (including PGD, PDTPE and PDE) @@ -691,6 +692,8 @@ int i; extern char __data_start; + xpq_queue_lock(); + __PRINTK(("xen_bootstrap_tables(%#" PRIxVADDR ", %#" PRIxVADDR "," " %d, %d)\n", old_pgd, new_pgd, old_count, new_count)); @@ -1024,6 +1027,7 @@ pte++; } xpq_flush_queue(); + xpq_queue_unlock(); } @@ -1054,6 +1058,7 @@ struct mmuext_op op; int s = splvm(); + KASSERT(xpq_queue_locked()); xpq_flush_queue(); op.cmd = MMUEXT_NEW_USER_BASEPTR; op.arg1.mfn = xpmap_phys_to_machine_mapping[page >> PAGE_SHIFT]; Index: src/sys/arch/xen/x86/xen_pmap.c diff -u src/sys/arch/xen/x86/xen_pmap.c:1.3 src/sys/arch/xen/x86/xen_pmap.c:1.4 --- src/sys/arch/xen/x86/xen_pmap.c:1.3 Sun Jun 12 03:35:50 2011 +++ src/sys/arch/xen/x86/xen_pmap.c Sat Aug 13 12:09:38 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: xen_pmap.c,v 1.3 2011/06/12 03:35:50 rmind Exp $ */ +/* $NetBSD: xen_pmap.c,v 1.4 2011/08/13 12:09:38 cherry Exp $ */ /* * Copyright (c) 2007 Manuel Bouyer. @@ -102,7 +102,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xen_pmap.c,v 1.3 2011/06/12 03:35:50 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xen_pmap.c,v 1.4 2011/08/13 12:09:38 cherry Exp $"); #include "opt_user_ldt.h" #include "opt_lockdebug.h" @@ -270,6 +270,7 @@ pmap_pte2pa(opde) != pmap_pdirpa(pmap, 0)) { int i; s = splvm(); + xpq_queue_lock(); /* Make recursive entry usable in user PGD */ for (i = 0; i < PDP_SIZE; i++) { npde = pmap_pa2pte( @@ -289,6 +290,7 @@ } if (pmap_valid_entry(opde)) pmap_apte_flush(ourpmap); + xpq_queue_unlock(); splx(s); } *pmap2 = ourpmap; Index: src/sys/arch/xen/x86/xenfunc.c diff -u src/sys/arch/xen/x86/xenfunc.c:1.11 src/sys/arch/xen/x86/xenfunc.c:1.12 --- src/sys/arch/xen/x86/xenfunc.c:1.11 Sat Jul 24 00:45:56 2010 +++ src/sys/arch/xen/x86/xenfunc.c Sat Aug 13 12:09:38 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: xenfunc.c,v 1.11 2010/07/24 00:45:56 jym Exp $ */ +/* $NetBSD: xenfunc.c,v 1.12 2011/08/13 12:09:38 cherry Exp $ */ /* * @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xenfunc.c,v 1.11 2010/07/24 00:45:56 jym Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xenfunc.c,v 1.12 2011/08/13 12:09:38 cherry Exp $"); #include <sys/param.h> @@ -54,7 +54,9 @@ invlpg(vaddr_t addr) { int s = splvm(); + xpq_queue_lock(); xpq_queue_invlpg(addr); + xpq_queue_unlock(); splx(s); } @@ -81,19 +83,19 @@ void ltr(u_short sel) { - __PRINTK(("XXX ltr not supported\n")); + panic("XXX ltr not supported\n"); } void lcr0(u_long val) { - __PRINTK(("XXX lcr0 not supported\n")); + panic("XXX lcr0 not supported\n"); } u_long rcr0(void) { - __PRINTK(("XXX rcr0 not supported\n")); + /* XXX: handle X86_CR0_TS ? */ return 0; } @@ -102,7 +104,9 @@ lcr3(vaddr_t val) { int s = splvm(); + xpq_queue_lock(); xpq_queue_pt_switch(xpmap_ptom_masked(val)); + xpq_queue_unlock(); splx(s); } #endif @@ -111,7 +115,9 @@ tlbflush(void) { int s = splvm(); + xpq_queue_lock(); xpq_queue_tlb_flush(); + xpq_queue_unlock(); splx(s); }