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