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