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);
 }
 

Reply via email to