Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/xen Always call the xpq_queue*() functions at splvm...
details: https://anonhg.NetBSD.org/src/rev/9b8652de715c
branches: trunk
changeset: 581123:9b8652de715c
user: bouyer <bouyer%NetBSD.org@localhost>
date: Thu May 26 13:54:43 2005 +0000
description:
Always call the xpq_queue*() functions at splvm(), so that it's safe to call
them from interrupt context.
xpq_flush_queue() is called from IPL_NET in if_xennet.c, and
other xpq_queue* functions may be called from interrupt context via
pmap_kenter*(). Should fix port-xen/30153.
Thanks to Jason Thorpe and YAMAMOTO Takashi for enlightments on this issue.
diffstat:
sys/arch/xen/i386/pmap.c | 12 +++++++++-
sys/arch/xen/i386/xen_machdep.c | 9 ++++++-
sys/arch/xen/include/xenfunc.h | 8 ++++++-
sys/arch/xen/include/xenpmap.h | 44 ++++++++++++++++++++++++++++++++++++++++-
sys/arch/xen/xen/if_xennet.c | 17 ++++++++++-----
5 files changed, 78 insertions(+), 12 deletions(-)
diffs (truncated from 388 to 300 lines):
diff -r 6338de496cc0 -r 9b8652de715c sys/arch/xen/i386/pmap.c
--- a/sys/arch/xen/i386/pmap.c Thu May 26 02:59:34 2005 +0000
+++ b/sys/arch/xen/i386/pmap.c Thu May 26 13:54:43 2005 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.10 2005/04/16 08:49:29 yamt Exp $ */
+/* $NetBSD: pmap.c,v 1.11 2005/05/26 13:54:43 bouyer Exp $ */
/* NetBSD: pmap.c,v 1.179 2004/10/10 09:55:24 yamt Exp */
/*
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.10 2005/04/16 08:49:29 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.11 2005/05/26 13:54:43 bouyer Exp $");
#include "opt_cputype.h"
#include "opt_user_ldt.h"
@@ -852,6 +852,7 @@
pte_atomic_update_ma(pt_entry_t *pte, pt_entry_t *mapte, pt_entry_t npte)
{
pt_entry_t opte;
+ int s = splvm();
XENPRINTK(("pte_atomic_update_ma pte %p mapte %p npte %08x\n",
pte, mapte, npte));
@@ -877,6 +878,7 @@
xpq_queue_pte_update(mapte, npte);
}
xpq_flush_queue();
+ splx(s);
return opte;
}
@@ -1830,6 +1832,7 @@
{
pd_entry_t *pdir = object;
paddr_t pdirpa;
+ int s;
/*
* NOTE: The `pmap_lock' is held when the PDP is allocated.
@@ -1859,8 +1862,10 @@
pmap_update(pmap_kernel());
/* pin page type */
+ s = splvm();
xpq_queue_pin_table(xpmap_ptom(pdirpa), XPQ_PIN_L2_TABLE);
xpq_flush_queue();
+ splx(s);
return (0);
}
@@ -1870,6 +1875,7 @@
{
pd_entry_t *pdir = object;
paddr_t pdirpa;
+ int s;
/* fetch the physical address of the page directory. */
pdirpa = PDE_GET(&pdir[PDSLOT_PTE]) & PG_FRAME;
@@ -1877,8 +1883,10 @@
XENPRINTF(("pmap_pdp_dtor %p %p\n", pdir, (void *)pdirpa));
/* unpin page type */
+ s = splvm();
xpq_queue_unpin_table(xpmap_ptom(pdirpa));
xpq_flush_queue();
+ splx(s);
pmap_kenter_pa((vaddr_t)pdir, pdirpa, VM_PROT_READ | VM_PROT_WRITE);
pmap_update(pmap_kernel());
}
diff -r 6338de496cc0 -r 9b8652de715c sys/arch/xen/i386/xen_machdep.c
--- a/sys/arch/xen/i386/xen_machdep.c Thu May 26 02:59:34 2005 +0000
+++ b/sys/arch/xen/i386/xen_machdep.c Thu May 26 13:54:43 2005 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: xen_machdep.c,v 1.7 2005/04/16 08:49:29 yamt Exp $ */
+/* $NetBSD: xen_machdep.c,v 1.8 2005/05/26 13:54:43 bouyer Exp $ */
/*
*
@@ -33,7 +33,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xen_machdep.c,v 1.7 2005/04/16 08:49:29 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xen_machdep.c,v 1.8 2005/05/26 13:54:43 bouyer Exp $");
#include "opt_xen.h"
@@ -94,6 +94,7 @@
{
vaddr_t va;
pt_entry_t *ptp, *maptp;
+ int s;
for (va = base; va < base + entries * sizeof(union descriptor);
va += PAGE_SIZE) {
@@ -104,10 +105,12 @@
entries, ptp, maptp));
PTE_CLEARBITS(ptp, maptp, PG_RW);
}
+ s = splvm();
PTE_UPDATES_FLUSH();
xpq_queue_set_ldt(base, entries);
xpq_flush_queue();
+ splx(s);
}
void
@@ -684,12 +687,14 @@
void
xpq_flush_cache()
{
+ int s = splvm();
XENPRINTK2(("xpq_queue_flush_cache\n"));
xpq_queue[xpq_idx].pa.ptr = MMU_EXTENDED_COMMAND;
xpq_queue[xpq_idx].pa.val = MMUEXT_FLUSH_CACHE;
xpq_increment_idx();
xpq_flush_queue();
+ splx(s);
}
diff -r 6338de496cc0 -r 9b8652de715c sys/arch/xen/include/xenfunc.h
--- a/sys/arch/xen/include/xenfunc.h Thu May 26 02:59:34 2005 +0000
+++ b/sys/arch/xen/include/xenfunc.h Thu May 26 13:54:43 2005 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: xenfunc.h,v 1.5 2005/04/22 14:47:39 yamt Exp $ */
+/* $NetBSD: xenfunc.h,v 1.6 2005/05/26 13:54:43 bouyer Exp $ */
/*
*
@@ -53,8 +53,10 @@
static __inline void
invlpg(u_int addr)
{
+ int s = splvm();
xpq_queue_invlpg(addr);
xpq_flush_queue();
+ splx(s);
}
static __inline void
@@ -92,16 +94,20 @@
static __inline void
_lcr3(u_int val, char *file, int line)
{
+ int s = splvm();
/* __PRINTK(("lcr3 %08x at %s:%d\n", val, file, line)); */
xpq_queue_pt_switch(xpmap_ptom(val) & PG_FRAME);
xpq_flush_queue();
+ splx(s);
}
static __inline void
tlbflush(void)
{
+ int s = splvm();
xpq_queue_tlb_flush();
xpq_flush_queue();
+ splx(s);
}
#define tlbflushg() tlbflush() /* we don't use PGE */
diff -r 6338de496cc0 -r 9b8652de715c sys/arch/xen/include/xenpmap.h
--- a/sys/arch/xen/include/xenpmap.h Thu May 26 02:59:34 2005 +0000
+++ b/sys/arch/xen/include/xenpmap.h Thu May 26 13:54:43 2005 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: xenpmap.h,v 1.5 2005/04/16 08:49:29 yamt Exp $ */
+/* $NetBSD: xenpmap.h,v 1.6 2005/05/26 13:54:43 bouyer Exp $ */
/*
*
@@ -83,87 +83,129 @@
#define PDE_GET(_pdp) \
(pmap_valid_entry(*(_pdp)) ? xpmap_mtop(*(_pdp)) : *(_pdp))
#define PDE_SET(_pdp,_mapdp,_npde) do { \
+ int s = splvm(); \
xpq_queue_pde_update((_mapdp), xpmap_ptom((_npde))); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PDE_CLEAR(_pdp,_mapdp) do { \
+ int s = splvm(); \
xpq_queue_pde_update((_mapdp), 0); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PTE_GET(_ptp) \
(pmap_valid_entry(*(_ptp)) ? xpmap_mtop(*(_ptp)) : *(_ptp))
#define PTE_GET_MA(_ptp) \
*(_ptp)
#define PTE_SET(_ptp,_maptp,_npte) do { \
+ int s = splvm(); \
xpq_queue_pte_update((_maptp), xpmap_ptom((_npte))); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PTE_SET_MA(_ptp,_maptp,_npte) do { \
+ int s = splvm(); \
xpq_queue_pte_update((_maptp), (_npte)); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PTE_SET_MA_UNCHECKED(_ptp,_maptp,_npte) do { \
+ s = splvm(); \
xpq_queue_unchecked_pte_update((_maptp), (_npte)); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PTE_CLEAR(_ptp,_maptp) do { \
+ int s = splvm(); \
xpq_queue_pte_update((_maptp), 0); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PTE_ATOMIC_SET(_ptp,_maptp,_npte,_opte) do { \
+ int s; \
(_opte) = PTE_GET(_ptp); \
+ s = splvm(); \
xpq_queue_pte_update((_maptp), xpmap_ptom((_npte))); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PTE_ATOMIC_SET_MA(_ptp,_maptp,_npte,_opte) do { \
+ int s; \
(_opte) = *(_ptp); \
+ s = splvm(); \
xpq_queue_pte_update((_maptp), (_npte)); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PTE_ATOMIC_CLEAR(_ptp,_maptp,_opte) do { \
+ int s; \
(_opte) = PTE_GET(_ptp); \
+ s = splvm(); \
xpq_queue_pte_update((_maptp), 0); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PTE_ATOMIC_CLEAR_MA(_ptp,_maptp,_opte) do { \
+ int s; \
(_opte) = *(_ptp); \
+ s = splvm(); \
xpq_queue_pte_update((_maptp), 0); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PDE_CLEARBITS(_pdp,_mapdp,_bits) do { \
+ int s = splvm(); \
xpq_queue_pte_update((_mapdp), *(_pdp) & ~((_bits) & ~PG_FRAME)); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PTE_CLEARBITS(_ptp,_maptp,_bits) do { \
+ int s = splvm(); \
xpq_queue_pte_update((_maptp), *(_ptp) & ~((_bits) & ~PG_FRAME)); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PDE_ATOMIC_CLEARBITS(_pdp,_mapdp,_bits) do { \
+ int s = splvm(); \
xpq_queue_pde_update((_mapdp), *(_pdp) & ~((_bits) & ~PG_FRAME)); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PTE_ATOMIC_CLEARBITS(_ptp,_maptp,_bits) do { \
+ int s = splvm(); \
xpq_queue_pte_update((_maptp), *(_ptp) & ~((_bits) & ~PG_FRAME)); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PTE_SETBITS(_ptp,_maptp,_bits) do { \
+ int s = splvm(); \
xpq_queue_pte_update((_maptp), *(_ptp) | ((_bits) & ~PG_FRAME)); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PDE_ATOMIC_SETBITS(_pdp,_mapdp,_bits) do { \
+ int s = splvm(); \
xpq_queue_pde_update((_mapdp), *(_pdp) | ((_bits) & ~PG_FRAME)); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PTE_ATOMIC_SETBITS(_ptp,_maptp,_bits) do { \
+ int s = splvm(); \
xpq_queue_pte_update((_maptp), *(_ptp) | ((_bits) & ~PG_FRAME)); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PDE_COPY(_dpdp,_madpdp,_spdp) do { \
+ int s = splvm(); \
xpq_queue_pde_update((_madpdp), *(_spdp)); \
xpq_flush_queue(); \
+ splx(s); \
} while (/*CONSTCOND*/0)
#define PTE_UPDATES_FLUSH() do { \
Home |
Main Index |
Thread Index |
Old Index