Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch Add locking around ops to the hypervisor MMU "queue".
details: https://anonhg.NetBSD.org/src/rev/4bc5e2b82389
branches: trunk
changeset: 768262:4bc5e2b82389
user: cherry <cherry%NetBSD.org@localhost>
date: Sat Aug 13 12:09:38 2011 +0000
description:
Add locking around ops to the hypervisor MMU "queue".
diffstat:
sys/arch/amd64/include/pmap.h | 15 ++++++++++++++-
sys/arch/i386/i386/machdep.c | 6 ++++--
sys/arch/i386/include/pmap.h | 14 +++++++++++++-
sys/arch/x86/include/pmap.h | 4 +++-
sys/arch/xen/x86/x86_xpmap.c | 11 ++++++++---
sys/arch/xen/x86/xen_pmap.c | 6 ++++--
sys/arch/xen/x86/xenfunc.c | 16 +++++++++++-----
7 files changed, 57 insertions(+), 15 deletions(-)
diffs (truncated from 372 to 300 lines):
diff -r 0f7d68989e7a -r 4bc5e2b82389 sys/arch/amd64/include/pmap.h
--- a/sys/arch/amd64/include/pmap.h Sat Aug 13 12:06:22 2011 +0000
+++ b/sys/arch/amd64/include/pmap.h Sat Aug 13 12:09:38 2011 +0000
@@ -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
diff -r 0f7d68989e7a -r 4bc5e2b82389 sys/arch/i386/i386/machdep.c
--- a/sys/arch/i386/i386/machdep.c Sat Aug 13 12:06:22 2011 +0000
+++ b/sys/arch/i386/i386/machdep.c Sat Aug 13 12:09:38 2011 +0000
@@ -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,
diff -r 0f7d68989e7a -r 4bc5e2b82389 sys/arch/i386/include/pmap.h
--- a/sys/arch/i386/include/pmap.h Sat Aug 13 12:06:22 2011 +0000
+++ b/sys/arch/i386/include/pmap.h Sat Aug 13 12:09:38 2011 +0000
@@ -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);
}
diff -r 0f7d68989e7a -r 4bc5e2b82389 sys/arch/x86/include/pmap.h
--- a/sys/arch/x86/include/pmap.h Sat Aug 13 12:06:22 2011 +0000
+++ b/sys/arch/x86/include/pmap.h Sat Aug 13 12:09:38 2011 +0000
@@ -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);
}
diff -r 0f7d68989e7a -r 4bc5e2b82389 sys/arch/xen/x86/x86_xpmap.c
--- a/sys/arch/xen/x86/x86_xpmap.c Sat Aug 13 12:06:22 2011 +0000
+++ b/sys/arch/xen/x86/x86_xpmap.c Sat Aug 13 12:09:38 2011 +0000
@@ -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 <mro%adviseo.fr@localhost>
@@ -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];
diff -r 0f7d68989e7a -r 4bc5e2b82389 sys/arch/xen/x86/xen_pmap.c
--- a/sys/arch/xen/x86/xen_pmap.c Sat Aug 13 12:06:22 2011 +0000
+++ b/sys/arch/xen/x86/xen_pmap.c Sat Aug 13 12:09:38 2011 +0000
@@ -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);
}
Home |
Main Index |
Thread Index |
Old Index