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>