Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/alpha - Track the currently-activated pmap in struc...



details:   https://anonhg.NetBSD.org/src/rev/0506c9bb5e52
branches:  trunk
changeset: 1012962:0506c9bb5e52
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Mon Aug 17 00:57:37 2020 +0000

description:
- Track the currently-activated pmap in struct cpu_info.
- Reserve some space in struct cpu_info for future pmap changes.

diffstat:

 sys/arch/alpha/alpha/pmap.c  |  40 ++++++++++++++++++++++++++--------------
 sys/arch/alpha/include/cpu.h |   8 +++++++-
 2 files changed, 33 insertions(+), 15 deletions(-)

diffs (128 lines):

diff -r 7cc87e22764b -r 0506c9bb5e52 sys/arch/alpha/alpha/pmap.c
--- a/sys/arch/alpha/alpha/pmap.c       Mon Aug 17 00:55:05 2020 +0000
+++ b/sys/arch/alpha/alpha/pmap.c       Mon Aug 17 00:57:37 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.267 2020/08/16 20:04:36 thorpej Exp $ */
+/* $NetBSD: pmap.c,v 1.268 2020/08/17 00:57:37 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998, 1999, 2000, 2001, 2007, 2008 The NetBSD Foundation, Inc.
@@ -140,7 +140,7 @@
 
 #include <sys/cdefs.h>                 /* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.267 2020/08/16 20:04:36 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.268 2020/08/17 00:57:37 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -2035,9 +2035,8 @@
 void
 pmap_activate(struct lwp *l)
 {
-       struct pmap *pmap = l->l_proc->p_vmspace->vm_map.pmap;
-       struct pcb *pcb = lwp_getpcb(l);
-       long cpu_id = cpu_number();
+       struct pmap * const pmap = l->l_proc->p_vmspace->vm_map.pmap;
+       struct pcb * const pcb = lwp_getpcb(l);
 
 #ifdef DEBUG
        if (pmapdebug & PDB_FOLLOW)
@@ -2045,21 +2044,24 @@
 #endif
 
        KASSERT(kpreempt_disabled());
-       KASSERT(l == curlwp);
+
+       struct cpu_info * const ci = curcpu();
+
+       KASSERT(l == ci->ci_curlwp);
 
        /* Mark the pmap in use by this processor. */
-       atomic_or_ulong(&pmap->pm_cpus, (1UL << cpu_id));
+       atomic_or_ulong(&pmap->pm_cpus, (1UL << ci->ci_cpuid));
 
        /* Allocate an ASN. */
-       pmap_asn_alloc(pmap, cpu_id);
-       PMAP_ACTIVATE_ASN_SANITY(pmap, cpu_id);
+       pmap_asn_alloc(pmap, ci->ci_cpuid);
+       PMAP_ACTIVATE_ASN_SANITY(pmap, ci->ci_cpuid);
 
        u_long const old_ptbr = pcb->pcb_hw.apcb_ptbr;
        u_int const old_asn = pcb->pcb_hw.apcb_asn;
 
        pcb->pcb_hw.apcb_ptbr =
            ALPHA_K0SEG_TO_PHYS((vaddr_t)pmap->pm_lev1map) >> PGSHIFT;
-       pcb->pcb_hw.apcb_asn = (pmap)->pm_asni[cpu_id].pma_asn;
+       pcb->pcb_hw.apcb_asn = (pmap)->pm_asni[ci->ci_cpuid].pma_asn;
 
        /*
         * Check to see if the ASN or page table base has changed; if
@@ -2072,6 +2074,8 @@
            old_ptbr != pcb->pcb_hw.apcb_ptbr) {
                (void) alpha_pal_swpctx((u_long)l->l_md.md_pcbpaddr);
        }
+
+       ci->ci_pmap = pmap;
 }
 
 /*
@@ -2083,7 +2087,7 @@
 void
 pmap_deactivate(struct lwp *l)
 {
-       struct pmap *pmap = l->l_proc->p_vmspace->vm_map.pmap;
+       struct pmap * const pmap = l->l_proc->p_vmspace->vm_map.pmap;
 
 #ifdef DEBUG
        if (pmapdebug & PDB_FOLLOW)
@@ -2091,16 +2095,24 @@
 #endif
 
        KASSERT(kpreempt_disabled());
-       KASSERT(l == curlwp);
-
-       atomic_and_ulong(&pmap->pm_cpus, ~(1UL << cpu_number()));
+
+       struct cpu_info * const ci = curcpu();
+
+       KASSERT(l == ci->ci_curlwp);
+
+       atomic_and_ulong(&pmap->pm_cpus, ~(1UL << ci->ci_cpuid));
 
        /*
         * There is no need to switch to a different PTBR here,
         * because a pmap_activate() or SWPCTX is guaranteed
         * before whatever lev1map we're on now is invalidated
         * or before user space is accessed again.
+        *
+        * Because only kernel mappings will be accessed before the
+        * next pmap_activate() call, we consider our CPU to be on
+        * the kernel pmap.
         */
+       ci->ci_pmap = pmap_kernel();
 }
 
 /*
diff -r 7cc87e22764b -r 0506c9bb5e52 sys/arch/alpha/include/cpu.h
--- a/sys/arch/alpha/include/cpu.h      Mon Aug 17 00:55:05 2020 +0000
+++ b/sys/arch/alpha/include/cpu.h      Mon Aug 17 00:57:37 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.86 2019/12/01 15:34:44 ad Exp $ */
+/* $NetBSD: cpu.h,v 1.87 2020/08/17 00:57:37 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc.
@@ -128,6 +128,12 @@
        struct trapframe *ci_db_regs;   /* registers for debuggers */
        uint64_t ci_pcc_freq;           /* cpu cycles/second */
 
+#define        CPU_INFO_PMAP_DATA_NQWORDS      16
+
+       struct pmap *ci_pmap;           /* currently-activated pmap */
+                                       /* data used by pmap module */
+       u_long ci_pmap_data[CPU_INFO_PMAP_DATA_NQWORDS];
+
 #if defined(MULTIPROCESSOR)
        volatile u_long ci_flags;       /* flags; see below */
        volatile u_long ci_ipis;        /* interprocessor interrupts pending */



Home | Main Index | Thread Index | Old Index