Module Name: src
Committed By: snj
Date: Tue Dec 1 19:29:54 UTC 2009
Modified Files:
src/sys/arch/amd64/amd64 [netbsd-5]: machdep.c
src/sys/arch/amd64/include [netbsd-5]: vmparam.h
Log Message:
Apply patch (requested by bouyer in ticket 1158):
On amd64, add a third free list distinct from the default free list, holding
RAM between 16Mb and 4Gb. This helps preventing bus_dma(9) memory
allocation failures for 32bit DMA on large-memory machines.
To generate a diff of this commit:
cvs rdiff -u -r1.102.4.11 -r1.102.4.12 src/sys/arch/amd64/amd64/machdep.c
cvs rdiff -u -r1.18 -r1.18.20.1 src/sys/arch/amd64/include/vmparam.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/amd64/machdep.c
diff -u src/sys/arch/amd64/amd64/machdep.c:1.102.4.11 src/sys/arch/amd64/amd64/machdep.c:1.102.4.12
--- src/sys/arch/amd64/amd64/machdep.c:1.102.4.11 Sat Oct 3 23:49:50 2009
+++ src/sys/arch/amd64/amd64/machdep.c Tue Dec 1 19:29:54 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.102.4.11 2009/10/03 23:49:50 snj Exp $ */
+/* $NetBSD: machdep.c,v 1.102.4.12 2009/12/01 19:29:54 snj Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007, 2008
@@ -112,7 +112,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.102.4.11 2009/10/03 23:49:50 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.102.4.12 2009/12/01 19:29:54 snj Exp $");
/* #define XENDEBUG_LOW */
@@ -1375,7 +1375,7 @@
struct mem_segment_descriptor *ldt_segp;
int x;
#ifndef XEN
- int first16q, ist;
+ int first16q, first4gq, ist;
extern struct extent *iomem_ex;
uint64_t seg_start, seg_end;
uint64_t seg_start1, seg_end1;
@@ -1585,11 +1585,19 @@
* all of the ISA DMA'able memory won't be eaten up
* first-off).
*/
- if (avail_end <= (16 * 1024 * 1024))
+#define ADDR_16M (16 * 1024 * 1024)
+#define ADDR_4G (4ULL * 1024 * 1024 * 1024)
+
+ if (avail_end <= ADDR_16M)
first16q = VM_FREELIST_DEFAULT;
else
first16q = VM_FREELIST_FIRST16;
+ if (avail_end <= ADDR_4G)
+ first4gq = VM_FREELIST_DEFAULT;
+ else
+ first4gq = VM_FREELIST_FIRST4G;
+
/* Make sure the end of the space used by the kernel is rounded. */
first_avail = round_page(first_avail);
@@ -1636,19 +1644,19 @@
/* First hunk */
if (seg_start != seg_end) {
- if (seg_start < (16 * 1024 * 1024) &&
+ if (seg_start < ADDR_16M &&
first16q != VM_FREELIST_DEFAULT) {
uint64_t tmp;
- if (seg_end > (16 * 1024 * 1024))
- tmp = (16 * 1024 * 1024);
+ if (seg_end > ADDR_16M)
+ tmp = ADDR_16M;
else
tmp = seg_end;
if (tmp != seg_start) {
#ifdef DEBUG_MEMLOAD
- printf("loading 0x%"PRIx64"-0x%"PRIx64
- " (0x%lx-0x%lx)\n",
+ printf("loading first16q 0x%"PRIx64
+ "-0x%"PRIx64" (0x%lx-0x%lx)\n",
seg_start, tmp,
atop(seg_start), atop(tmp));
#endif
@@ -1658,10 +1666,32 @@
}
seg_start = tmp;
}
+ if (seg_start < ADDR_4G &&
+ first4gq != VM_FREELIST_DEFAULT) {
+ uint64_t tmp;
+
+ if (seg_end > ADDR_4G)
+ tmp = ADDR_4G;
+ else
+ tmp = seg_end;
+
+ if (tmp != seg_start) {
+#ifdef DEBUG_MEMLOAD
+ printf("loading first4gq 0x%"PRIx64
+ "-0x%"PRIx64" (0x%lx-0x%lx)\n",
+ seg_start, tmp,
+ atop(seg_start), atop(tmp));
+#endif
+ uvm_page_physload(atop(seg_start),
+ atop(tmp), atop(seg_start),
+ atop(tmp), first4gq);
+ }
+ seg_start = tmp;
+ }
if (seg_start != seg_end) {
#ifdef DEBUG_MEMLOAD
- printf("loading 0x%"PRIx64"-0x%"PRIx64
+ printf("loading default 0x%"PRIx64"-0x%"PRIx64
" (0x%lx-0x%lx)\n",
seg_start, seg_end,
atop(seg_start), atop(seg_end));
@@ -1674,19 +1704,19 @@
/* Second hunk */
if (seg_start1 != seg_end1) {
- if (seg_start1 < (16 * 1024 * 1024) &&
+ if (seg_start1 < ADDR_16M &&
first16q != VM_FREELIST_DEFAULT) {
uint64_t tmp;
- if (seg_end1 > (16 * 1024 * 1024))
- tmp = (16 * 1024 * 1024);
+ if (seg_end1 > ADDR_16M)
+ tmp = ADDR_16M;
else
tmp = seg_end1;
if (tmp != seg_start1) {
#ifdef DEBUG_MEMLOAD
- printf("loading 0x%"PRIx64"-0x%"PRIx64
- " (0x%lx-0x%lx)\n",
+ printf("loading first16q 0x%"PRIx64
+ "-0x%"PRIx64" (0x%lx-0x%lx)\n",
seg_start1, tmp,
atop(seg_start1), atop(tmp));
#endif
@@ -1696,10 +1726,32 @@
}
seg_start1 = tmp;
}
+ if (seg_start1 < ADDR_4G &&
+ first4gq != VM_FREELIST_DEFAULT) {
+ uint64_t tmp;
+
+ if (seg_end1 > ADDR_4G)
+ tmp = ADDR_4G;
+ else
+ tmp = seg_end1;
+
+ if (tmp != seg_start1) {
+#ifdef DEBUG_MEMLOAD
+ printf("loading first4gq 0x%"PRIx64
+ "-0x%"PRIx64" (0x%lx-0x%lx)\n",
+ seg_start1, tmp,
+ atop(seg_start1), atop(tmp));
+#endif
+ uvm_page_physload(atop(seg_start1),
+ atop(tmp), atop(seg_start1),
+ atop(tmp), first4gq);
+ }
+ seg_start1 = tmp;
+ }
if (seg_start1 != seg_end1) {
#ifdef DEBUG_MEMLOAD
- printf("loading 0x%"PRIx64"-0x%"PRIx64
+ printf("loading default 0x%"PRIx64"-0x%"PRIx64
" (0x%lx-0x%lx)\n",
seg_start1, seg_end1,
atop(seg_start1), atop(seg_end1));
Index: src/sys/arch/amd64/include/vmparam.h
diff -u src/sys/arch/amd64/include/vmparam.h:1.18 src/sys/arch/amd64/include/vmparam.h:1.18.20.1
--- src/sys/arch/amd64/include/vmparam.h:1.18 Sun Jan 20 13:43:38 2008
+++ src/sys/arch/amd64/include/vmparam.h Tue Dec 1 19:29:54 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vmparam.h,v 1.18 2008/01/20 13:43:38 yamt Exp $ */
+/* $NetBSD: vmparam.h,v 1.18.20.1 2009/12/01 19:29:54 snj Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
@@ -157,9 +157,10 @@
#define VM_PHYSSEG_STRAT VM_PSTRAT_BIGFIRST
#define VM_PHYSSEG_NOADD /* can't add RAM after vm_mem_init */
-#define VM_NFREELIST 2
+#define VM_NFREELIST 3
#define VM_FREELIST_DEFAULT 0
-#define VM_FREELIST_FIRST16 1
+#define VM_FREELIST_FIRST4G 1
+#define VM_FREELIST_FIRST16 2
#include <x86/pmap_pv.h>