Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/x86 rename sys/arch/x86/x86/pmap_tlb.c to sys/arch/...



details:   https://anonhg.NetBSD.org/src/rev/8c8ad130e86e
branches:  trunk
changeset: 829227:8c8ad130e86e
user:      jdolecek <jdolecek%NetBSD.org@localhost>
date:      Mon Jan 22 19:37:45 2018 +0000

description:
rename sys/arch/x86/x86/pmap_tlb.c to sys/arch/x86/x86/x86_tlb.c, so that
x86 can eventually use uvm/pmap/pmap_tlb.c; step to future PCID support

diffstat:

 sys/arch/x86/conf/files.x86 |    4 +-
 sys/arch/x86/x86/pmap_tlb.c |  478 --------------------------------------------
 sys/arch/x86/x86/x86_tlb.c  |  478 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 480 insertions(+), 480 deletions(-)

diffs (truncated from 982 to 300 lines):

diff -r ff7e12335d17 -r 8c8ad130e86e sys/arch/x86/conf/files.x86
--- a/sys/arch/x86/conf/files.x86       Mon Jan 22 18:15:56 2018 +0000
+++ b/sys/arch/x86/conf/files.x86       Mon Jan 22 19:37:45 2018 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: files.x86,v 1.91 2018/01/08 01:41:34 christos Exp $
+#      $NetBSD: files.x86,v 1.92 2018/01/22 19:37:45 jdolecek Exp $
 
 # options for MP configuration through the MP spec
 defflag opt_mpbios.h MPBIOS MPVERBOSE MPDEBUG MPBIOS_SCANPCI
@@ -94,7 +94,7 @@
 file   arch/x86/x86/patch.c            machdep
 file   arch/x86/x86/platform.c         machdep
 file   arch/x86/x86/pmap.c             machdep
-file   arch/x86/x86/pmap_tlb.c         machdep
+file   arch/x86/x86/x86_tlb.c          machdep
 file   arch/x86/x86/pmc.c              machdep
 file   arch/x86/x86/procfs_machdep.c   procfs
 file   arch/x86/x86/sys_machdep.c      machdep
diff -r ff7e12335d17 -r 8c8ad130e86e sys/arch/x86/x86/pmap_tlb.c
--- a/sys/arch/x86/x86/pmap_tlb.c       Mon Jan 22 18:15:56 2018 +0000
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,478 +0,0 @@
-/*     $NetBSD: pmap_tlb.c,v 1.8 2016/11/13 12:58:40 maxv Exp $        */
-
-/*-
- * Copyright (c) 2008-2012 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Andrew Doran and Mindaugas Rasiukevicius.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * x86 pmap(9) module: TLB shootdowns.
- *
- * TLB shootdowns are hard interrupts that operate outside the SPL framework.
- * They do not need to be blocked, provided that the pmap module gets the
- * order of events correct.  The calls are made by poking the LAPIC directly.
- * The interrupt handler is short and does one of the following: invalidate
- * a set of pages, all user TLB entries or the entire TLB.
- */
-
-#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap_tlb.c,v 1.8 2016/11/13 12:58:40 maxv Exp $");
-
-#include <sys/param.h>
-#include <sys/kernel.h>
-
-#include <sys/systm.h>
-#include <sys/atomic.h>
-#include <sys/cpu.h>
-#include <sys/intr.h>
-#include <uvm/uvm.h>
-
-#include <machine/cpuvar.h>
-#ifdef XEN
-#include <xen/xenpmap.h>
-#endif /* XEN */
-#include <x86/i82489reg.h>
-#include <x86/i82489var.h>
-
-/*
- * TLB shootdown structures.
- */
-
-typedef struct {
-#ifdef _LP64
-       uintptr_t               tp_va[14];      /* whole struct: 128 bytes */
-#else
-       uintptr_t               tp_va[13];      /* whole struct: 64 bytes */
-#endif
-       uint16_t                tp_count;
-       uint16_t                tp_pte;
-       int                     tp_userpmap;
-       kcpuset_t *             tp_cpumask;
-} pmap_tlb_packet_t;
-
-/*
- * No more than N separate invlpg.
- *
- * Statistically, a value of six is big enough to cover the requested number
- * of pages in ~ 95% of the TLB shootdowns we are getting. We therefore rarely
- * reach the limit, and increasing it can actually reduce the performance due
- * to the high cost of invlpg.
- */
-#define        TP_MAXVA                6
-
-/*
- * TLB shootdown state.
- */
-static pmap_tlb_packet_t       pmap_tlb_packet         __cacheline_aligned;
-static volatile u_int          pmap_tlb_pendcount      __cacheline_aligned;
-static volatile u_int          pmap_tlb_gen            __cacheline_aligned;
-static struct evcnt            pmap_tlb_evcnt          __cacheline_aligned;
-
-/*
- * TLB shootdown statistics.
- */
-#ifdef TLBSTATS
-static struct evcnt            tlbstat_local[TLBSHOOT__MAX];
-static struct evcnt            tlbstat_remote[TLBSHOOT__MAX];
-static struct evcnt            tlbstat_kernel[TLBSHOOT__MAX];
-static struct evcnt            tlbstat_single_req;
-static struct evcnt            tlbstat_single_issue;
-static const char *            tlbstat_name[ ] = {
-       "APTE",
-       "KENTER",
-       "KREMOVE",
-       "FREE_PTP1",
-       "FREE_PTP2",
-       "REMOVE_PTE",
-       "REMOVE_PTES",
-       "SYNC_PV1",
-       "SYNC_PV2",
-       "WRITE_PROTECT",
-       "ENTER",
-       "UPDATE",
-       "BUS_DMA",
-       "BUS_SPACE"
-};
-#endif
-
-void
-pmap_tlb_init(void)
-{
-
-       memset(&pmap_tlb_packet, 0, sizeof(pmap_tlb_packet_t));
-       pmap_tlb_pendcount = 0;
-       pmap_tlb_gen = 0;
-
-       evcnt_attach_dynamic(&pmap_tlb_evcnt, EVCNT_TYPE_INTR,
-           NULL, "TLB", "shootdown");
-
-#ifdef TLBSTATS
-       int i;
-
-       for (i = 0; i < TLBSHOOT__MAX; i++) {
-               evcnt_attach_dynamic(&tlbstat_local[i], EVCNT_TYPE_MISC,
-                   NULL, "tlbshoot local", tlbstat_name[i]);
-       }
-       for (i = 0; i < TLBSHOOT__MAX; i++) {
-               evcnt_attach_dynamic(&tlbstat_remote[i], EVCNT_TYPE_MISC,
-                   NULL, "tlbshoot remote", tlbstat_name[i]);
-       }
-       for (i = 0; i < TLBSHOOT__MAX; i++) {
-               evcnt_attach_dynamic(&tlbstat_kernel[i], EVCNT_TYPE_MISC,
-                   NULL, "tlbshoot kernel", tlbstat_name[i]);
-       }
-       evcnt_attach_dynamic(&tlbstat_single_req, EVCNT_TYPE_MISC,
-           NULL, "tlbshoot single page", "requests");
-       evcnt_attach_dynamic(&tlbstat_single_issue, EVCNT_TYPE_MISC,
-           NULL, "tlbshoot single page", "issues");
-#endif
-}
-
-void
-pmap_tlb_cpu_init(struct cpu_info *ci)
-{
-       pmap_tlb_packet_t *tp = (pmap_tlb_packet_t *)ci->ci_pmap_data;
-
-       memset(tp, 0, sizeof(pmap_tlb_packet_t));
-       kcpuset_create(&tp->tp_cpumask, true);
-}
-
-static inline void
-pmap_tlbstat_count(struct pmap *pm, vaddr_t va, tlbwhy_t why)
-{
-#ifdef TLBSTATS
-       const cpuid_t cid = cpu_index(curcpu());
-       bool local = false, remote = false;
-
-       if (va != (vaddr_t)-1LL) {
-               atomic_inc_64(&tlbstat_single_req.ev_count);
-       }
-       if (pm == pmap_kernel()) {
-               atomic_inc_64(&tlbstat_kernel[why].ev_count);
-               return;
-       }
-
-       if (va >= VM_MAXUSER_ADDRESS) {
-               remote = kcpuset_isotherset(pm->pm_kernel_cpus, cid);
-               local = kcpuset_isset(pm->pm_kernel_cpus, cid);
-       }
-       remote |= kcpuset_isotherset(pm->pm_cpus, cid);
-       local |= kcpuset_isset(pm->pm_cpus, cid);
-
-       if (local) {
-               atomic_inc_64(&tlbstat_local[why].ev_count);
-       }
-       if (remote) {
-               atomic_inc_64(&tlbstat_remote[why].ev_count);
-       }
-#endif
-}
-
-static inline void
-pmap_tlb_invalidate(const pmap_tlb_packet_t *tp)
-{
-       int i;
-
-       /* Find out what we need to invalidate. */
-       if (tp->tp_count == (uint16_t)-1) {
-               u_int egen = uvm_emap_gen_return();
-               if (tp->tp_pte & PG_G) {
-                       /* Invalidating user and kernel TLB entries. */
-                       tlbflushg();
-               } else {
-                       /* Invalidating user TLB entries only. */
-                       tlbflush();
-               }
-               uvm_emap_update(egen);
-       } else {
-               /* Invalidating a single page or a range of pages. */
-               for (i = tp->tp_count - 1; i >= 0; i--) {
-                       pmap_update_pg(tp->tp_va[i]);
-               }
-       }
-}
-
-/*
- * pmap_tlb_shootdown: invalidate a page on all CPUs using pmap 'pm'.
- */
-void
-pmap_tlb_shootdown(struct pmap *pm, vaddr_t va, pt_entry_t pte, tlbwhy_t why)
-{
-       pmap_tlb_packet_t *tp;
-       int s;
-
-#ifndef XEN
-       KASSERT((pte & PG_G) == 0 || pm == pmap_kernel());
-#endif
-
-       /*
-        * If tearing down the pmap, do nothing.  We will flush later
-        * when we are ready to recycle/destroy it.
-        */
-       if (__predict_false(curlwp->l_md.md_gc_pmap == pm)) {
-               return;
-       }
-
-       if ((pte & PG_PS) != 0) {
-               va &= PG_LGFRAME;
-       }
-
-       /*
-        * Add the shootdown operation to our pending set.
-        */
-       s = splvm();
-       tp = (pmap_tlb_packet_t *)curcpu()->ci_pmap_data;
-
-       /* Whole address flush will be needed if PG_G is set. */
-       CTASSERT(PG_G == (uint16_t)PG_G);
-       tp->tp_pte |= (uint16_t)pte;
-
-       if (tp->tp_count == (uint16_t)-1) {
-               /*
-                * Already flushing everything.
-                */
-       } else if (tp->tp_count < TP_MAXVA && va != (vaddr_t)-1LL) {
-               /* Flush a single page. */
-               tp->tp_va[tp->tp_count++] = va;
-               KASSERT(tp->tp_count > 0);
-       } else {
-               /* Flush everything. */
-               tp->tp_count = (uint16_t)-1;
-       }
-
-       if (pm != pmap_kernel()) {
-               kcpuset_merge(tp->tp_cpumask, pm->pm_cpus);
-               if (va >= VM_MAXUSER_ADDRESS) {
-                       kcpuset_merge(tp->tp_cpumask, pm->pm_kernel_cpus);
-               }
-               tp->tp_userpmap = 1;
-       } else {
-               kcpuset_copy(tp->tp_cpumask, kcpuset_running);
-       }
-       pmap_tlbstat_count(pm, va, why);
-       splx(s);
-}



Home | Main Index | Thread Index | Old Index