* [PATCH 0/8] Optional ZONE_DMA V2
@ 2006-09-18 18:36 Christoph Lameter
2006-09-18 18:36 ` [PATCH 1/8] Deal with cases of ZONE_DMA meaning the first zone Christoph Lameter
` (7 more replies)
0 siblings, 8 replies; 22+ messages in thread
From: Christoph Lameter @ 2006-09-18 18:36 UTC (permalink / raw)
To: linux-arch
Cc: Paul Mundt, Christoph Hellwig, James Bottomley, Arjan van de Ven,
linux-mm, Russell King, Christoph Lameter, KAMEZAWA Hiroyuki,
Andi Kleen
Optional ZONE_DMA V2
V1->V2
- Sh sh64 and parisc do not need ZONE_DMA so do not define
CONFIG_ZONE_DMA for those zones. Add patches for those
arches to remove the use of ZONE_DMA (untested since
I do not have those arches).
- Update documentation after feedback from V1.
This patch follows up on the earlier work in Andrew's tree to reduce
the number of zones. The patches allow to go to a minimum of 2 zones.
This one allows also to make ZONE_DMA optional and therefore the
number of zones can be reduced to one.
ZONE_DMA is usually used for ISA DMA devices. There are a number
of reasons why we would not want to have ZONE_DMA
1. Some arches do not need ZONE_DMA at all.
2. With the advent of IOMMUs DMA zones are no longer needed.
The necessity of DMA zones may drastically be reduced
in the future. This patchset allows a compilation of
a kernel without that overhead.
3. Devices that require ISA DMA get rare these days. All
my systems do not have any need for ISA DMA.
4. The presence of an additional zone unecessarily complicates
VM operations because it must be scanned and balancing
logic must operate on its.
5. With only ZONE_NORMAL one can reach the situation where
we have only one zone. This will allow the unrolling of many
loops in the VM and allows the optimization of varous
code paths in the VM.
6. Having only a single zone in a NUMA system results in a
1-1 correspondence between nodes and zones. Various additional
optimizations to critical VM paths become possible.
Many systems today can operate just fine with a single zone.
If you look at what is in ZONE_DMA then one usually sees that nothing
uses it. The DMA slabs are empty (Some arches use ZONE_DMA instead
of ZONE_NORMAL, then ZONE_NORMAL will be empty instead).
On all of my systems (i386, x86_64, ia64) ZONE_DMA is completely empty.
Why constantly look at an empty zone in /proc/zoneinfo and empty slab
in /proc/slabinfo? Non i386 also frequently have no need for ZONE_DMA
and zones stay empty.
The patchset was tested on i386 (UP / SMP), x86_64 (UP, NUMA) and
ia64 (NUMA).
The RFC posted earlier (see
http://marc.theaimsgroup.com/?l=linux-kernel&m=115231723513008&w=2)
had lots of #ifdefs in them. An effort has been made to minize the number
of #ifdefs and make this as compact as possible. The job was made much easier
by the ongoing efforts of others to extract common arch specific functionality.
I have been running this for awhile now on my desktop and finally Linux is
using all my available RAM instead of leaving the 16MB in ZONE_DMA untouched:
christoph@pentium940:~$ cat /proc/zoneinfo
Node 0, zone Normal
pages free 4435
min 1448
low 1810
high 2172
active 241786
inactive 210170
scanned 0 (a: 0 i: 0)
spanned 524224
present 524224
nr_anon_pages 61680
nr_mapped 14271
nr_file_pages 390264
nr_slab_reclaimable 27564
nr_slab_unreclaimable 1793
nr_page_table_pages 449
nr_dirty 39
nr_writeback 0
nr_unstable 0
nr_bounce 0
cpu: 0 pcp: 0
count: 156
high: 186
batch: 31
cpu: 0 pcp: 1
count: 9
high: 62
batch: 15
vm stats threshold: 20
cpu: 1 pcp: 0
count: 177
high: 186
batch: 31
cpu: 1 pcp: 1
count: 12
high: 62
batch: 15
vm stats threshold: 20
all_unreclaimable: 0
prev_priority: 12
temp_priority: 12
start_pfn: 0
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 22+ messages in thread* [PATCH 1/8] Deal with cases of ZONE_DMA meaning the first zone 2006-09-18 18:36 [PATCH 0/8] Optional ZONE_DMA V2 Christoph Lameter @ 2006-09-18 18:36 ` Christoph Lameter 2006-09-18 18:36 ` [PATCH 2/8] Introduce CONFIG_ZONE_DMA Christoph Lameter ` (6 subsequent siblings) 7 siblings, 0 replies; 22+ messages in thread From: Christoph Lameter @ 2006-09-18 18:36 UTC (permalink / raw) To: linux-arch Cc: Paul Mundt, Christoph Hellwig, James Bottomley, Arjan van de Ven, linux-mm, Russell King, Christoph Lameter, Andi Kleen, KAMEZAWA Hiroyuki Optional DMA zone: Replace uses of ZONE_DMA as the first zone In two places in the VM we use ZONE_DMA to refer to the first zone. If ZONE_DMA is optional then other zones may be first. So simply replace ZONE_DMA with zone 0. This also fixes ZONETABLE_PGSHIFT. If we have only a single zone then ZONES_PGSHIFT may become 0 because there is no need anymore to encode the zone number related to a pgdat. However, we still need a zonetable to index all the zones for each node if this is a NUMA system. Therefore define ZONETABLE_SHIFT unconditionally as the offset of the ZONE field in page flags. Acked-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Christoph Lameter <clameter@sgi.com> Index: linux-2.6.18-rc6-mm2/mm/mempolicy.c =================================================================== --- linux-2.6.18-rc6-mm2.orig/mm/mempolicy.c 2006-09-18 13:07:53.318935179 -0500 +++ linux-2.6.18-rc6-mm2/mm/mempolicy.c 2006-09-18 13:16:18.929008279 -0500 @@ -105,7 +105,7 @@ static struct kmem_cache *sn_cache; /* Highest zone. An specific allocation for a zone below that is not policied. */ -enum zone_type policy_zone = ZONE_DMA; +enum zone_type policy_zone = 0; struct mempolicy default_policy = { .refcnt = ATOMIC_INIT(1), /* never free it */ Index: linux-2.6.18-rc6-mm2/mm/page_alloc.c =================================================================== --- linux-2.6.18-rc6-mm2.orig/mm/page_alloc.c 2006-09-18 13:16:14.463795639 -0500 +++ linux-2.6.18-rc6-mm2/mm/page_alloc.c 2006-09-18 13:27:53.271625765 -0500 @@ -2486,11 +2486,11 @@ static void __meminit free_area_init_cor " %s zone: %lu pages exceeds realsize %lu\n", zone_names[j], memmap_pages, realsize); - /* Account for reserved DMA pages */ - if (j == ZONE_DMA && realsize > dma_reserve) { + /* Account for reserved pages */ + if (j == 0 && realsize > dma_reserve) { realsize -= dma_reserve; - printk(KERN_DEBUG " DMA zone: %lu pages reserved\n", - dma_reserve); + printk(KERN_DEBUG " %s zone: %lu pages reserved\n", + zone_names[0], dma_reserve); } if (!is_highmem_idx(j)) Index: linux-2.6.18-rc6-mm2/include/linux/mm.h =================================================================== --- linux-2.6.18-rc6-mm2.orig/include/linux/mm.h 2006-09-18 13:16:14.000000000 -0500 +++ linux-2.6.18-rc6-mm2/include/linux/mm.h 2006-09-18 13:28:52.406396556 -0500 @@ -416,7 +416,7 @@ void split_page(struct page *page, unsig #else #define ZONETABLE_SHIFT (SECTIONS_SHIFT + ZONES_SHIFT) #endif -#define ZONETABLE_PGSHIFT ZONES_PGSHIFT +#define ZONETABLE_PGSHIFT ZONES_PGOFF #if SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > FLAGS_RESERVED #error SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > FLAGS_RESERVED -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 2/8] Introduce CONFIG_ZONE_DMA 2006-09-18 18:36 [PATCH 0/8] Optional ZONE_DMA V2 Christoph Lameter 2006-09-18 18:36 ` [PATCH 1/8] Deal with cases of ZONE_DMA meaning the first zone Christoph Lameter @ 2006-09-18 18:36 ` Christoph Lameter 2006-09-18 18:36 ` [PATCH 3/8] Optional ZONE_DMA in the VM Christoph Lameter ` (5 subsequent siblings) 7 siblings, 0 replies; 22+ messages in thread From: Christoph Lameter @ 2006-09-18 18:36 UTC (permalink / raw) To: linux-arch Cc: Paul Mundt, Christoph Hellwig, James Bottomley, Arjan van de Ven, linux-mm, Russell King, Christoph Lameter, KAMEZAWA Hiroyuki, Andi Kleen Introduce CONFIG_ZONE_DMA This patch simply defines CONFIG_ZONE_DMA for all arches. We later do special things with CONFIG_ZONE_DMA after the VM and an arch are prepared to work without ZONE_DMA. CONFIG_ZONE_DMA can be defined in two ways depending on how an architecture handles ISA DMA. First if CONFIG_GENERIC_ISA_DMA is set by the arch then we know that the arch needs ZONE_DMA because ISA DMA devices are supported. We can catch this in mm/Kconfig and do not need to modify arch code. Second, arches may use ZONE_DMA in an unknown way. We set CONFIG_ZONE_DMA for all arches that do not set CONFIG_GENERIC_ISA_DMA in order to insure backwards compatibility. The arches may later undefine ZONE_DMA if their arch code has been verified to not depend on ZONE_DMA. Signed-off-by: Christoph Lameter <clameter@sgi.com> Index: linux-2.6.18-rc6-mm2/mm/Kconfig =================================================================== --- linux-2.6.18-rc6-mm2.orig/mm/Kconfig 2006-09-15 12:17:39.778004366 -0500 +++ linux-2.6.18-rc6-mm2/mm/Kconfig 2006-09-18 12:27:12.303278031 -0500 @@ -139,6 +139,10 @@ config SPLIT_PTLOCK_CPUS default "4096" if PARISC && !PA20 default "4" +config ZONE_DMA + def_bool y + depends on GENERIC_ISA_DMA + # # support for page migration # Index: linux-2.6.18-rc6-mm2/arch/ia64/Kconfig =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/ia64/Kconfig 2006-09-15 12:17:39.786794169 -0500 +++ linux-2.6.18-rc6-mm2/arch/ia64/Kconfig 2006-09-18 12:27:12.361876548 -0500 @@ -22,6 +22,10 @@ config 64BIT bool default y +config ZONE_DMA + bool + default y + config MMU bool default y Index: linux-2.6.18-rc6-mm2/arch/cris/Kconfig =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/cris/Kconfig 2006-09-15 12:17:39.795583972 -0500 +++ linux-2.6.18-rc6-mm2/arch/cris/Kconfig 2006-09-18 12:27:12.388245880 -0500 @@ -9,6 +9,10 @@ config MMU bool default y +config ZONE_DMA + bool + default y + config RWSEM_GENERIC_SPINLOCK bool default y Index: linux-2.6.18-rc6-mm2/arch/s390/Kconfig =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/s390/Kconfig 2006-09-15 12:17:39.804373775 -0500 +++ linux-2.6.18-rc6-mm2/arch/s390/Kconfig 2006-09-18 12:27:12.426334916 -0500 @@ -7,6 +7,10 @@ config MMU bool default y +config ZONE_DMA + bool + default y + config LOCKDEP_SUPPORT bool default y Index: linux-2.6.18-rc6-mm2/arch/xtensa/Kconfig =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/xtensa/Kconfig 2006-09-15 12:17:39.813163578 -0500 +++ linux-2.6.18-rc6-mm2/arch/xtensa/Kconfig 2006-09-18 12:27:12.459540742 -0500 @@ -7,6 +7,10 @@ config FRAME_POINTER bool default n +config ZONE_DMA + bool + default y + config XTENSA bool default y Index: linux-2.6.18-rc6-mm2/arch/h8300/Kconfig =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/h8300/Kconfig 2006-09-15 12:17:39.820976736 -0500 +++ linux-2.6.18-rc6-mm2/arch/h8300/Kconfig 2006-09-18 12:27:12.496653135 -0500 @@ -17,6 +17,10 @@ config SWAP bool default n +config ZONE_DMA + bool + default y + config FPU bool default n Index: linux-2.6.18-rc6-mm2/arch/v850/Kconfig =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/v850/Kconfig 2006-09-15 12:17:39.830743184 -0500 +++ linux-2.6.18-rc6-mm2/arch/v850/Kconfig 2006-09-18 12:27:12.524975752 -0500 @@ -10,6 +10,9 @@ mainmenu "uClinux/v850 (w/o MMU) Kernel config MMU bool default n +config ZONE_DMA + bool + default y config RWSEM_GENERIC_SPINLOCK bool default y Index: linux-2.6.18-rc6-mm2/arch/frv/Kconfig =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/frv/Kconfig 2006-09-15 12:17:39.847346146 -0500 +++ linux-2.6.18-rc6-mm2/arch/frv/Kconfig 2006-09-18 12:27:12.604083749 -0500 @@ -6,6 +6,10 @@ config FRV bool default y +config ZONE_DMA + bool + default y + config RWSEM_GENERIC_SPINLOCK bool default y Index: linux-2.6.18-rc6-mm2/arch/m68knommu/Kconfig =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/m68knommu/Kconfig 2006-09-15 12:17:39.860042528 -0500 +++ linux-2.6.18-rc6-mm2/arch/m68knommu/Kconfig 2006-09-18 12:27:12.630453081 -0500 @@ -17,6 +17,10 @@ config FPU bool default n +config ZONE_DMA + bool + default y + config RWSEM_GENERIC_SPINLOCK bool default y -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 3/8] Optional ZONE_DMA in the VM 2006-09-18 18:36 [PATCH 0/8] Optional ZONE_DMA V2 Christoph Lameter 2006-09-18 18:36 ` [PATCH 1/8] Deal with cases of ZONE_DMA meaning the first zone Christoph Lameter 2006-09-18 18:36 ` [PATCH 2/8] Introduce CONFIG_ZONE_DMA Christoph Lameter @ 2006-09-18 18:36 ` Christoph Lameter 2006-09-18 18:36 ` [PATCH 4/8] Optional ZONE_DMA for i386 Christoph Lameter ` (4 subsequent siblings) 7 siblings, 0 replies; 22+ messages in thread From: Christoph Lameter @ 2006-09-18 18:36 UTC (permalink / raw) To: linux-arch Cc: Paul Mundt, Christoph Hellwig, James Bottomley, Arjan van de Ven, linux-mm, Russell King, Christoph Lameter, Andi Kleen, KAMEZAWA Hiroyuki Make ZONE_DMA optional in core code. - ifdef all code for ZONE_DMA and related definitions following the example for ZONE_DMA32 and ZONE_HIGHMEM. - Without ZONE_DMA, ZONE_HIGHMEM and ZONE_DMA32 we get to a ZONES_SHIFT of 0. - Modify the VM statistics to work correctly without a DMA zone. - Modify slab to not create DMA slabs if there is no ZONE_DMA. Signed-off-by: Christoph Lameter <clameter@sgi.com> Index: linux-2.6.18-rc6-mm2/include/linux/mmzone.h =================================================================== --- linux-2.6.18-rc6-mm2.orig/include/linux/mmzone.h 2006-09-18 13:16:14.450122635 -0500 +++ linux-2.6.18-rc6-mm2/include/linux/mmzone.h 2006-09-18 13:16:29.139812806 -0500 @@ -91,6 +91,7 @@ struct per_cpu_pageset { #endif enum zone_type { +#ifdef CONFIG_ZONE_DMA /* * ZONE_DMA is used when there are devices that are not able * to do DMA to all of addressable memory (ZONE_NORMAL). Then we @@ -111,6 +112,7 @@ enum zone_type { * <16M. */ ZONE_DMA, +#endif #ifdef CONFIG_ZONE_DMA32 /* * x86_64 needs two ZONE_DMAs because it supports devices that are @@ -148,7 +150,11 @@ enum zone_type { */ #if !defined(CONFIG_ZONE_DMA32) && !defined(CONFIG_HIGHMEM) +#if !defined(CONFIG_ZONE_DMA) +#define ZONES_SHIFT 0 +#else #define ZONES_SHIFT 1 +#endif #else #define ZONES_SHIFT 2 #endif @@ -453,7 +459,11 @@ static inline int is_dma32(struct zone * static inline int is_dma(struct zone *zone) { +#ifdef CONFIG_ZONE_DMA return zone == zone->zone_pgdat->node_zones + ZONE_DMA; +#else + return 0; +#endif } /* These two functions are used to setup the per zone pages min values */ Index: linux-2.6.18-rc6-mm2/mm/page_alloc.c =================================================================== --- linux-2.6.18-rc6-mm2.orig/mm/page_alloc.c 2006-09-18 13:16:18.945611213 -0500 +++ linux-2.6.18-rc6-mm2/mm/page_alloc.c 2006-09-18 13:16:29.159345669 -0500 @@ -71,7 +71,9 @@ static void __free_pages_ok(struct page * don't need any ZONE_NORMAL reservation */ int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1] = { +#ifdef CONFIG_ZONE_DMA 256, +#endif #ifdef CONFIG_ZONE_DMA32 256, #endif @@ -90,7 +92,9 @@ struct zone *zone_table[1 << ZONETABLE_S EXPORT_SYMBOL(zone_table); static char *zone_names[MAX_NR_ZONES] = { +#ifdef CONFIG_ZONE_DMA "DMA", +#endif #ifdef CONFIG_ZONE_DMA32 "DMA32", #endif Index: linux-2.6.18-rc6-mm2/include/linux/gfp.h =================================================================== --- linux-2.6.18-rc6-mm2.orig/include/linux/gfp.h 2006-09-18 13:16:13.307450110 -0500 +++ linux-2.6.18-rc6-mm2/include/linux/gfp.h 2006-09-18 13:16:29.170088744 -0500 @@ -80,8 +80,10 @@ struct vm_area_struct; static inline enum zone_type gfp_zone(gfp_t flags) { +#ifdef CONFIG_ZONE_DMA if (flags & __GFP_DMA) return ZONE_DMA; +#endif #ifdef CONFIG_ZONE_DMA32 if (flags & __GFP_DMA32) return ZONE_DMA32; Index: linux-2.6.18-rc6-mm2/mm/slab.c =================================================================== --- linux-2.6.18-rc6-mm2.orig/mm/slab.c 2006-09-18 13:16:15.423835889 -0500 +++ linux-2.6.18-rc6-mm2/mm/slab.c 2006-09-18 13:16:29.187668322 -0500 @@ -1441,13 +1441,14 @@ void __init kmem_cache_init(void) ARCH_KMALLOC_FLAGS|SLAB_PANIC, NULL, NULL); } - +#ifdef CONFIG_ZONE_DMA sizes->cs_dmacachep = kmem_cache_create(names->name_dma, sizes->cs_size, ARCH_KMALLOC_MINALIGN, ARCH_KMALLOC_FLAGS|SLAB_CACHE_DMA| SLAB_PANIC, NULL, NULL); +#endif sizes++; names++; } @@ -2275,8 +2276,10 @@ kmem_cache_create (const char *name, siz cachep->slab_size = slab_size; cachep->flags = flags; cachep->gfpflags = 0; +#ifdef CONFIG_ZONE_DMA if (flags & SLAB_CACHE_DMA) cachep->gfpflags |= GFP_DMA; +#endif cachep->buffer_size = size; if (flags & CFLGS_OFF_SLAB) { Index: linux-2.6.18-rc6-mm2/include/linux/slab.h =================================================================== --- linux-2.6.18-rc6-mm2.orig/include/linux/slab.h 2006-09-18 13:07:52.648958109 -0500 +++ linux-2.6.18-rc6-mm2/include/linux/slab.h 2006-09-18 13:16:29.199388040 -0500 @@ -72,7 +72,11 @@ extern const char *kmem_cache_name(kmem_ struct cache_sizes { size_t cs_size; kmem_cache_t *cs_cachep; +#ifdef CONFIG_ZONE_DMA kmem_cache_t *cs_dmacachep; +#else +#define cs_dmacachep cs_cachep +#endif }; extern struct cache_sizes malloc_sizes[]; Index: linux-2.6.18-rc6-mm2/mm/vmstat.c =================================================================== --- linux-2.6.18-rc6-mm2.orig/mm/vmstat.c 2006-09-18 13:07:52.686070541 -0500 +++ linux-2.6.18-rc6-mm2/mm/vmstat.c 2006-09-18 13:16:29.207201186 -0500 @@ -437,6 +437,12 @@ struct seq_operations fragmentation_op = .show = frag_show, }; +#ifdef CONFIG_ZONE_DMA +#define TEXT_FOR_DMA(xx) xx "_dma", +#else +#define TEXT_FOR_DMA(xx) +#endif + #ifdef CONFIG_ZONE_DMA32 #define TEXT_FOR_DMA32(xx) xx "_dma32", #else @@ -449,7 +455,7 @@ struct seq_operations fragmentation_op = #define TEXT_FOR_HIGHMEM(xx) #endif -#define TEXTS_FOR_ZONES(xx) xx "_dma", TEXT_FOR_DMA32(xx) xx "_normal", \ +#define TEXTS_FOR_ZONES(xx) TEXT_FOR_DMA(xx) TEXT_FOR_DMA32(xx) xx "_normal", \ TEXT_FOR_HIGHMEM(xx) static char *vmstat_text[] = { Index: linux-2.6.18-rc6-mm2/include/linux/vmstat.h =================================================================== --- linux-2.6.18-rc6-mm2.orig/include/linux/vmstat.h 2006-09-18 13:07:52.660677824 -0500 +++ linux-2.6.18-rc6-mm2/include/linux/vmstat.h 2006-09-18 13:16:29.215990974 -0500 @@ -17,6 +17,12 @@ * generated will simply be the increment of a global address. */ +#ifdef CONFIG_ZONE_DMA +#define DMA_ZONE(xx) xx##_DMA, +#else +#define DMA_ZONE(xx) +#endif + #ifdef CONFIG_ZONE_DMA32 #define DMA32_ZONE(xx) xx##_DMA32, #else @@ -29,7 +35,7 @@ #define HIGHMEM_ZONE(xx) #endif -#define FOR_ALL_ZONES(xx) xx##_DMA, DMA32_ZONE(xx) xx##_NORMAL HIGHMEM_ZONE(xx) +#define FOR_ALL_ZONES(xx) DMA_ZONE(xx) DMA32_ZONE(xx) xx##_NORMAL HIGHMEM_ZONE(xx) enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT, FOR_ALL_ZONES(PGALLOC), @@ -88,7 +94,8 @@ extern void vm_events_fold_cpu(int cpu); #endif /* CONFIG_VM_EVENT_COUNTERS */ #define __count_zone_vm_events(item, zone, delta) \ - __count_vm_events(item##_DMA + zone_idx(zone), delta) + __count_vm_events(item##_NORMAL - ZONE_NORMAL + \ + zone_idx(zone), delta) /* * Zone based page accounting with per cpu differentials. @@ -135,14 +142,16 @@ static inline unsigned long node_page_st struct zone *zones = NODE_DATA(node)->node_zones; return +#ifdef CONFIG_ZONE_DMA + zone_page_state(&zones[ZONE_DMA], item) + +#endif #ifdef CONFIG_ZONE_DMA32 zone_page_state(&zones[ZONE_DMA32], item) + #endif - zone_page_state(&zones[ZONE_NORMAL], item) + #ifdef CONFIG_HIGHMEM zone_page_state(&zones[ZONE_HIGHMEM], item) + #endif - zone_page_state(&zones[ZONE_DMA], item); + zone_page_state(&zones[ZONE_NORMAL], item); } extern void zone_statistics(struct zonelist *, struct zone *); -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 4/8] Optional ZONE_DMA for i386 2006-09-18 18:36 [PATCH 0/8] Optional ZONE_DMA V2 Christoph Lameter ` (2 preceding siblings ...) 2006-09-18 18:36 ` [PATCH 3/8] Optional ZONE_DMA in the VM Christoph Lameter @ 2006-09-18 18:36 ` Christoph Lameter 2006-09-18 18:36 ` [PATCH 5/8] Optional ZONE_DMA for x86_64 Christoph Lameter ` (3 subsequent siblings) 7 siblings, 0 replies; 22+ messages in thread From: Christoph Lameter @ 2006-09-18 18:36 UTC (permalink / raw) To: linux-arch Cc: Paul Mundt, Christoph Hellwig, James Bottomley, Arjan van de Ven, linux-mm, Russell King, Christoph Lameter, KAMEZAWA Hiroyuki, Andi Kleen ZONE_DMA depends on GENERIC_ISA_DMA. We allow the user to configure GENERIC_ISA_DMA. If it is switched off then ISA_DMA_API is also switched off which will deselect all drivers that depend on ISA functionality. Signed-off-by: Christoph Lameter <clameter@sgi.com> Index: linux-2.6.18-rc6-mm1/arch/i386/Kconfig =================================================================== --- linux-2.6.18-rc6-mm1.orig/arch/i386/Kconfig 2006-09-08 06:42:11.697455315 -0500 +++ linux-2.6.18-rc6-mm1/arch/i386/Kconfig 2006-09-11 15:41:55.911259588 -0500 @@ -41,10 +41,6 @@ config SBUS bool -config GENERIC_ISA_DMA - bool - default y - config GENERIC_IOMAP bool default y @@ -346,6 +342,15 @@ XFree86 to initialize some video cards via BIOS. Disabling this option saves about 6k. +config GENERIC_ISA_DMA + bool "ISA DMA zone (to support ISA legacy DMA)" + default y + help + If DMA for ISA boards needs to be supported then this option + needs to be enabled. An additional DMA zone for <16MB memory + will be created and memory below 16MB will be used for those + devices. + config TOSHIBA tristate "Toshiba Laptop support" ---help--- @@ -1071,6 +1076,7 @@ config ISA_DMA_API bool + depends on GENERIC_ISA_DMA default y config ISA Index: linux-2.6.18-rc6-mm1/arch/i386/kernel/Makefile =================================================================== --- linux-2.6.18-rc6-mm1.orig/arch/i386/kernel/Makefile 2006-09-08 06:42:11.780470103 -0500 +++ linux-2.6.18-rc6-mm1/arch/i386/kernel/Makefile 2006-09-11 15:41:55.950325419 -0500 @@ -7,8 +7,9 @@ obj-y := process.o signal.o entry.o traps.o irq.o \ ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \ pci-dma.o i386_ksyms.o i387.o bootflag.o \ - quirks.o i8237.o topology.o alternative.o i8253.o tsc.o + quirks.o topology.o alternative.o i8253.o tsc.o +obj-$(CONFIG_GENERIC_ISA_DMA) += i8237.o obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-y += cpu/ obj-y += acpi/ Index: linux-2.6.18-rc6-mm1/arch/i386/kernel/setup.c =================================================================== --- linux-2.6.18-rc6-mm1.orig/arch/i386/kernel/setup.c 2006-09-08 06:42:12.269769024 -0500 +++ linux-2.6.18-rc6-mm1/arch/i386/kernel/setup.c 2006-09-11 15:41:55.982554730 -0500 @@ -1075,13 +1075,17 @@ { #ifdef CONFIG_HIGHMEM unsigned long max_zone_pfns[MAX_NR_ZONES] = { +#ifdef CONFIG_ZONE_DMA virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT, +#endif max_low_pfn, highend_pfn}; add_active_range(0, 0, highend_pfn); #else unsigned long max_zone_pfns[MAX_NR_ZONES] = { +#ifdef CONFIG_ZONE_DMA virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT, +#endif max_low_pfn}; add_active_range(0, 0, max_low_pfn); #endif -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 5/8] Optional ZONE_DMA for x86_64 2006-09-18 18:36 [PATCH 0/8] Optional ZONE_DMA V2 Christoph Lameter ` (3 preceding siblings ...) 2006-09-18 18:36 ` [PATCH 4/8] Optional ZONE_DMA for i386 Christoph Lameter @ 2006-09-18 18:36 ` Christoph Lameter 2006-09-18 18:36 ` [PATCH 6/8] Optional ZONE_DMA for ia64 Christoph Lameter ` (2 subsequent siblings) 7 siblings, 0 replies; 22+ messages in thread From: Christoph Lameter @ 2006-09-18 18:36 UTC (permalink / raw) To: linux-arch Cc: Paul Mundt, Christoph Hellwig, James Bottomley, Arjan van de Ven, linux-mm, Russell King, Christoph Lameter, Andi Kleen, KAMEZAWA Hiroyuki Allow the use to specify CONFIG_ZONE_DMA32 and CONFIG_ZONE_DMA (via CONFIG_GENERIC_ISA_DMA). The default is on to be on the safe side. If CONFIG_ZONE_DMA is off then devices requiring ISA DMA can no longer be selected. There are no drivers depending on CONFIG_ZONE_DMA32. If CONFIG_ZONE_DMA32 is not set then the system assumes that DMA devices are capable of doing DMA to all of memory. This is frequently the case if 1. No memory exists over the 4GB boundary (careful, some motherboards equipped with 4GB memory will have memory show up above the 4GB boundary!). It is safe if one has 2GB or less memory in an x86_64 system. 2. The system has an IOMMU. 3. All devices using DMA are supporting DMA to all memory. Signed-off-by: Christoph Lameter <clameter@sgi.com> Index: linux-2.6.18-rc6-mm1/arch/x86_64/mm/init.c =================================================================== --- linux-2.6.18-rc6-mm1.orig/arch/x86_64/mm/init.c 2006-09-11 16:06:41.705747849 -0500 +++ linux-2.6.18-rc6-mm1/arch/x86_64/mm/init.c 2006-09-11 16:08:13.190088058 -0500 @@ -406,9 +406,15 @@ #ifndef CONFIG_NUMA void __init paging_init(void) { - unsigned long max_zone_pfns[MAX_NR_ZONES] = {MAX_DMA_PFN, - MAX_DMA32_PFN, - end_pfn}; + unsigned long max_zone_pfns[MAX_NR_ZONES] = { +#ifdef CONFIG_ZONE_DMA + MAX_DMA_PFN, +#endif +#ifdef CONFIG_ZONE_DMA32 + MAX_DMA32_PFN, +#endif + end_pfn + }; memory_present(0, 0, end_pfn); sparse_init(); free_area_init_nodes(max_zone_pfns); Index: linux-2.6.18-rc6-mm1/arch/x86_64/Kconfig =================================================================== --- linux-2.6.18-rc6-mm1.orig/arch/x86_64/Kconfig 2006-09-11 16:06:41.713561013 -0500 +++ linux-2.6.18-rc6-mm1/arch/x86_64/Kconfig 2006-09-11 16:10:45.369039566 -0500 @@ -24,10 +24,6 @@ bool default y -config ZONE_DMA32 - bool - default y - config LOCKDEP_SUPPORT bool default y @@ -73,10 +69,6 @@ bool default y -config GENERIC_ISA_DMA - bool - default y - config GENERIC_IOMAP bool default y @@ -251,6 +243,24 @@ See <file:Documentation/mtrr.txt> for more information. +config ZONE_DMA32 + bool "32 Bit DMA Zone (only needed if memory >4GB)" + default y + help + Some x64 configurations have 32 bit DMA controllers that cannot + write to all of memory. If you have one of these and you have RAM + beyond the 4GB boundary then enable this option. + +config GENERIC_ISA_DMA + bool "ISA DMA zone (to support ISA legacy DMA)" + default y + help + If DMA for ISA boards needs to be supported then this option + needs to be enabled. An additional DMA zone for <16MB memory + will be created and memory below 16MB will be used for those + devices. If this is deselected then devices that use ISA + DMA will not be selectable. + config SMP bool "Symmetric multi-processing support" ---help--- @@ -611,6 +621,7 @@ # we have no ISA slots, but we do have ISA-style DMA. config ISA_DMA_API bool + depends on GENERIC_ISA_DMA default y config GENERIC_PENDING_IRQ Index: linux-2.6.18-rc6-mm1/arch/x86_64/kernel/Makefile =================================================================== --- linux-2.6.18-rc6-mm1.orig/arch/x86_64/kernel/Makefile 2006-09-11 16:06:41.726257405 -0500 +++ linux-2.6.18-rc6-mm1/arch/x86_64/kernel/Makefile 2006-09-11 16:08:13.214504197 -0500 @@ -7,9 +7,10 @@ obj-y := process.o signal.o entry.o traps.o irq.o \ ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_x86_64.o \ x8664_ksyms.o i387.o syscall.o vsyscall.o \ - setup64.o bootflag.o e820.o reboot.o quirks.o i8237.o \ + setup64.o bootflag.o e820.o reboot.o quirks.o \ pci-dma.o pci-nommu.o alternative.o early-quirks.o +obj-$(CONFIG_GENERIC_ISA_DMA) += i8237.o obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-$(CONFIG_X86_MCE) += mce.o obj-$(CONFIG_X86_MCE_INTEL) += mce_intel.o -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 6/8] Optional ZONE_DMA for ia64 2006-09-18 18:36 [PATCH 0/8] Optional ZONE_DMA V2 Christoph Lameter ` (4 preceding siblings ...) 2006-09-18 18:36 ` [PATCH 5/8] Optional ZONE_DMA for x86_64 Christoph Lameter @ 2006-09-18 18:36 ` Christoph Lameter 2006-09-18 18:36 ` [PATCH 7/8] Remove ZONE_DMA remains from parisc Christoph Lameter 2006-09-18 18:36 ` [PATCH 8/8] Remove ZONE_DMA remains from sh/sh64 Christoph Lameter 7 siblings, 0 replies; 22+ messages in thread From: Christoph Lameter @ 2006-09-18 18:36 UTC (permalink / raw) To: linux-arch Cc: Paul Mundt, Christoph Hellwig, James Bottomley, Arjan van de Ven, linux-mm, Russell King, Christoph Lameter, KAMEZAWA Hiroyuki, Andi Kleen ZONE_DMA less operation for IA64 SGI platform Disable ZONE_DMA for SGI SN2. All memory is addressable by all devices and we do not need any special memory pool. Signed-off-by: Christoph Lameter <clameter@sgi.com> Index: linux-2.6.18-rc6-mm1/arch/ia64/mm/discontig.c =================================================================== --- linux-2.6.18-rc6-mm1.orig/arch/ia64/mm/discontig.c 2006-09-11 16:42:07.206714114 -0500 +++ linux-2.6.18-rc6-mm1/arch/ia64/mm/discontig.c 2006-09-11 16:51:50.094129334 -0500 @@ -37,7 +37,9 @@ unsigned long pernode_size; struct bootmem_data bootmem_data; unsigned long num_physpages; +#ifdef CONFIG_ZONE_DMA unsigned long num_dma_physpages; +#endif unsigned long min_pfn; unsigned long max_pfn; }; @@ -656,9 +658,11 @@ add_active_range(node, start >> PAGE_SHIFT, end >> PAGE_SHIFT); mem_data[node].num_physpages += len >> PAGE_SHIFT; +#ifdef CONFIG_ZONE_DMA if (start <= __pa(MAX_DMA_ADDRESS)) mem_data[node].num_dma_physpages += (min(end, __pa(MAX_DMA_ADDRESS)) - start) >>PAGE_SHIFT; +#endif start = GRANULEROUNDDOWN(start); start = ORDERROUNDDOWN(start); end = GRANULEROUNDUP(end); @@ -709,7 +713,9 @@ max_pfn = mem_data[node].max_pfn; } +#ifdef CONFIG_ZONE_DMA max_zone_pfns[ZONE_DMA] = max_dma; +#endif max_zone_pfns[ZONE_NORMAL] = max_pfn; free_area_init_nodes(max_zone_pfns); Index: linux-2.6.18-rc6-mm1/arch/ia64/mm/contig.c =================================================================== --- linux-2.6.18-rc6-mm1.orig/arch/ia64/mm/contig.c 2006-09-11 16:42:07.215503923 -0500 +++ linux-2.6.18-rc6-mm1/arch/ia64/mm/contig.c 2006-09-11 16:51:50.104872434 -0500 @@ -231,8 +231,10 @@ num_physpages = 0; efi_memmap_walk(count_pages, &num_physpages); +#ifdef CONFIG_ZONE_DMA max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT; max_zone_pfns[ZONE_DMA] = max_dma; +#endif max_zone_pfns[ZONE_NORMAL] = max_low_pfn; #ifdef CONFIG_VIRTUAL_MEM_MAP Index: linux-2.6.18-rc6-mm1/arch/ia64/Kconfig =================================================================== --- linux-2.6.18-rc6-mm1.orig/arch/ia64/Kconfig 2006-09-11 16:44:55.649739769 -0500 +++ linux-2.6.18-rc6-mm1/arch/ia64/Kconfig 2006-09-11 16:51:50.114638888 -0500 @@ -23,8 +23,8 @@ default y config ZONE_DMA - bool - default y + def_bool y + depends on !IA64_SGI_SN2 config MMU bool -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 7/8] Remove ZONE_DMA remains from parisc 2006-09-18 18:36 [PATCH 0/8] Optional ZONE_DMA V2 Christoph Lameter ` (5 preceding siblings ...) 2006-09-18 18:36 ` [PATCH 6/8] Optional ZONE_DMA for ia64 Christoph Lameter @ 2006-09-18 18:36 ` Christoph Lameter 2006-09-18 18:36 ` [PATCH 8/8] Remove ZONE_DMA remains from sh/sh64 Christoph Lameter 7 siblings, 0 replies; 22+ messages in thread From: Christoph Lameter @ 2006-09-18 18:36 UTC (permalink / raw) To: linux-arch Cc: Paul Mundt, Christoph Hellwig, James Bottomley, Arjan van de Ven, linux-mm, Russell King, Christoph Lameter, Andi Kleen, KAMEZAWA Hiroyuki Remove ZONE_DMA remains from parisc so that kernels are build without ZONE_DMA. Signed-off-by: Christoph Lameter <clameter@sgi.com> Index: linux-2.6.18-rc6-mm2/arch/parisc/Kconfig =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/parisc/Kconfig 2006-09-18 12:52:05.203892680 -0500 +++ linux-2.6.18-rc6-mm2/arch/parisc/Kconfig 2006-09-18 12:55:43.140754129 -0500 @@ -42,9 +42,6 @@ config TIME_LOW_RES depends on SMP default y -config GENERIC_ISA_DMA - bool - config GENERIC_HARDIRQS def_bool y Index: linux-2.6.18-rc6-mm2/arch/parisc/mm/init.c =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/parisc/mm/init.c 2006-09-18 12:52:05.217565682 -0500 +++ linux-2.6.18-rc6-mm2/arch/parisc/mm/init.c 2006-09-18 12:55:43.153450483 -0500 @@ -808,9 +808,7 @@ void __init paging_init(void) for (i = 0; i < npmem_ranges; i++) { unsigned long zones_size[MAX_NR_ZONES] = { 0, }; - /* We have an IOMMU, so all memory can go into a single - ZONE_DMA zone. */ - zones_size[ZONE_DMA] = pmem_ranges[i].pages; + zones_size[ZONE_NORMAL] = pmem_ranges[i].pages; #ifdef CONFIG_DISCONTIGMEM /* Need to initialize the pfnnid_map before we can initialize -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 8/8] Remove ZONE_DMA remains from sh/sh64 2006-09-18 18:36 [PATCH 0/8] Optional ZONE_DMA V2 Christoph Lameter ` (6 preceding siblings ...) 2006-09-18 18:36 ` [PATCH 7/8] Remove ZONE_DMA remains from parisc Christoph Lameter @ 2006-09-18 18:36 ` Christoph Lameter [not found] ` <20060911222729.4849.69497.sendpatchset@schroedinger.engr.sgi.com> 7 siblings, 1 reply; 22+ messages in thread From: Christoph Lameter @ 2006-09-18 18:36 UTC (permalink / raw) To: linux-arch Cc: Paul Mundt, Christoph Hellwig, James Bottomley, Arjan van de Ven, linux-mm, Russell King, Christoph Lameter, KAMEZAWA Hiroyuki, Andi Kleen sh / sh64: Remove ZONE_DMA remains. Both arches do not need ZONE_DMA Signed-off-by: Christoph Lameter <clameter@sgi.com> Index: linux-2.6.18-rc6-mm2/arch/sh/mm/init.c =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/sh/mm/init.c 2006-09-18 12:54:04.733274009 -0500 +++ linux-2.6.18-rc6-mm2/arch/sh/mm/init.c 2006-09-18 12:58:58.563038661 -0500 @@ -156,7 +156,6 @@ void __init paging_init(void) * Setup some defaults for the zone sizes.. these should be safe * regardless of distcontiguous memory or MMU settings. */ - zones_size[ZONE_DMA] = 0 >> PAGE_SHIFT; zones_size[ZONE_NORMAL] = __MEMORY_SIZE >> PAGE_SHIFT; #ifdef CONFIG_HIGHMEM zones_size[ZONE_HIGHMEM] = 0 >> PAGE_SHIFT; Index: linux-2.6.18-rc6-mm2/arch/sh64/mm/init.c =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/sh64/mm/init.c 2006-09-18 12:54:04.745970361 -0500 +++ linux-2.6.18-rc6-mm2/arch/sh64/mm/init.c 2006-09-18 12:58:58.577688302 -0500 @@ -118,10 +118,7 @@ void __init paging_init(void) mmu_context_cache = MMU_CONTEXT_FIRST_VERSION; - /* - * All memory is good as ZONE_NORMAL (fall-through) and ZONE_DMA. - */ - zones_size[ZONE_DMA] = MAX_LOW_PFN - START_PFN; + zones_size[ZONE_NORMAL] = MAX_LOW_PFN - START_PFN; NODE_DATA(0)->node_mem_map = NULL; free_area_init_node(0, NODE_DATA(0), zones_size, __MEMORY_START >> PAGE_SHIFT, 0); } Index: linux-2.6.18-rc6-mm2/arch/sh64/Kconfig =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/sh64/Kconfig 2006-09-18 12:33:04.000000000 -0500 +++ linux-2.6.18-rc6-mm2/arch/sh64/Kconfig 2006-09-18 13:01:07.919367272 -0500 @@ -36,9 +36,6 @@ config GENERIC_CALIBRATE_DELAY config RWSEM_XCHGADD_ALGORITHM bool -config GENERIC_ISA_DMA - bool - source init/Kconfig menu "System type" -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
[parent not found: <20060911222729.4849.69497.sendpatchset@schroedinger.engr.sgi.com>]
[parent not found: <20060911222744.4849.26386.sendpatchset@schroedinger.engr.sgi.com>]
[parent not found: <450600C7.7090801@yahoo.com.au>]
* Re: [PATCH 3/6] Optional ZONE_DMA in the VM [not found] ` <450600C7.7090801@yahoo.com.au> @ 2006-09-12 1:40 ` Christoph Lameter 0 siblings, 0 replies; 22+ messages in thread From: Christoph Lameter @ 2006-09-12 1:40 UTC (permalink / raw) To: Nick Piggin Cc: linux-mm, Martin Bligh, Christoph Hellwig, linux-ia64, Marcelo Tosatti, Arjan van de Ven, Andi Kleen, KAMEZAWA Hiroyuki On Tue, 12 Sep 2006, Nick Piggin wrote: > I can't see from your patches, but what happens if someone asks > for a GFP_DMA page or dma slab allocation when there is no ZONE_DMA? The page/slab allocator will simply ignore the flag and return ZONE_NORMAL memory. See gfp_zone(). -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
[parent not found: <20060912133457.GC10689@sgi.com>]
[parent not found: <Pine.LNX.4.64.0609121032310.11278@schroedinger.engr.sgi.com>]
* Re: [PATCH 0/8] Optional ZONE_DMA V1 [not found] ` <Pine.LNX.4.64.0609121032310.11278@schroedinger.engr.sgi.com> @ 2006-09-12 17:47 ` Martin Bligh 2006-09-12 17:53 ` Christoph Lameter 0 siblings, 1 reply; 22+ messages in thread From: Martin Bligh @ 2006-09-12 17:47 UTC (permalink / raw) To: Christoph Lameter Cc: Jack Steiner, Linux Memory Management, Nick Piggin, Christoph Hellwig, linux-ia64, Marcelo Tosatti, Arjan van de Ven, KAMEZAWA Hiroyuki, Andi Kleen Resending. Your outbound email address is invalid (Christoph Lameter <christoph@engr.sgi.com>), as is the address for linux-mm Christoph Lameter wrote: > On Tue, 12 Sep 2006, Jack Steiner wrote: > > >>I'm missing something here. On Altix, currently ALL of the memory is reported >>as being in the DMA zone: >> >> % cat /proc/budd* >> Node 0, zone DMA 3015 116 4 1 ... >> Node 1, zone DMA 4243 355 15 3 ... >> Node 2, zone DMA 4384 113 6 4 ... >> >> % cat /proc/zoneinfo >> Node 0, zone DMA >> pages free 5868 >> ... >> >>The DMA slabs are empty, though. > > > This is wrong. All memory should be in ZONE_NORMAL since we have no DMA > restrictions on Altix. PPC64 works the same way, I believe. All memory is DMA'able, therefore it all fits in ZONE_DMA. The real problem is that there's no consistent definition of what the zones actually mean. 1. Is it DMA'able (this is stupid, as it doesn't say 'for what device' 2. Is it permanently mapped into kernel address space. Given an inconsistent set of questions, it is unsuprising that we come up with an inconsistent set of answers. We're trying to answer a 2D question with a 1D answer. What is really needed is to pass a physical address limit from the caller, together with a flag that says whether the memory needs to be mapped into the permanent kernel address space or not. The allocator then finds the set of zones that will fulfill this criteria. But I suspect this level of change will cause too many people to squeak loudly. M. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 0/8] Optional ZONE_DMA V1 2006-09-12 17:47 ` [PATCH 0/8] Optional ZONE_DMA V1 Martin Bligh @ 2006-09-12 17:53 ` Christoph Lameter 0 siblings, 0 replies; 22+ messages in thread From: Christoph Lameter @ 2006-09-12 17:53 UTC (permalink / raw) To: Martin Bligh Cc: Jack Steiner, Linux Memory Management, Nick Piggin, Christoph Hellwig, linux-ia64, Marcelo Tosatti, Arjan van de Ven, KAMEZAWA Hiroyuki, Andi Kleen On Tue, 12 Sep 2006, Martin Bligh wrote: > > This is wrong. All memory should be in ZONE_NORMAL since we have no DMA > > restrictions on Altix. > > PPC64 works the same way, I believe. All memory is DMA'able, therefore > it all fits in ZONE_DMA. ZONE_DMA is for broken/limited DMA controllers not for DMA controllers that can reach all of memory. > The real problem is that there's no consistent definition of what the > zones actually mean. ZONE_DMA Special memory area for DMA controllers that can only do dma to a restricted memory area. ZONE_DMA32 Second special memory area for DMA controllers that can only do dma to a restricted memory area that is different from ZONE_DMA ZONE_NORMAL Regular memory ZONE_HIGHEM Memory requires being mapped into kernel address space. > 1. Is it DMA'able (this is stupid, as it doesn't say 'for what device' That is *not* what ZONE_DMA means. We have always supported DMA to regular memory. > What is really needed is to pass a physical address limit from the > caller, together with a flag that says whether the memory needs to be > mapped into the permanent kernel address space or not. The allocator > then finds the set of zones that will fulfill this criteria. > But I suspect this level of change will cause too many people to squeak > loudly. Actually we could do this with the proposed change of passing an allocation_control struct instead of gfpflags to the allocator functions. See the discussion on linux-mm. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
[parent not found: <1158046205.2992.1.camel@laptopd505.fenrus.org>]
[parent not found: <Pine.LNX.4.64.0609121024290.11188@schroedinger.engr.sgi.com>]
[parent not found: <yq0d5a0fbcj.fsf@jaguar.mkp.net>]
[parent not found: <Pine.LNX.4.64.0609130109030.15792@schroedinger.engr.sgi.com>]
[parent not found: <4507D4EE.4060501@sgi.com>]
* Re: [PATCH 0/8] Optional ZONE_DMA V1 [not found] ` <4507D4EE.4060501@sgi.com> @ 2006-09-13 17:23 ` Christoph Lameter 2006-09-13 17:49 ` Jack Steiner 0 siblings, 1 reply; 22+ messages in thread From: Christoph Lameter @ 2006-09-13 17:23 UTC (permalink / raw) To: Jes Sorensen Cc: Arjan van de Ven, linux-mm, Nick Piggin, Christoph Hellwig, linux-ia64, Marcelo Tosatti, Martin Bligh, KAMEZAWA Hiroyuki, Andi Kleen On Wed, 13 Sep 2006, Jes Sorensen wrote: > > There was the floppy driver and one type of USB stick that I noticed > > during the work on the project. But other drivers may depend also depend > > indirectly on DMA functionality and may also be disabled. > > Ok, USB should ring alarm bells, floppy I think is less relevant these > days :) If you want all drivers then you must of course have ZONE_DMA. Distributions that want to cover all drivers will have it on by default and ZONE_DMA is available by default. However, if you want to create a lean and mean kernel then you can switch ZONE_DMA off and if there is just one zone left then the VM can optimized much better because loops are avoided and some macros become constant etc etc. Some architectures never need ZONE_DMA because all hardware supports DMA to all of memory. SGI Altix is one example. Carrying an additional useless zone around unecessarily bloats the kernel both in term of code and data. Data is a particular issue since zones contain per cpu elements. For a 1k cpu 1k node configuration this saves around 1 million per cpu structures (one zone per node with 1k per cpu pagesets). -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 0/8] Optional ZONE_DMA V1 2006-09-13 17:23 ` Christoph Lameter @ 2006-09-13 17:49 ` Jack Steiner 2006-09-13 18:00 ` Christoph Lameter 0 siblings, 1 reply; 22+ messages in thread From: Jack Steiner @ 2006-09-13 17:49 UTC (permalink / raw) To: Christoph Lameter Cc: Jes Sorensen, Arjan van de Ven, linux-mm, Nick Piggin, Christoph Hellwig, linux-ia64, Marcelo Tosatti, Martin Bligh, KAMEZAWA Hiroyuki, Andi Kleen On Wed, Sep 13, 2006 at 10:23:10AM -0700, Christoph Lameter wrote: > On Wed, 13 Sep 2006, Jes Sorensen wrote: > > > > There was the floppy driver and one type of USB stick that I noticed > > > during the work on the project. But other drivers may depend also depend > > > indirectly on DMA functionality and may also be disabled. > > > > Ok, USB should ring alarm bells, floppy I think is less relevant these > > days :) > > If you want all drivers then you must of course have ZONE_DMA. > Distributions that want to cover all drivers will have it on by default > and ZONE_DMA is available by default. > > However, if you want to create a lean and mean kernel then you can switch > ZONE_DMA off and if there is just one zone left then the VM can > optimized much better because loops are avoided and some macros > become constant etc etc. > > Some architectures never need ZONE_DMA because all hardware supports DMA > to all of memory. SGI Altix is one example. Carrying an additional > useless zone around unecessarily bloats the kernel both in term of code > and data. Data is a particular issue since zones contain per cpu elements. > For a 1k cpu 1k node configuration this saves around 1 million per cpu > structures (one zone per node with 1k per cpu pagesets). > Most distros release GENERIC kernels for IA64. If _any_ IA64 platform requires ZONE_DMA, then it must be configured ON. Two questions: - will any IA64 platform require that ZONE_DMA be enabled (I think the answer is "yes") - if ZONE_DMA is enabled, ALTIX will still use only 1 zone. In your statement above, you say that disabling ZONE_DMA save 1M cpu structures. If ZONE_DMA is enabled, will these 1M structure be allocated on SN even though they are not needed? -- jack -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 0/8] Optional ZONE_DMA V1 2006-09-13 17:49 ` Jack Steiner @ 2006-09-13 18:00 ` Christoph Lameter 2006-09-14 8:52 ` Jes Sorensen 0 siblings, 1 reply; 22+ messages in thread From: Christoph Lameter @ 2006-09-13 18:00 UTC (permalink / raw) To: Jack Steiner Cc: Jes Sorensen, Arjan van de Ven, linux-mm, Nick Piggin, Christoph Hellwig, linux-ia64, Marcelo Tosatti, Martin Bligh, KAMEZAWA Hiroyuki, Andi Kleen On Wed, 13 Sep 2006, Jack Steiner wrote: > - will any IA64 platform require that ZONE_DMA be enabled (I think > the answer is "yes") I think that still remains to be discussed. Today there are various means to get around address restrictions. > - if ZONE_DMA is enabled, ALTIX will still use only 1 zone. In your > statement above, you say that disabling ZONE_DMA save 1M cpu > structures. If ZONE_DMA is enabled, will these 1M structure be allocated > on SN even though they are not needed? That has always been the case. In SLES9 and SLES10 we are using 1/4th of the pagesets. Having no ZONE_DMA provides additional benefits besides saving memory. The VM balancing of allocations within a node becomes not necessary and various VM optimization can be performed. Loops are unrolled. Less zones have to be processed for draining / vm counter updates etc etc. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 0/8] Optional ZONE_DMA V1 2006-09-13 18:00 ` Christoph Lameter @ 2006-09-14 8:52 ` Jes Sorensen 2006-09-14 16:55 ` Christoph Lameter 0 siblings, 1 reply; 22+ messages in thread From: Jes Sorensen @ 2006-09-14 8:52 UTC (permalink / raw) To: Christoph Lameter Cc: Jack Steiner, Arjan van de Ven, linux-mm, Nick Piggin, Christoph Hellwig, linux-ia64, Marcelo Tosatti, Martin Bligh, KAMEZAWA Hiroyuki, Andi Kleen Christoph Lameter wrote: > On Wed, 13 Sep 2006, Jack Steiner wrote: > >> - will any IA64 platform require that ZONE_DMA be enabled (I think >> the answer is "yes") > > I think that still remains to be discussed. Today there are various means > to get around address restrictions. I don't know about USB on ia64, but USB is an issue and we do support it even on Altix, as crazy as it may seem (I use USB with my SGI Prism foot-warmer in the office). Also take into account that some ia64 boxes do not come with IOMMU's, DIG - be afraid, be very afraid. On those machines you ideally want to have DMA32 zone for this stuff to support 32 bit PCI devices, even if the swiotlb can be used (bounce buffers for all transactions is just a sick idea), and we get back to the issue of using generic kernels. >> - if ZONE_DMA is enabled, ALTIX will still use only 1 zone. In your >> statement above, you say that disabling ZONE_DMA save 1M cpu >> structures. If ZONE_DMA is enabled, will these 1M structure be allocated >> on SN even though they are not needed? > > That has always been the case. In SLES9 and SLES10 we are using 1/4th of the pagesets. > > Having no ZONE_DMA provides additional benefits besides saving memory. The > VM balancing of allocations within a node becomes not necessary and > various VM optimization can be performed. Loops are unrolled. Less zones > have to be processed for draining / vm counter updates etc etc. I agree it sounds appealing, but if reality is that all distro kernels will switch ZONE_DMA on, then having the option to switch it off is going have little or zero impact on the end users. In other words, will this really matter in end user situations? Cheers, Jes -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 0/8] Optional ZONE_DMA V1 2006-09-14 8:52 ` Jes Sorensen @ 2006-09-14 16:55 ` Christoph Lameter 0 siblings, 0 replies; 22+ messages in thread From: Christoph Lameter @ 2006-09-14 16:55 UTC (permalink / raw) To: Jes Sorensen Cc: Jack Steiner, Arjan van de Ven, linux-mm, Nick Piggin, Christoph Hellwig, linux-ia64, Marcelo Tosatti, Martin Bligh, KAMEZAWA Hiroyuki, Andi Kleen On Thu, 14 Sep 2006, Jes Sorensen wrote: > I don't know about USB on ia64, but USB is an issue and we do support > it even on Altix, as crazy as it may seem (I use USB with my SGI Prism > foot-warmer in the office). Also take into account that some ia64 boxes > do not come with IOMMU's, DIG - be afraid, be very afraid. On those > machines you ideally want to have DMA32 zone for this stuff to support > 32 bit PCI devices, even if the swiotlb can be used (bounce buffers for > all transactions is just a sick idea), and we get back to the issue of > using generic kernels. USB sticks that use ISA DMA is an issue but then IA64 does not support ISA DMA at all and would not even now support that USB stick type. > I agree it sounds appealing, but if reality is that all distro kernels > will switch ZONE_DMA on, then having the option to switch it off is > going have little or zero impact on the end users. I am sure that if we keep ZONE_DMA unconfigurable then the distros will never switch that off because they cannot. On the other hand if its optional then it can be switched off at some future date or special kernels can be build if this will turn out to be a big advantage. Also not everyone (even we have the capability of generatic static SGI specific kernels) uses only distro kernels and this is a big memory saver and reduces complexity in the kernel with only a single zone. > In other words, will this really matter in end user situations? Certainly it will never have a change of mattering if we keep the chicken-and-egg argument going. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
[parent not found: <20060911222739.4849.79915.sendpatchset@schroedinger.engr.sgi.com>]
[parent not found: <20060918135559.GB15096@infradead.org>]
[parent not found: <20060918152243.GA4320@localhost.na.rta>]
* Re: [PATCH 2/6] Introduce CONFIG_ZONE_DMA [not found] ` <20060918152243.GA4320@localhost.na.rta> @ 2006-09-18 17:33 ` Christoph Lameter 2006-09-18 22:45 ` Paul Mundt 0 siblings, 1 reply; 22+ messages in thread From: Christoph Lameter @ 2006-09-18 17:33 UTC (permalink / raw) To: Paul Mundt Cc: Christoph Hellwig, linux-mm, Nick Piggin, linux-ia64, Marcelo Tosatti, Arjan van de Ven, Martin Bligh, KAMEZAWA Hiroyuki, Andi Kleen, linux-arch On Tue, 19 Sep 2006, Paul Mundt wrote: > sh and sh64 have no use for ZONE_DMA, it's effectively ZONE_DMA == > ZONE_NORMAL anyways, so it can be safely switched off (though > arch/sh/mm/init.c should then be changed to use ZONE_NORMAL if ZONE_DMA > goes away, as we currently place all lowmem in ZONE_DMA, likewise for > sh64). None of our DMA controllers have any particular limitations where > ZONE_DMA would be useful at least. Ok. I dropped the CONFIG_ZONE_DMA for sh so you will no longer have a DMA zone when this patch goes in. sh64 has the same strange code as parisc: config GENERIC_ISA_DMA bool You do not have ISA_DMA so I should drop these lines? -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/6] Introduce CONFIG_ZONE_DMA 2006-09-18 17:33 ` [PATCH 2/6] Introduce CONFIG_ZONE_DMA Christoph Lameter @ 2006-09-18 22:45 ` Paul Mundt 2006-09-18 22:58 ` Christoph Lameter 0 siblings, 1 reply; 22+ messages in thread From: Paul Mundt @ 2006-09-18 22:45 UTC (permalink / raw) To: Christoph Lameter Cc: Christoph Hellwig, linux-mm, Nick Piggin, linux-ia64, Marcelo Tosatti, Arjan van de Ven, Martin Bligh, KAMEZAWA Hiroyuki, Andi Kleen, linux-arch, James Bottomley, Russell King On Mon, Sep 18, 2006 at 10:33:00AM -0700, Christoph Lameter wrote: > sh64 has the same strange code as parisc: > > config GENERIC_ISA_DMA > bool > > You do not have ISA_DMA so I should drop these lines? > It doesn't really matter, this notation basically keeps it disabled anyways (you'll note the absence of it from the defconfigs). On Mon, Sep 18, 2006 at 11:36:55AM -0700, Christoph Lameter wrote: > Index: linux-2.6.18-rc6-mm2/arch/sh/mm/init.c > =================================================================== > --- linux-2.6.18-rc6-mm2.orig/arch/sh/mm/init.c 2006-09-18 12:54:04.733274009 -0500 > +++ linux-2.6.18-rc6-mm2/arch/sh/mm/init.c 2006-09-18 12:58:58.563038661 -0500 > @@ -156,7 +156,6 @@ void __init paging_init(void) > * Setup some defaults for the zone sizes.. these should be safe > * regardless of distcontiguous memory or MMU settings. > */ > - zones_size[ZONE_DMA] = 0 >> PAGE_SHIFT; > zones_size[ZONE_NORMAL] = __MEMORY_SIZE >> PAGE_SHIFT; > #ifdef CONFIG_HIGHMEM > zones_size[ZONE_HIGHMEM] = 0 >> PAGE_SHIFT; You've missed the other ZONE_DMA references, if you scroll a bit further down that's where we fill in ZONE_DMA, this is simply the default zone layout that we rely on for nommu. sh64 part looks fine. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/6] Introduce CONFIG_ZONE_DMA 2006-09-18 22:45 ` Paul Mundt @ 2006-09-18 22:58 ` Christoph Lameter 2006-09-18 23:25 ` Paul Mundt 0 siblings, 1 reply; 22+ messages in thread From: Christoph Lameter @ 2006-09-18 22:58 UTC (permalink / raw) To: Paul Mundt Cc: Christoph Hellwig, linux-mm, Nick Piggin, linux-ia64, Marcelo Tosatti, Arjan van de Ven, Martin Bligh, KAMEZAWA Hiroyuki, Andi Kleen, linux-arch, James Bottomley, Russell King On Tue, 19 Sep 2006, Paul Mundt wrote: > You've missed the other ZONE_DMA references, if you scroll a bit further > down that's where we fill in ZONE_DMA, this is simply the default zone > layout that we rely on for nommu. Are you sure that sh does not need ZONE_DMA? There is code in there to check for the DMA boundary. The following patch disables that code if CONFIG_ZONE_DMA is not set. sh / sh64: Remove ZONE_DMA remains. Both arches do not need ZONE_DMA Signed-off-by: Christoph Lameter <clameter@sgi.com> Index: linux-2.6.18-rc6-mm2/arch/sh/mm/init.c =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/sh/mm/init.c 2006-09-18 13:27:48.125691412 -0500 +++ linux-2.6.18-rc6-mm2/arch/sh/mm/init.c 2006-09-18 17:56:23.632421140 -0500 @@ -156,7 +156,6 @@ void __init paging_init(void) * Setup some defaults for the zone sizes.. these should be safe * regardless of distcontiguous memory or MMU settings. */ - zones_size[ZONE_DMA] = 0 >> PAGE_SHIFT; zones_size[ZONE_NORMAL] = __MEMORY_SIZE >> PAGE_SHIFT; #ifdef CONFIG_HIGHMEM zones_size[ZONE_HIGHMEM] = 0 >> PAGE_SHIFT; @@ -186,13 +185,16 @@ void __init paging_init(void) max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT; low = MAX_LOW_PFN; - if (low < max_dma) { - zones_size[ZONE_DMA] = low - start_pfn; - zones_size[ZONE_NORMAL] = 0; - } else { +#ifdef CONFIG_ZONE_DMA + if (low < max_dma) +#endif + zones_size[ZONE_NORMAL] = low - start_pfn; +#ifdef CONFIG_ZONE_DMA + else { zones_size[ZONE_DMA] = max_dma - start_pfn; zones_size[ZONE_NORMAL] = low - max_dma; } +#endif } #elif defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4) Index: linux-2.6.18-rc6-mm2/arch/sh64/mm/init.c =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/sh64/mm/init.c 2006-09-18 13:27:48.134481203 -0500 +++ linux-2.6.18-rc6-mm2/arch/sh64/mm/init.c 2006-09-18 17:54:14.263532486 -0500 @@ -118,10 +118,7 @@ void __init paging_init(void) mmu_context_cache = MMU_CONTEXT_FIRST_VERSION; - /* - * All memory is good as ZONE_NORMAL (fall-through) and ZONE_DMA. - */ - zones_size[ZONE_DMA] = MAX_LOW_PFN - START_PFN; + zones_size[ZONE_NORMAL] = MAX_LOW_PFN - START_PFN; NODE_DATA(0)->node_mem_map = NULL; free_area_init_node(0, NODE_DATA(0), zones_size, __MEMORY_START >> PAGE_SHIFT, 0); } Index: linux-2.6.18-rc6-mm2/arch/sh64/Kconfig =================================================================== --- linux-2.6.18-rc6-mm2.orig/arch/sh64/Kconfig 2006-09-18 13:27:48.145224281 -0500 +++ linux-2.6.18-rc6-mm2/arch/sh64/Kconfig 2006-09-18 17:54:14.285995416 -0500 @@ -36,9 +36,6 @@ config GENERIC_CALIBRATE_DELAY config RWSEM_XCHGADD_ALGORITHM bool -config GENERIC_ISA_DMA - bool - source init/Kconfig menu "System type" -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 2/6] Introduce CONFIG_ZONE_DMA 2006-09-18 22:58 ` Christoph Lameter @ 2006-09-18 23:25 ` Paul Mundt 0 siblings, 0 replies; 22+ messages in thread From: Paul Mundt @ 2006-09-18 23:25 UTC (permalink / raw) To: Christoph Lameter Cc: Christoph Hellwig, linux-mm, Nick Piggin, linux-ia64, Marcelo Tosatti, Arjan van de Ven, Martin Bligh, KAMEZAWA Hiroyuki, Andi Kleen, linux-arch, James Bottomley, Russell King On Mon, Sep 18, 2006 at 03:58:52PM -0700, Christoph Lameter wrote: > On Tue, 19 Sep 2006, Paul Mundt wrote: > > You've missed the other ZONE_DMA references, if you scroll a bit further > > down that's where we fill in ZONE_DMA, this is simply the default zone > > layout that we rely on for nommu. > > Are you sure that sh does not need ZONE_DMA? There is code in there > to check for the DMA boundary. The following patch disables that > code if CONFIG_ZONE_DMA is not set. > Yes, MAX_DMA_ADDRESS (in include/asm-sh/dma.h) is from when we needed it for alloc_bootmem(), we have no interest in it, but we can't kill off the definition either since some drivers seem to rely on it.. It was also left around in case some CPU variants with an arbitrary limitation in their respective DMACs popped up. All lowmem fits < MAX_DMA_ADDRESS and so gets stuffed in ZONE_DMA, as per: if (low < max_dma) { zones_size[ZONE_DMA] = low - start_pfn; zones_size[ZONE_NORMAL] = 0; So we may as well just do away with it entirely, via something like this: Signed-off-by: Paul Mundt <lethal@linux-sh.org> diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index 8ea27ca..40494f9 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c @@ -156,7 +156,6 @@ void __init paging_init(void) * Setup some defaults for the zone sizes.. these should be safe * regardless of distcontiguous memory or MMU settings. */ - zones_size[ZONE_DMA] = 0 >> PAGE_SHIFT; zones_size[ZONE_NORMAL] = __MEMORY_SIZE >> PAGE_SHIFT; #ifdef CONFIG_HIGHMEM zones_size[ZONE_HIGHMEM] = 0 >> PAGE_SHIFT; @@ -168,7 +167,7 @@ #ifdef CONFIG_MMU * the zone sizes accordingly, in addition to turning it on. */ { - unsigned long max_dma, low, start_pfn; + unsigned long low, start_pfn; pgd_t *pg_dir; int i; @@ -183,16 +182,10 @@ #ifdef CONFIG_MMU /* Fixup the zone sizes */ start_pfn = START_PFN; - max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT; low = MAX_LOW_PFN; - if (low < max_dma) { - zones_size[ZONE_DMA] = low - start_pfn; - zones_size[ZONE_NORMAL] = 0; - } else { - zones_size[ZONE_DMA] = max_dma - start_pfn; - zones_size[ZONE_NORMAL] = low - max_dma; - } + /* No DMA limitation, shove all of lowmem in ZONE_NORMAL. */ + zones_size[ZONE_NORMAL] = low - start_pfn; } #elif defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4) -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 0/8] Optional ZONE_DMA V1
@ 2006-09-11 22:30 Christoph Lameter
0 siblings, 0 replies; 22+ messages in thread
From: Christoph Lameter @ 2006-09-11 22:30 UTC (permalink / raw)
To: linux-mm; +Cc: Christoph Lameter
Optional ZONE_DMA
This patch follows up on the earlier work in Andrew's tree to reduce
the number of zones. The patches allow to go to a minimum of 2 zones.
This one allows also to make ZONE_DMA optional and therefore the
number of zones can be reduced to one.
ZONE_DMA is usually used for ISA DMA devices. Typically modern hardware
does not have any of these anymore. So we frequently do not need
the zone anymore. The presence of an additional zone unnecessarily
complicates VM operations. It must be scanned and balancing logic
must operate in it etc etc. If one has a 1-1 correspondence between
zones and nodes in a NUMA system then various other optimizations
become possible.
Many systems today (especially 64 bit but also 32 bit machines with less
than 4G of memory) can therefore operate just fine with a single zone.
With a single zone various loops can be optimized away by the
compiler. Many system currently do not place anything in ZONE_DMA. On
most of my systems ZONE_DMA is completely empty. Why constantly look
at an empty zone in /proc/zoneinfo and empty slab in /proc/slabinfo?
Non i386 also frequently have no need for ZONE_DMA and zones stay
empty.
The patchset was tested on i386 (UP / SMP), x86_64 (UP, NUMA) and
ia64 (NUMA).
The RFC posted earlier (see
http://marc.theaimsgroup.com/?l=linux-kernel&m=115231723513008&w=2)
had lots of #ifdefs in them. An effort has been made to minize the number
of #ifdefs and make this as compact as possible. The job was made much easier
by the ongoing efforts of others to extract common arch specific functionality.
I have been running this for awhile now on my desktop and finally Linux is
using all my available RAM instead of leaving the 16MB in ZONE_DMA untouched:
christoph@pentium940:~$ cat /proc/zoneinfo
Node 0, zone Normal
pages free 4435
min 1448
low 1810
high 2172
active 241786
inactive 210170
scanned 0 (a: 0 i: 0)
spanned 524224
present 524224
nr_anon_pages 61680
nr_mapped 14271
nr_file_pages 390264
nr_slab_reclaimable 27564
nr_slab_unreclaimable 1793
nr_page_table_pages 449
nr_dirty 39
nr_writeback 0
nr_unstable 0
nr_bounce 0
cpu: 0 pcp: 0
count: 156
high: 186
batch: 31
cpu: 0 pcp: 1
count: 9
high: 62
batch: 15
vm stats threshold: 20
cpu: 1 pcp: 0
count: 177
high: 186
batch: 31
cpu: 1 pcp: 1
count: 12
high: 62
batch: 15
vm stats threshold: 20
all_unreclaimable: 0
prev_priority: 12
temp_priority: 12
start_pfn: 0
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 22+ messages in threadend of thread, other threads:[~2006-09-18 23:25 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-09-18 18:36 [PATCH 0/8] Optional ZONE_DMA V2 Christoph Lameter
2006-09-18 18:36 ` [PATCH 1/8] Deal with cases of ZONE_DMA meaning the first zone Christoph Lameter
2006-09-18 18:36 ` [PATCH 2/8] Introduce CONFIG_ZONE_DMA Christoph Lameter
2006-09-18 18:36 ` [PATCH 3/8] Optional ZONE_DMA in the VM Christoph Lameter
2006-09-18 18:36 ` [PATCH 4/8] Optional ZONE_DMA for i386 Christoph Lameter
2006-09-18 18:36 ` [PATCH 5/8] Optional ZONE_DMA for x86_64 Christoph Lameter
2006-09-18 18:36 ` [PATCH 6/8] Optional ZONE_DMA for ia64 Christoph Lameter
2006-09-18 18:36 ` [PATCH 7/8] Remove ZONE_DMA remains from parisc Christoph Lameter
2006-09-18 18:36 ` [PATCH 8/8] Remove ZONE_DMA remains from sh/sh64 Christoph Lameter
[not found] ` <20060911222729.4849.69497.sendpatchset@schroedinger.engr.sgi.com>
[not found] ` <20060911222744.4849.26386.sendpatchset@schroedinger.engr.sgi.com>
[not found] ` <450600C7.7090801@yahoo.com.au>
2006-09-12 1:40 ` [PATCH 3/6] Optional ZONE_DMA in the VM Christoph Lameter
[not found] ` <20060912133457.GC10689@sgi.com>
[not found] ` <Pine.LNX.4.64.0609121032310.11278@schroedinger.engr.sgi.com>
2006-09-12 17:47 ` [PATCH 0/8] Optional ZONE_DMA V1 Martin Bligh
2006-09-12 17:53 ` Christoph Lameter
[not found] ` <1158046205.2992.1.camel@laptopd505.fenrus.org>
[not found] ` <Pine.LNX.4.64.0609121024290.11188@schroedinger.engr.sgi.com>
[not found] ` <yq0d5a0fbcj.fsf@jaguar.mkp.net>
[not found] ` <Pine.LNX.4.64.0609130109030.15792@schroedinger.engr.sgi.com>
[not found] ` <4507D4EE.4060501@sgi.com>
2006-09-13 17:23 ` Christoph Lameter
2006-09-13 17:49 ` Jack Steiner
2006-09-13 18:00 ` Christoph Lameter
2006-09-14 8:52 ` Jes Sorensen
2006-09-14 16:55 ` Christoph Lameter
[not found] ` <20060911222739.4849.79915.sendpatchset@schroedinger.engr.sgi.com>
[not found] ` <20060918135559.GB15096@infradead.org>
[not found] ` <20060918152243.GA4320@localhost.na.rta>
2006-09-18 17:33 ` [PATCH 2/6] Introduce CONFIG_ZONE_DMA Christoph Lameter
2006-09-18 22:45 ` Paul Mundt
2006-09-18 22:58 ` Christoph Lameter
2006-09-18 23:25 ` Paul Mundt
-- strict thread matches above, loose matches on Subject: below --
2006-09-11 22:30 [PATCH 0/8] Optional ZONE_DMA V1 Christoph Lameter
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox