Source-Changes-HG archive

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

[src/trunk]: src/sys/uvm Reduce memory spent on bookkeeping for large values ...



details:   https://anonhg.NetBSD.org/src/rev/88bbd949bf5e
branches:  trunk
changeset: 754269:88bbd949bf5e
user:      ad <ad%NetBSD.org@localhost>
date:      Sun Apr 25 15:54:14 2010 +0000

description:
Reduce memory spent on bookkeeping for large values of MAXCPUS.

diffstat:

 sys/uvm/uvm.h      |  30 ++++++++++++++++++++++++++++--
 sys/uvm/uvm_emap.c |  16 +++++++++-------
 sys/uvm/uvm_page.c |  49 +++++++++++++++++++++++++++++++++++++------------
 3 files changed, 74 insertions(+), 21 deletions(-)

diffs (192 lines):

diff -r 4b72b4f66b33 -r 88bbd949bf5e sys/uvm/uvm.h
--- a/sys/uvm/uvm.h     Sun Apr 25 15:39:41 2010 +0000
+++ b/sys/uvm/uvm.h     Sun Apr 25 15:54:14 2010 +0000
@@ -1,4 +1,30 @@
-/*     $NetBSD: uvm.h,v 1.57 2009/10/21 21:12:07 rmind Exp $   */
+/*     $NetBSD: uvm.h,v 1.58 2010/04/25 15:54:14 ad Exp $      */
+
+/*
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * 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.
+ */
 
 /*
  *
@@ -110,7 +136,7 @@
        TAILQ_HEAD(, buf) aio_done;             /* done async i/o reqs */
 
        /* per-cpu data */
-       struct uvm_cpu cpus[MAXCPUS];
+       struct uvm_cpu *cpus[MAXCPUS];
 };
 
 /*
diff -r 4b72b4f66b33 -r 88bbd949bf5e sys/uvm/uvm_emap.c
--- a/sys/uvm/uvm_emap.c        Sun Apr 25 15:39:41 2010 +0000
+++ b/sys/uvm/uvm_emap.c        Sun Apr 25 15:54:14 2010 +0000
@@ -1,7 +1,7 @@
-/*     $NetBSD: uvm_emap.c,v 1.6 2009/11/07 07:27:49 cegger Exp $      */
+/*     $NetBSD: uvm_emap.c,v 1.7 2010/04/25 15:54:14 ad Exp $  */
 
 /*-
- * Copyright (c) 2009 The NetBSD Foundation, Inc.
+ * Copyright (c) 2009, 2010 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -46,11 +46,11 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_emap.c,v 1.6 2009/11/07 07:27:49 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_emap.c,v 1.7 2010/04/25 15:54:14 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
-
+#include <sys/cpu.h>
 #include <sys/atomic.h>
 #include <sys/lwp.h>
 #include <sys/vmem.h>
@@ -105,9 +105,11 @@
 #endif
        /* Initial generation value is 1. */
        uvm_emap_gen = 1;
-       for (i = 0; i < MAXCPUS; i++) {
-               ucpu = &uvm.cpus[i];
-               ucpu->emap_gen = 1;
+       for (i = 0; i < maxcpus; i++) {
+               ucpu = uvm.cpus[i];
+               if (ucpu != NULL) {
+                       ucpu->emap_gen = 1;
+               }
        }
 }
 
diff -r 4b72b4f66b33 -r 88bbd949bf5e sys/uvm/uvm_page.c
--- a/sys/uvm/uvm_page.c        Sun Apr 25 15:39:41 2010 +0000
+++ b/sys/uvm/uvm_page.c        Sun Apr 25 15:54:14 2010 +0000
@@ -1,4 +1,30 @@
-/*     $NetBSD: uvm_page.c,v 1.154 2010/02/24 00:01:12 jym Exp $       */
+/*     $NetBSD: uvm_page.c,v 1.155 2010/04/25 15:54:14 ad Exp $        */
+
+/*
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * 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.
+ */
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -71,7 +97,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.154 2010/02/24 00:01:12 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.155 2010/04/25 15:54:14 ad Exp $");
 
 #include "opt_ddb.h"
 #include "opt_uvmhist.h"
@@ -105,11 +131,7 @@
 /*
  * Some supported CPUs in a given architecture don't support all
  * of the things necessary to do idle page zero'ing efficiently.
- * We therefore provide a way to disable it from machdep code here.
- */
-/*
- * XXX disabled until we can find a way to do this without causing
- * problems for either CPU caches or DMA latency.
+ * We therefore provide a way to enable it from machdep code here.
  */
 bool vm_page_zero_enable = false;
 
@@ -339,6 +361,7 @@
 void
 uvm_page_init(vaddr_t *kvm_startp, vaddr_t *kvm_endp)
 {
+       static struct uvm_cpu boot_cpu;
        psize_t freepages, pagecount, bucketcount, n;
        struct pgflbucket *bucketarray, *cpuarray;
        struct vm_page *pagearray;
@@ -355,7 +378,8 @@
         * structures).
         */
 
-       curcpu()->ci_data.cpu_uvm = &uvm.cpus[0];
+       uvm.cpus[0] = &boot_cpu;
+       curcpu()->ci_data.cpu_uvm = &boot_cpu;
        uvm_reclaim_init();
        uvmpdpol_init();
        mutex_init(&uvm_pageqlock, MUTEX_DRIVER, IPL_NONE);
@@ -419,9 +443,9 @@
                uvm.page_free[lcv].pgfl_buckets =
                    (bucketarray + (lcv * uvmexp.ncolors));
                uvm_page_init_buckets(&uvm.page_free[lcv]);
-               uvm.cpus[0].page_free[lcv].pgfl_buckets =
+               uvm.cpus[0]->page_free[lcv].pgfl_buckets =
                    (cpuarray + (lcv * uvmexp.ncolors));
-               uvm_page_init_buckets(&uvm.cpus[0].page_free[lcv]);
+               uvm_page_init_buckets(&uvm.cpus[0]->page_free[lcv]);
        }
        memset(pagearray, 0, pagecount * sizeof(struct vm_page));
 
@@ -481,7 +505,7 @@
         * determine if we should zero pages in the idle loop.
         */
 
-       uvm.cpus[0].page_idle_zero = vm_page_zero_enable;
+       uvm.cpus[0]->page_idle_zero = vm_page_zero_enable;
 
        /*
         * done!
@@ -974,7 +998,8 @@
        bucketcount = uvmexp.ncolors * VM_NFREELIST;
        bucketarray = malloc(bucketcount * sizeof(struct pgflbucket),
            M_VMPAGE, M_WAITOK);
-       ucpu = &uvm.cpus[cpu_index(ci)];
+       ucpu = kmem_zalloc(sizeof(*ucpu), KM_SLEEP);
+       uvm.cpus[cpu_index(ci)] = ucpu;
        ci->ci_data.cpu_uvm = ucpu;
        for (lcv = 0; lcv < VM_NFREELIST; lcv++) {
                pgfl.pgfl_buckets = (bucketarray + (lcv * uvmexp.ncolors));



Home | Main Index | Thread Index | Old Index