assert/crash in __rmqueue() when enabling CONFIG_NUMA
Subsystems (4)
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 3 lines · Ingo Molnar
the 2.6.17-rc2 kernel built with the attached config crashes quite easily under minimal load. Disabling
CONFIG_NUMAmakes it robust again. Crashlog attached.
It would be interesting to know which assertion failed. I guess it might be a zone alignment problem -- it would be interesting to turn the 2 HOLES_IN_ZONE tests into BUG_ONs, and enable them (ie. move them out of HOLES_IN_ZONE).
It might be an idea to unconditionally enable DEBUG_VM in prereleases, too.
Thanks,
Nick
Quoted 9 lines · Nick Piggin
Quoted 3 lines · Ingo Molnar
the 2.6.17-rc2 kernel built with the attached config crashes quite easily under minimal load. Disabling
CONFIG_NUMAmakes it robust again. Crashlog attached.It would be interesting to know which assertion failed. I guess it might be a zone alignment problem -- it would be interesting to turn the 2
HOLES_IN_ZONEtests intoBUG_ONs, and enable them (ie. move them out ofHOLES_IN_ZONE).
ok, i added a couple of printks (see the patch below), and got this:
zone c1f0a600 (HighMem):
pfn: 00037d00
zone->zone_start_pfn: 00037e00 zone->spanned_pages: 00007e00 zone->zone_start_pfn + zone->spanned_pages: 0003fc00
------------[ cut here ]------------ kernel BUG at mm/page_alloc.c:524!
so the pfn is 1MB below the zone's start address - not good. You can find the full bootup log at:
http://redhat.com/~mingo/misc/crash.log
the log should also give an idea about how the zones are layed out, etc. Note that this is an ordinary desktop dual-core box with 1GB RAM booting an allyesconfig NUMA kernel. I suspect this could be some bootup-time zone sizing problem? The config is at:
http://redhat.com/~mingo/misc/config
(the crash is easy to reproduce, so let me know if i can do anything else to debug this.)
Ingo
mm/page_alloc.c +24 -7
@@ -100,17 +100,32 @@ static int page_outside_zone_boundaries( ret =1 ; }while (zone_span_seqretry (zone, seq)); +#define P (x) printk("%s: %08lx\n", #x, x) + +if (ret) { +printk ("zone %p (%s):\n" , zone, zone->name); +P (pfn); +P (zone->zone_start_pfn); +P (zone->spanned_pages); +P (zone->zone_start_pfn + zone->spanned_pages); + } +return ret; }static int page_is_consistent (struct zone *zone,struct page *page) { -#ifdef CONFIG_HOLES_IN_ZONE -if (!pfn_valid (page_to_pfn (page))) +if (!pfn_valid (page_to_pfn (page))) { +printk ("BUG: pfn: %08lx, page: %p\n" , +page_to_pfn (page), page); +dump_stack ();return 0 ; -#endif -if (zone !=page_zone (page)) + } +if (zone !=page_zone (page)) { +printk ("zone: %p != %p == page_zone(%p)\n" , + zone,page_zone (page), page);return 0 ; + }return 1 ; }
@@ -292,10 +307,12 @@ __find_combined_index(unsigned long page*/ static inline int page_is_buddy (struct page *page,int order) { -#ifdef CONFIG_HOLES_IN_ZONE -if (!pfn_valid (page_to_pfn (page))) +if (!pfn_valid (page_to_pfn (page))) { +printk ("BUG: pfn: %08lx, page: %p, order: %d\n" , +page_to_pfn (page), page, order); +dump_stack ();return 0 ; -#endif + }if (PageBuddy (page) &&page_order (page) == order) {BUG_ON (page_count (page) !=0 );
disabling CONFIG_NUMA i get this one during bootup:
Brought up 2 CPUs
BUG: pfn: 0003fff0, page: c3308b00, order: 4 [<c0104cd0>] show_trace+0xd/0xf [<c0104ce7>] dump_stack+0x15/0x17 [<c0154a1c>] free_pages_bulk+0x155/0x246 [<c0155673>] free_hot_cold_page+0x104/0x12c [<c01556da>] free_hot_page+0xa/0xc [<c0155706>] __free_pages+0x2a/0x35 [<c01620ba>] __vunmap+0x95/0xc1 [<c0162183>] vfree+0x29/0x2b [<c0125e46>] build_sched_domains+0xa70/0xc34 [<c0126023>] arch_init_sched_domains+0x19/0x1b [<c1a1f799>] sched_init_smp+0x12/0x23 [<c01003b2>] init+0xb9/0x2cb [<c0102005>] kernel_thread_helper+0x5/0xb
but otherwise no problems.
Ingo
FYI, even on 2.6.17-rc3 i get the one below. v2.6.17 showstopper i guess?
Ingo
zone c1e04600 (HighMem):
pfn: 00037d00zone->zone_start_pfn: 00037e00 zone->spanned_pages: 00007e00 zone->zone_start_pfn + zone->spanned_pages: 0003fc00
------------[ cut here ]------------ kernel BUG at mm/page_alloc.c:526! invalid opcode: 0000 [#1] PREEMPT SMP Modules linked in: CPU: 1 EIP: 0060:[<c0159183>] Not tainted VLI EFLAGS: 00010002 (2.6.17-rc3-lockdep #143)
EIP is at __rmqueue+0x98/0xdd
eax: 00000001 ebx: c305d400 ecx: c012ac22 edx: 00000001
esi: c1e046dc edi: 00000008 ebp: f4ea6bd0 esp: f4ea6bb4
ds: 007b es: 007b ss: 0068
Process chroot02 (pid: 9970, threadinfo=f4ea6000 task=f448e030)
Stack: <0>00000000 c1e04600 c3058000 00000100 c6d42e50 c6d42e5c 00000296 f4ea6c20
c01592ec 00000000 f448e608 00000003 c1e04908 00000000 000201d2 c1e04908
00000014 00000000 00000003 00000001 00000001 c1e04600 00000377 00000000
Call Trace:
[<c0104e5c>] show_stack_log_lvl+0x8b/0x95
[<c0104ffc>] show_registers+0x147/0x1ad
[<c010531b>] die+0x179/0x24e
[<c0f48f9f>] do_trap+0x7c/0x96
[<c0105768>] do_invalid_op+0x89/0x93
[<c0104a03>] error_code+0x4f/0x54
[<c01592ec>] get_page_from_freelist+0x124/0x436
[<c015965e>] __alloc_pages+0x60/0x290
[<c016ba71>] alloc_pages_current+0x77/0x7c
[<c0154cec>] page_cache_alloc_cold+0x7f/0x83
[<c015aa4a>] __do_page_cache_readahead+0x9e/0x1b2
[<c015ac6d>] do_page_cache_readahead+0x40/0x4d
[<c0155fa8>] filemap_nopage+0x149/0x30a
[<c016141b>] __handle_mm_fault+0x3e9/0xb18
[<c0f49e4d>] do_page_fault+0x317/0x725
[<c0104a03>] error_code+0x4f/0x54
[<c019f63d>] padzero+0x19/0x28
[<c01a06fc>] load_elf_binary+0x904/0x15de
[<c0181896>] search_binary_handler+0xcf/0x29e
[<c0181bc0>] do_execve+0x15b/0x1fe
[<c01029df>] sys_execve+0x2a/0x6d
[<c0103ddb>] syscall_call+0x7/0xb
Code: 4d e8 29 01 88 d9 d3 e2 89 55 f0 eb 40 d1 6d f0 83 ee 0c 8b 5d ec 4f 6b 45 f0 54 01 c3 8b 45 e8 89 da e8 24 f8 ff ff 85 c0 74 08 <0f> 0b 0e 02 43 8f 04 c1 8b 16 8d 43 4c 89 42 04 89 53 4c 89 70 Quoted 2 lines · Ingo Molnar
FYI, even on 2.6.17-rc3 i get the one below. v2.6.17 showstopper i guess?
Did you send a full boot log?
If it's using ACPI NUMA try numa=noacpi - it might be some problem with the node discovery on your machine.
-Andi
Quoted 6 lines · Andi Kleen
Quoted 2 lines · Ingo Molnar
FYI, even on 2.6.17-rc3 i get the one below. v2.6.17 showstopper i guess?
Did you send a full boot log?
yes, in the previous mail, in the same thread. (maybe lkml ate it - it's an allyesconfig bootup so a large bootlog and a large config) I've also uploaded them to:
http://redhat.com/~mingo/misc/
debug-pagealloc.patch is the debug patch i made based on Nick's earlier suggestions.
Quoted 2 lines
If it's using ACPI NUMA try numa=noacpi - it might be some problem with the node discovery on your machine.
this is a non-NUMA box (Athlon64 X2 desktop machine).
Ingo
Quoted 16 lines · Ingo Molnar
Quoted 6 lines · Andi Kleen
Quoted 2 lines · Ingo Molnar
FYI, even on 2.6.17-rc3 i get the one below. v2.6.17 showstopper i guess?
Did you send a full boot log?
yes, in the previous mail, in the same thread. (maybe lkml ate it - it's an allyesconfig bootup so a large bootlog and a large config) I've also uploaded them to:
http://redhat.com/~mingo/misc/
Quoted 7 lines
debug-pagealloc.patch is the debug patch i made based on Nick's earlier suggestions.
Quoted 2 lines
If it's using ACPI NUMA try numa=noacpi - it might be some problem with the node discovery on your machine.
this is a non-NUMA box (Athlon64 X2 desktop machine).
Oh that's a 32bit kernel. I don't think the 32bit NUMA has ever worked anywhere but some Summit systems (at least every time I tried it it blew up on me and nobody seems to use it regularly). Maybe it would be finally time to mark it CONFIG_BROKEN though or just remove it (even by design it doesn't work very well)
If you want NUMA use 64bit.
-Andi
Quoted 23 lines · Andi Kleen
Quoted 22 lines · Ingo Molnar
Quoted 6 lines · Andi Kleen
Quoted 2 lines · Ingo Molnar
FYI, even on 2.6.17-rc3 i get the one below. v2.6.17 showstopper i guess?
Did you send a full boot log?
yes, in the previous mail, in the same thread. (maybe lkml ate it - it's an allyesconfig bootup so a large bootlog and a large config) I've also uploaded them to:
http://redhat.com/~mingo/misc/debug-pagealloc.patch is the debug patch i made based on Nick's earlier suggestions.
Quoted 2 lines
If it's using ACPI NUMA try numa=noacpi - it might be some problem with the node discovery on your machine.
Quoted 7 lines
Quoted 1 line
this is a non-NUMA box (Athlon64 X2 desktop machine).
Oh that's a 32bit kernel. I don't think the 32bit NUMA has ever worked anywhere but some Summit systems (at least every time I tried it it blew up on me and nobody seems to use it regularly). Maybe it would be finally time to mark it
CONFIG_BROKENthough or just remove it (even by design it doesn't work very well)
what you saw before could easily be this particular bug - the zones are apparently mis-sized (aligned to 1MB while they need to be aligned to 4MB), which causes quick and nasty crashes under light user load.
Ingo
Quoted 2 lines
Oh that's a 32bit kernel. I don't think the 32bit NUMA has ever worked
anywhere but some Summit systems (at least every time I tried it it blew up on me and nobody seems to use it regularly). Maybe it would be finally time to mark itCONFIG_BROKENthough or just remove it (even by design it doesn't work very well)
Bollocks. It works fine, and is tested every single day, on every git release, and every -mm tree.
M.
Quoted 6 lines · Martin J. Bligh
Quoted 2 lines
Oh that's a 32bit kernel. I don't think the 32bit NUMA has ever worked
anywhere but some Summit systems (at least every time I tried it it blew up on me and nobody seems to use it regularly). Maybe it would be finally time to mark itCONFIG_BROKENthough or just remove it (even by design it doesn't work very well)Bollocks. It works fine, and is tested every single day, on every git release, and every -mm tree.
Whatever the case, there definitely does not appear to be sufficient zone alignment enforced for the buddy allocator. I cannot see how it could work if zones are not aligned on 4MB boundaries.
Maybe some architectures / subarch code naturally does this for us, but Ingo is definitely hitting this bug because his config does not (align, that is).
I've randomly added a couple more cc's.
Signature · 8 lines
SUSE Labs, Novell Inc. Send instant messages to your online friends http://au.messenger.yahoo.com -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Nick Piggin wrote: [Tue May 02 2006, 10:25:57AM EDT]
Quoted 15 lines
Quoted 9 lines · Martin J. Bligh
Quoted 5 lines
Oh that's a 32bit kernel. I don't think the 32bit NUMA has ever worked anywhere but some Summit systems (at least every time I tried it it blew up on me and nobody seems to use it regularly). Maybe it would be finally time to mark it
CONFIG_BROKENthough or just remove it (even by design it doesn't work very well)Bollocks. It works fine, and is tested every single day, on every git release, and every -mm tree.
Whatever the case, there definitely does not appear to be sufficient zone alignment enforced for the buddy allocator. I cannot see how it could work if zones are not aligned on 4MB boundaries.
Quoted 6 lines
Maybe some architectures / subarch code naturally does this for us, but Ingo is definitely hitting this bug because his config does not (align, that is).
I've randomly added a couple more cc's.
The patch below isn't compile tested or correct for those cases where alloc_remap is called or where arch code has allocated node_mem_map for CONFIG_FLAT_NODE_MEM_MAP. It's just conveying what I believe the issue is.
Andy added code to buddy allocator which doesn't require the zone's endpoints to be aligned to MAX_ORDER. I think the issue is that the buddy allocator requires the node_mem_map's endpoints to be MAX_ORDER aligned. Otherwise __page_find_buddy could compute a buddy not in node_mem_map for partial MAX_ORDER regions at zone's endpoints. page_is_buddy will detect that these pages at endpoints aren't PG_buddy (they were zeroed out by bootmem allocator and not part of zone). Of course the negative here is we could waste a little memory but the positive is eliminating all the old checks for zone boundary conditions.
SPARSEMEM won't encounter this issue because of MAX_ORDER size constraint when SPARSEMEM is configured. ia64 VIRTUAL_MEM_MAP doesn't need the logic either because the holes and endpoints are handled differently. This leaves checking alloc_remap and other arches which privately allocate for node_mem_map.
Any how I could be totally wrong but like I said this requires more thought.
bob
mm/page_alloc.c +12 -3
@@ -2123,14 +2123,23 @@ static void __init alloc_node_mem_map(st#ifdef CONFIG_FLAT_NODE_MEM_MAP /* ia64 gets its own node_mem_map, before this, without bootmem */ if (!pgdat->node_mem_map) { -unsigned long size; +unsigned long size, start, end;struct page *map; - size = (pgdat->node_spanned_pages +1 ) *sizeof (struct page ); +/* +* The zone's endpoints aren't required to be MAX_ORDER +* aligned but the node_mem_map endpoints must be in order +* for the buddy allocator to function correctly. +*/ + start = pgdat->node_start_pfn & ~((1 << (MAX_ORDER -1 )) -1 ); + end = start + pgdat->node_spanned_pages; + end = (end + ((1 << (MAX_ORDER -1 )) -1 ) & + ~((1 << (MAX_ORDER - 1)) - 1); + size = (end - start) *sizeof (struct page ); map =alloc_remap (pgdat->node_id, size);if (!map) map =alloc_bootmem_node (pgdat, size); - pgdat->node_mem_map = map; + pgdat->node_mem_map = map + ( pgdat->node_start_pfn - start); }#ifdef CONFIG_FLATMEM /*
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 4 lines · Bob Picco
The patch below isn't compile tested or correct for those cases where
alloc_remapis called or where arch code has allocatednode_mem_mapforCONFIG_FLAT_NODE_MEM_MAP. It's just conveying what I believe the issue is.
thx. One pair of parentheses were missing i think - see the delta fix below. I'll try it.
Ingo
mm/page_alloc.c +1 -1
@@ -2296,7 +2296,7 @@ static void __init alloc_node_mem_map(st*/ start = pgdat->node_start_pfn & ~((1 << (MAX_ORDER -1 )) -1 ); end = start + pgdat->node_spanned_pages; - end = (end + ((1 << (MAX_ORDER -1 )) -1 ) & + end = (end + ((1 << (MAX_ORDER -1 )) -1 )) & ~((1 << (MAX_ORDER -1 )) -1 ); size = (end - start) *sizeof (struct page ); map =alloc_remap (pgdat->node_id, size);
Quoted 7 lines · Ingo Molnar
Quoted 4 lines
The patch below isn't compile tested or correct for those cases where
alloc_remapis called or where arch code has allocatednode_mem_mapforCONFIG_FLAT_NODE_MEM_MAP. It's just conveying what I believe the issue is.thx. One pair of parentheses were missing i think - see the delta fix below. I'll try it.
the same easy crash still happens if i enable CONFIG_NUMA:
zone c214e600 (HighMem):
pfn: 00037d00
zone->zone_start_pfn: 00037e00 zone->spanned_pages: 00007e00 zone->zone_start_pfn + zone->spanned_pages: 0003fc00
[<c010574a>] do_invalid_op+0x63/0x93 [<c0104a0b>] error_code+0x4f/0x54 [<c0164d48>] get_page_from_freelist+0x13e/0x565 [<c01651dd>] __alloc_pages+0x6e/0x325 [<c017a6c9>] alloc_page_vma+0x80/0x86 [<c016e2ae>] __handle_mm_fault+0x1e7/0xd00 [<c10fe9af>] do_page_fault+0x339/0x7c5 [<c0104a0b>] error_code+0x4f/0x54
see the debug patch below.
Ingo
----
From: Ingo Molnar <[email protected]>
do buddy zone size checks unconditionally.
----
mm/page_alloc.c | 31 ++++++++++++++++++++++++------- 1 files changed, 24 insertions(+), 7 deletions(-)
mm/page_alloc.c +24 -7
@@ -101,17 +101,32 @@ static int page_outside_zone_boundaries( ret =1 ; }while (zone_span_seqretry (zone, seq)); +#define P (x) printk("%s: %08lx\n", #x, x) + +if (ret) { +printk ("zone %p (%s):\n" , zone, zone->name); +P (pfn); +P (zone->zone_start_pfn); +P (zone->spanned_pages); +P (zone->zone_start_pfn + zone->spanned_pages); + } +return ret; }static int page_is_consistent (struct zone *zone,struct page *page) { -#ifdef CONFIG_HOLES_IN_ZONE -if (!pfn_valid (page_to_pfn (page))) +if (!pfn_valid (page_to_pfn (page))) { +printk ("BUG: pfn: %08lx, page: %p\n" , +page_to_pfn (page), page); +dump_stack ();return 0 ; -#endif -if (zone !=page_zone (page)) + } +if (zone !=page_zone (page)) { +printk ("zone: %p != %p == page_zone(%p)\n" , + zone,page_zone (page), page);return 0 ; + }return 1 ; }
@@ -309,10 +324,12 @@ __find_combined_index(unsigned long page*/ static inline int page_is_buddy (struct page *page,int order) { -#ifdef CONFIG_HOLES_IN_ZONE -if (!pfn_valid (page_to_pfn (page))) +if (!pfn_valid (page_to_pfn (page))) { +printk ("BUG: pfn: %08lx, page: %p, order: %d\n" , +page_to_pfn (page), page, order); +dump_stack ();return 0 ; -#endif + }if (PageBuddy (page) &&page_order (page) == order) {BUG_ON (page_count (page) !=0 );
Quoted 1 line · Ingo Molnar
the same easy crash still happens if i enable
CONFIG_NUMA:
btw., with CONFIG_NUMA off i get this warning during bootup:
BUG: pfn: 0003fff0, page: c404d840, order: 4 [<c0104e7f>] show_trace+0xd/0xf [<c0104e96>] dump_stack+0x15/0x17 [<c0163312>] free_pages_bulk+0x207/0x370 [<c01642f9>] free_hot_cold_page+0x127/0x17c [<c016438d>] free_hot_page+0xa/0xc [<c01643e5>] __free_pages+0x56/0x6f [<c0172e14>] __vunmap+0xc1/0xed [<c0172f02>] vfree+0x3b/0x3e [<c0128865>] build_sched_domains+0xaf2/0xcde [<c0128a6a>] arch_init_sched_domains+0x19/0x1b [<c1bd3a67>] sched_init_smp+0x18/0x349 [<c01003c6>] init+0xb9/0x2cb [<c0102005>] kernel_thread_helper+0x5/0xb
but this is nonfatal and the system is robust afterwards. (this warning is not present if CONFIG_NUMA is on) [Btw., in the NUMA test i also had CONFIG_MIGRATION enabled.]
Ingo
Quoted 29 lines · Bob Picco
Nick Piggin wrote: [Tue May 02 2006, 10:25:57AM EDT]
Quoted 16 lines
Quoted 9 lines · Martin J. Bligh
Quoted 5 lines
Oh that's a 32bit kernel. I don't think the 32bit NUMA has ever worked anywhere but some Summit systems (at least every time I tried it it blew up on me and nobody seems to use it regularly). Maybe it would be finally time to mark it
CONFIG_BROKENthough or just remove it (even by design it doesn't work very well)Bollocks. It works fine, and is tested every single day, on every git release, and every -mm tree.
Whatever the case, there definitely does not appear to be sufficient zone alignment enforced for the buddy allocator. I cannot see how it could work if zones are not aligned on 4MB boundaries.
Quoted 6 lines
Maybe some architectures / subarch code naturally does this for us, but Ingo is definitely hitting this bug because his config does not (align, that is).
I've randomly added a couple more cc's.
The patch below isn't compile tested or correct for those cases where
alloc_remapis called or where arch code has allocatednode_mem_mapforCONFIG_FLAT_NODE_MEM_MAP. It's just conveying what I believe the issue is.
Quoted 9 lines
Andy added code to buddy allocator which doesn't require the zone's endpoints to be aligned to
MAX_ORDER. I think the issue is that the buddy allocator requires the node_mem_map's endpoints to beMAX_ORDERaligned. Otherwise__page_find_buddycould compute a buddy not innode_mem_mapfor partialMAX_ORDERregions at zone's endpoints.page_is_buddywill detect that these pages at endpoints aren'tPG_buddy(they were zeroed out by bootmem allocator and not part of zone). Of course the negative here is we could waste a little memory but the positive is eliminating all the old checks for zone boundary conditions.
Yes this is correct. The buddy location algorithm uses the relative pfn number to locate the buddy. Both the old anew new free detect algorithms require a struct page exist for that buddy regardless of whether the page exists in memory. Thus the node_mem_map needs to exist out to a MAX_ORDER boundry in both directions. With real machines we would likely get this as memory is mostly in larger chunks than MAX_ORDER and generally maximally aligned. From what I can see we could potentially not be allocating the end correctly but the rmap allocation would likely be larger than the request so we'd get away with it.
Quoted 9 lines
SPARSEMEM won't encounter this issue because of
MAX_ORDERsize constraint when SPARSEMEM is configured. ia64VIRTUAL_MEM_MAPdoesn't need the logic either because the holes and endpoints are handled differently. This leaves checkingalloc_remapand other arches which privately allocate fornode_mem_map.Any how I could be totally wrong but like I said this requires more thought.
I'll have a go at testing this to see what difference it makes. I think there might be a problem with the buddy merging at zone boundries as we are anyhow (or the code commentry is incomplete), so am going to have a look at that at the same time.
-apw
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
I haven't thought through it completely, but these two lines worry me:
Quoted 2 lines
+ start =
pgdat->node_start_pfn& ~((1 << (MAX_ORDER- 1)) - 1);
+ end = start +pgdat->node_spanned_pages;
Should the "end" be based off of the original "start", or the aligned "start"?
(using decimal math to make it easy) ...
Let's say that MAX_ORDER comes out to be 10 pages. node_start_pfn is 9, and the node's end pfn is 21. node_spanned_pages will be 12. "start" will get rounded down to 0. "end" will be "start" (0) + node_spanned_pages (12), so 12. "end" then gets rounded up to 20. However, this is not sufficient space for the mem_map as the node *actually* ended at 21.
I think that "end" needs to be calculated without rounding down the start_pfn, or the node_spanned_pages number needs to be rounded up in the same way that "end" is.
Does that sound right?
Also, it might look nicer if there was an intermediate variable something like this:
#define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1))
Take a look at the loop below, I've also used ALIGN() from kernel.h for the "end" alignment. I think it is just a drop-in replacement.
/* ia64 gets its own node_mem_map, before this, without bootmem */
if (!pgdat->node_mem_map) {
unsigned long size, start, end;
struct page *map;
/*
* The zone's endpoints aren't required to be MAX_ORDER
* aligned but the node_mem_map endpoints must be in order
* for the buddy allocator to function correctly.
*/
start = pgdat->node_start_pfn & ~(MAX_ORDER_NR_PAGES - 1);
end = start + pgdat->node_spanned_pages;
end = ALIGN(end, MAX_ORDER_NR_PAGES);
size = (end - start) * sizeof(struct page);
map = alloc_remap(pgdat->node_id, size);
if (!map)
map = alloc_bootmem_node(pgdat, size);
pgdat->node_mem_map = map + (pgdat->node_start_pfn - start);
}-- Dave
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Dave Hansen wrote: [Thu May 04 2006, 11:21:06AM EDT]
Quoted 7 lines
I haven't thought through it completely, but these two lines worry me:
Quoted 2 lines
+ start =
pgdat->node_start_pfn& ~((1 << (MAX_ORDER- 1)) - 1);
+ end = start +pgdat->node_spanned_pages;Should the "end" be based off of the original "start", or the aligned "start"?
Yes. I failed to quilt refresh before sending. You mean end should be end = pgdat->node_start_pfn + pgdat->node_spanned_pages before rounding up.
Quoted 10 lines
(using decimal math to make it easy) ...
Let's say that
MAX_ORDERcomes out to be 10 pages.node_start_pfnis 9, and the node's end pfn is 21.node_spanned_pageswill be 12. "start" will get rounded down to 0. "end" will be "start" (0) +node_spanned_pages(12), so 12. "end" then gets rounded up to 20. However, this is not sufficient space for themem_mapas the node *actually* ended at 21.
Quoted 5 lines
I think that "end" needs to be calculated without rounding down the
start_pfn, or thenode_spanned_pagesnumber needs to be rounded up in the same way that "end" is.Does that sound right?
Yes.
Quoted 5 lines
Also, it might look nicer if there was an intermediate variable something like this:
#define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1))
Yes.
Quoted 4 lines
Take a look at the loop below, I've also used
ALIGN()fromkernel.hfor the "end" alignment. I think it is just a drop-in replacement.
Quoted 11 lines
/* ia64 gets its own node_mem_map, before this, without bootmem */
if (!pgdat->node_mem_map) {
unsigned long size, start, end;
struct page *map;
/*
* The zone's endpoints aren't required to be MAX_ORDER
* aligned but the node_mem_map endpoints must be in order
* for the buddy allocator to function correctly.
*/
start = pgdat->node_start_pfn & ~(MAX_ORDER_NR_PAGES - 1);end = pgdat->node_start_pfn + pgdat->node_spanned_pages;
Quoted 10 lines
end = start + pgdat->node_spanned_pages; end = ALIGN(end, MAX_ORDER_NR_PAGES); size = (end - start) * sizeof(struct page); map = alloc_remap(pgdat->node_id, size); if (!map) map = alloc_bootmem_node(pgdat, size); pgdat->node_mem_map = map + (pgdat->node_start_pfn - start); }-- Dave
bob
Quoted 1 line
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 11 lines · Bob Picco
Dave Hansen wrote: [Thu May 04 2006, 11:21:06AM EDT]
Quoted 7 lines
I haven't thought through it completely, but these two lines worry me:
Quoted 2 lines
+ start =
pgdat->node_start_pfn& ~((1 << (MAX_ORDER- 1)) - 1);
+ end = start +pgdat->node_spanned_pages;Should the "end" be based off of the original "start", or the aligned "start"?
Yes. I failed to quilt refresh before sending. You mean end should be end =
pgdat->node_start_pfn+pgdat->node_spanned_pagesbefore rounding up.
Yep. Looks good.
-- Dave
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 6 lines · Bob Picco
Dave Hansen wrote: [Thu May 04 2006, 11:21:06AM EDT]
Quoted 5 lines
I haven't thought through it completely, but these two lines worry me:
Quoted 2 lines
+ start =
pgdat->node_start_pfn& ~((1 << (MAX_ORDER- 1)) - 1);
+ end = start +pgdat->node_spanned_pages;
Quoted 6 lines
Quoted 2 lines
Should the "end" be based off of the original "start", or the aligned "start"?
Yes. I failed to quilt refresh before sending. You mean end should be end =
pgdat->node_start_pfn+pgdat->node_spanned_pagesbefore rounding up.
do you have an updated patch i should try?
Ingo
Ingo Molnar wrote: [Thu May 04 2006, 03:25:28PM EDT]
Quoted 12 lines · Bob Picco
Quoted 10 lines
Dave Hansen wrote: [Thu May 04 2006, 11:21:06AM EDT]
Quoted 7 lines
I haven't thought through it completely, but these two lines worry me:
Quoted 2 lines
+ start =
pgdat->node_start_pfn& ~((1 << (MAX_ORDER- 1)) - 1);
+ end = start +pgdat->node_spanned_pages;Should the "end" be based off of the original "start", or the aligned "start"?
Quoted 7 lines
Quoted 3 lines
Yes. I failed to quilt refresh before sending. You mean end should be end =
pgdat->node_start_pfn+pgdat->node_spanned_pagesbefore rounding up.do you have an updated patch i should try?
Ingo
You can try this but don't believe it will change your outcome. I've booted this on ia64 with slight modification to eliminate VIRTUAL_MEM_MAP and have only DISCONTIGMEM. Your case is failing at the front edge of of the zone and not the ending edge which had a flaw in my first post of the patch. I would have expected the first patch to handle the front edge correctly.
I don't remember seeing your .config in the thread (or blind and unable to see it). Would you please send it my way.
I'm also hoping Andy has time to look into this.
bob
mm/page_alloc.c +11 -3
@@ -2123,14 +2123,22 @@ static void __init alloc_node_mem_map(st#ifdef CONFIG_FLAT_NODE_MEM_MAP /* ia64 gets its own node_mem_map, before this, without bootmem */ if (!pgdat->node_mem_map) { -unsigned long size; +unsigned long size, start, end;struct page *map; - size = (pgdat->node_spanned_pages +1 ) *sizeof (struct page ); +/* +* The zone's endpoints aren't required to be MAX_ORDER +* aligned but the node_mem_map endpoints must be in order +* for the buddy allocator to function correctly. +*/ + start = pgdat->node_start_pfn & ~(MAX_ORDER_NR_PAGES -1 ); + end = pgdat->node_start_pfn + pgdat->node_spanned_pages; + end =ALIGN (end,MAX_ORDER_NR_PAGES ); + size = (end - start) *sizeof (struct page ); map =alloc_remap (pgdat->node_id, size);if (!map) map =alloc_bootmem_node (pgdat, size); - pgdat->node_mem_map = map; + pgdat->node_mem_map = map + (pgdat->node_start_pfn - start); }#ifdef CONFIG_FLATMEM /*
include/linux/mmzone.h +1 -0
@@ -22,6 +22,7 @@#else #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER#endif +#define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1))struct free_area {struct list_head free_list;
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 31 lines · Bob Picco
Ingo Molnar wrote: [Thu May 04 2006, 03:25:28PM EDT]
Quoted 14 lines · Bob Picco
Quoted 13 lines
Dave Hansen wrote: [Thu May 04 2006, 11:21:06AM EDT]
Quoted 8 lines
I haven't thought through it completely, but these two lines worry me:
Quoted 2 lines
+ start =
pgdat->node_start_pfn& ~((1 << (MAX_ORDER- 1)) - 1);
+ end = start +pgdat->node_spanned_pages;Should the "end" be based off of the original "start", or the aligned "start"?
Quoted 7 lines
Quoted 3 lines
Yes. I failed to quilt refresh before sending. You mean end should be end =
pgdat->node_start_pfn+pgdat->node_spanned_pagesbefore rounding up.do you have an updated patch i should try?
Ingo
You can try this but don't believe it will change your outcome. I've booted this on ia64 with slight modification to eliminate
VIRTUAL_MEM_MAPand have only DISCONTIGMEM. Your case is failing at the front edge of of the zone and not the ending edge which had a flaw in my first post of the patch. I would have expected the first patch to handle the front edge correctly.
Quoted 6 lines
I don't remember seeing your .config in the thread (or blind and unable to see it). Would you please send it my way.
I'm also hoping Andy has time to look into this.
bob
Yeah will have a look tommorrow my time. Could you drop me the .config too. There is definatly some unstated requirements on alignment, which I was testing today. I presume its one of those thats being violated.
-apw
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 4 lines · Andy Whitcroft
Yeah will have a look tommorrow my time. Could you drop me the .config too. There is definatly some unstated requirements on alignment, which I was testing today. I presume its one of those thats being violated.
the config is at:
http://redhat.com/~mingo/misc/config
the bootlog is at:
http://redhat.com/~mingo/misc/crash.log
Ingo
Andy Wihitcroft wrote: [Thu May 04 2006, 05:50:29PM EDT]
Quoted 37 lines
Quoted 36 lines · Bob Picco
Ingo Molnar wrote: [Thu May 04 2006, 03:25:28PM EDT]
Quoted 14 lines · Bob Picco
Quoted 13 lines
Dave Hansen wrote: [Thu May 04 2006, 11:21:06AM EDT]
Quoted 8 lines
I haven't thought through it completely, but these two lines worry me:
Quoted 2 lines
+ start =
pgdat->node_start_pfn& ~((1 << (MAX_ORDER- 1)) - 1);
+ end = start +pgdat->node_spanned_pages;Should the "end" be based off of the original "start", or the aligned "start"?
Quoted 7 lines
Quoted 3 lines
Yes. I failed to quilt refresh before sending. You mean end should be end =
pgdat->node_start_pfn+pgdat->node_spanned_pagesbefore rounding up.do you have an updated patch i should try?
Ingo
You can try this but don't believe it will change your outcome. I've booted this on ia64 with slight modification to eliminate
VIRTUAL_MEM_MAPand have only DISCONTIGMEM. Your case is failing at the front edge of of the zone and not the ending edge which had a flaw in my first post of the patch. I would have expected the first patch to handle the front edge correctly.I don't remember seeing your .config in the thread (or blind and unable to see it). Would you please send it my way.
I'm also hoping Andy has time to look into this.
Quoted 7 lines
Quoted 1 line
bob
Yeah will have a look tommorrow my time. Could you drop me the .config too. There is definatly some unstated requirements on alignment, which I was testing today. I presume its one of those thats being violated.
-apw
I think the problem was my not looking closely at the full email thread.
I finally found time to read entire thread (found Ingo's config and boot logs). The patch below should fix Ingo's problem. It's probably only required for ZONE_HIGHMEM. To be safe, I think we should apply it generically.
Not only must node_mem_map array be MAX_ORDER aligned but the the distance between interior zones covered by node_mem_map must satisfy this alignment. While in the buddy allocator before checking for a valid buddy the buddy page must reside in the parent's zone too. ZONE_HIGHMEM doesn't satisfy the zone alignment condition and requires this new check that the parent's buddy and parent are within by the same zone.
The other possible solution is aligning HIGHMEM zone to satisfy MAX_ORDER. This I didn't pursue and possibly is what Andy refers to above.
Adding a printk for the line with the zonenum mismatch condition caught two instances in boot up on my x86 which was configured similarly to Ingo's config.
bob
mm/page_alloc.c +25 -9
@@ -280,6 +280,15 @@ __find_combined_index(unsigned long pagereturn (page_idx & ~(1 << order)); } +static inline int page_in_zone_hole (struct page *page) +{ +#ifdef CONFIG_HOLES_IN_ZONE +if (!pfn_valid (page_to_pfn (page))) +return 1 ; +#endif +return 0 ; +} +/* * This function checks whether a page is free && is the buddy * we can do coalesce a page and its buddy if
@@ -294,11 +303,6 @@ __find_combined_index(unsigned long page*/ static inline int page_is_buddy (struct page *page,int order) { -#ifdef CONFIG_HOLES_IN_ZONE -if (!pfn_valid (page_to_pfn (page))) -return 0 ; -#endif -if (PageBuddy (page) &&page_order (page) == order) {BUG_ON (page_count (page) !=0 );return 1 ;
@@ -351,7 +355,11 @@ static inline void __free_one_page(strucstruct page *buddy; buddy =__page_find_buddy (page, page_idx, order); -if (!page_is_buddy (buddy, order)) +if (page_in_zone_hole (buddy)) +break ; +else if (page_zonenum (buddy) !=page_zonenum (page)) +break ; +else if (!page_is_buddy (buddy, order))break ;/* Move the buddy up one level. */ list_del (&buddy->lru);
@@ -2123,14 +2131,22 @@ static void __init alloc_node_mem_map(st#ifdef CONFIG_FLAT_NODE_MEM_MAP /* ia64 gets its own node_mem_map, before this, without bootmem */ if (!pgdat->node_mem_map) { -unsigned long size; +unsigned long size, start, end;struct page *map; - size = (pgdat->node_spanned_pages +1 ) *sizeof (struct page ); +/* +* The zone's endpoints aren't required to be MAX_ORDER +* aligned but the node_mem_map endpoints must be in order +* for the buddy allocator to function correctly. +*/ + start = pgdat->node_start_pfn & ~(MAX_ORDER_NR_PAGES -1 ); + end = pgdat->node_start_pfn + pgdat->node_spanned_pages; + end =ALIGN (end,MAX_ORDER_NR_PAGES ); + size = (end - start) *sizeof (struct page ); map =alloc_remap (pgdat->node_id, size);if (!map) map =alloc_bootmem_node (pgdat, size); - pgdat->node_mem_map = map; + pgdat->node_mem_map = map + (pgdat->node_start_pfn - start); }#ifdef CONFIG_FLATMEM /*
include/linux/mmzone.h +1 -0
@@ -22,6 +22,7 @@#else #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER#endif +#define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1))struct free_area {struct list_head free_list;
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
mm/page_alloc.c static inline void __free_one_page(struc · line 363
Quoted 7 lines · Bob Picco
mm/page_alloc.c +5
-1-if (!page_is_buddy (buddy, order)) +if (page_in_zone_hole (buddy)) +break ; +else if (page_zonenum (buddy) !=page_zonenum (page)) +break ; +else if (!page_is_buddy (buddy, order))break ;/* Move the buddy up one level. */
The page_zonenum() checks look good, but I'm not sure I understand the page_in_zone_hole() part. If a page is in a hole in a zone, it will still have a valid mem_map entry, right? It should also never have been put into the allocator, so it also won't ever be coalesced.
I'm a bit confused. :(
BTW, I like the idea of just aligning HIGHMEM's start because it has no runtime cost. Buuuuut, it is still just a shift and compare of the two page->flags, which should already be (or will soon anyway be) in the cache.
-- Dave
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Dave Hansen wrote: [Fri May 05 2006, 10:33:10AM EDT]
Quoted 9 lines · Bob Picco
mm/page_alloc.c static inline void __free_one_page(struc · line 363
Quoted 7 lines
mm/page_alloc.c +5
-1-if (!page_is_buddy (buddy, order)) +if (page_in_zone_hole (buddy)) +break ; +else if (page_zonenum (buddy) !=page_zonenum (page)) +break ; +else if (!page_is_buddy (buddy, order))break ;/* Move the buddy up one level. */
Quoted 4 lines
The
page_zonenum()checks look good, but I'm not sure I understand thepage_in_zone_hole()part. If a page is in a hole in a zone, it will still have a validmem_mapentry, right? It should also never have been put into the allocator, so it also won't ever be coalesced.
This has always been subtle and not too revealing. It probably should have a comment. The page_in_zone_hole check is for ia64 VIRTUAL_MEM_MAP. You might compute a page structure which is in a hole not backed by memory; an unallocated page which covers pages structures. VIRTUAL_MEM_MAP uses a contiguous virtual region with virtual space holes not backed by memory. Take a look at ia64_pfn_valid.
Quoted 7 lines
I'm a bit confused. :(
BTW, I like the idea of just aligning HIGHMEM's start because it has no runtime cost. Buuuuut, it is still just a shift and compare of the two
page->flags, which should already be (or will soon anyway be) in the cache.
Yes. I'll defer to Andy whether he wants the zonenum check or to align HIGHMEM corrrectly.
Quoted 3 lines
-- Dave
bob
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 11 lines · Bob Picco
Dave Hansen wrote: [Fri May 05 2006, 10:33:10AM EDT]
Quoted 4 lines
The
page_zonenum()checks look good, but I'm not sure I understand thepage_in_zone_hole()part. If a page is in a hole in a zone, it will still have a validmem_mapentry, right? It should also never have been put into the allocator, so it also won't ever be coalesced.This has always been subtle and not too revealing. It probably should have a comment. The
page_in_zone_holecheck is for ia64VIRTUAL_MEM_MAP. You might compute a page structure which is in a hole not backed by memory; an unallocated page which covers pages structures.VIRTUAL_MEM_MAPuses a contiguous virtual region with virtual space holes not backed by memory. Take a look atia64_pfn_valid.
Ahhh. I hadn't made the ia64 connection. I wonder if it is worth making CONFIG_HOLES_IN_ZONE say ia64 or something about vmem_map in it somewhere. Might be worth at least a comment like this:
+ if (page_in_zone_hole(buddy)) /* noop on all but ia64 */
+ break;
+ else if (page_zonenum(buddy) != page_zonenum(page))
+ break;
+ else if (!page_is_buddy(buddy, order))
break; /* Move the buddy up one level. */
BTW, wasn't the whole idea of discontig to have holes in zones (before NUMA) without tricks like this? ;)
-- Dave
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 11 lines
Ahhh. I hadn't made the ia64 connection. I wonder if it is worth making
CONFIG_HOLES_IN_ZONEsay ia64 or something aboutvmem_mapin it somewhere. Might be worth at least a comment like this:mm/page_alloc.c +5
-0+if (page_in_zone_hole (buddy))/* noop on all but ia64 */ +break ; +else if (page_zonenum (buddy) !=page_zonenum (page)) +break ; +else if (!page_is_buddy (buddy, order))break ;/* Move the buddy up one level. */
Quoted 2 lines
BTW, wasn't the whole idea of discontig to have holes in zones (before NUMA) without tricks like this? ;)
Sparsemem should fix this - that was one of the things Andy designed it for. Then we can remove the virtual memmap stuff (and discontig). Indeed, I'd hope we're ready to do that real soon now ... has anyone got an ia64 box that needed virtual memmap that they could test this on?
M.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Martin J. Bligh wrote: [Fri May 05 2006, 11:03:02AM EDT]
Quoted 14 lines
Quoted 11 lines
Ahhh. I hadn't made the ia64 connection. I wonder if it is worth making
CONFIG_HOLES_IN_ZONEsay ia64 or something aboutvmem_mapin it somewhere. Might be worth at least a comment like this:mm/page_alloc.c +5
-0+if (page_in_zone_hole (buddy))/* noop on all but ia64 */ +break ; +else if (page_zonenum (buddy) !=page_zonenum (page)) +break ; +else if (!page_is_buddy (buddy, order))break ;/* Move the buddy up one level. */ Quoted 2 lines
BTW, wasn't the whole idea of discontig to have holes in zones (before NUMA) without tricks like this? ;)
Quoted 7 lines
Sparsemem should fix this - that was one of the things Andy designed it for. Then we can remove the virtual memmap stuff (and discontig). Indeed, I'd hope we're ready to do that real soon now ... has anyone got an ia64 box that needed virtual memmap that they could test this on?
M.
I totally agree about SPARSEMEM. I believe most ia64 boxes use VIRTUAL_MEM_MAP. I only know of Fujitsu and myself that use SPARSEMEM for ia64 (perhaps Andy too in his testing). Dave and I have advocated its use more than once.
bob
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Dave Hansen wrote: [Fri May 05 2006, 10:57:44AM EDT]
Quoted 24 lines · Bob Picco
Quoted 11 lines
Dave Hansen wrote: [Fri May 05 2006, 10:33:10AM EDT]
Quoted 4 lines
The
page_zonenum()checks look good, but I'm not sure I understand thepage_in_zone_hole()part. If a page is in a hole in a zone, it will still have a validmem_mapentry, right? It should also never have been put into the allocator, so it also won't ever be coalesced.This has always been subtle and not too revealing. It probably should have a comment. The
page_in_zone_holecheck is for ia64VIRTUAL_MEM_MAP. You might compute a page structure which is in a hole not backed by memory; an unallocated page which covers pages structures.VIRTUAL_MEM_MAPuses a contiguous virtual region with virtual space holes not backed by memory. Take a look atia64_pfn_valid.Ahhh. I hadn't made the ia64 connection. I wonder if it is worth making
CONFIG_HOLES_IN_ZONEsay ia64 or something aboutvmem_mapin it somewhere. Might be worth at least a comment like this:mm/page_alloc.c +5
-0+if (page_in_zone_hole (buddy))/* noop on all but ia64 */ +break ; +else if (page_zonenum (buddy) !=page_zonenum (page)) +break ; +else if (!page_is_buddy (buddy, order))break ;/* Move the buddy up one level. */
Quoted 2 lines
BTW, wasn't the whole idea of discontig to have holes in zones (before NUMA) without tricks like this? ;)
Sure you could boot ia64 with just DISCONTIGMEM and no VIRTUAL_MEM_MAP. In fact that's exactly what I did to test code added in alloc_node_mem_map. Unfortunately I was missing 1Gb from free memory after booting. The missing 1Gb was consumed by reserved pages structures :)
Quoted 3 lines
-- Dave
bob
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 11 lines · Dave Hansen
Ahhh. I hadn't made the ia64 connection. I wonder if it is worth making
CONFIG_HOLES_IN_ZONEsay ia64 or something aboutvmem_mapin it somewhere. Might be worth at least a comment like this:mm/page_alloc.c +5
-0+if (page_in_zone_hole (buddy))/* noop on all but ia64 */ +break ; +else if (page_zonenum (buddy) !=page_zonenum (page)) +break ; +else if (!page_is_buddy (buddy, order))break ;/* Move the buddy up one level. */
Quoted 2 lines
BTW, wasn't the whole idea of discontig to have holes in zones (before NUMA) without tricks like this? ;)
Yes.
I don't like the patch much, because all that logic should be moved into page_is_buddy where I put it (surely it is more readable not to have the checks spilling out -- a page which is not in the correct zone or is a "hole" is by definition not a buddy, right?)
So, I agree with adding the zone check if any architecture needs it. But it would be something under CONFIG_HOLES_IN_ZONE, and the arch needs to *either* align zones correctly (as they've always had to), or turn this option on.
Thanks for working at this, everyone.
Signature · 8 lines
SUSE Labs, Novell Inc. Send instant messages to your online friends http://au.messenger.yahoo.com -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 25 lines · Nick Piggin
Quoted 12 lines · Dave Hansen
Ahhh. I hadn't made the ia64 connection. I wonder if it is worth making
CONFIG_HOLES_IN_ZONEsay ia64 or something aboutvmem_mapin it somewhere. Might be worth at least a comment like this:mm/page_alloc.c +5
-0+if (page_in_zone_hole (buddy))/* noop on all but ia64 */ +break ; +else if (page_zonenum (buddy) !=page_zonenum (page)) +break ; +else if (!page_is_buddy (buddy, order))break ;/* Move the buddy up one level. */
Quoted 2 lines
BTW, wasn't the whole idea of discontig to have holes in zones (before NUMA) without tricks like this? ;)
Yes.
I don't like the patch much, because all that logic should be moved into
page_is_buddywhere I put it (surely it is more readable not to have the checks spilling out -- a page which is not in the correct zone or is a "hole" is by definition not a buddy, right?)
Quoted 4 lines
So, I agree with adding the zone check if any architecture needs it. But it would be something under
CONFIG_HOLES_IN_ZONE, and the arch needs to *either* align zones correctly (as they've always had to), or turn this option on.
I agree that there is no need for these checks to leak out of page_is_buddy(). If its not there or in another zone, its not my buddy.
The allocator loop is nasty enough as it is.
I think we need to do a couple of things:
1) check the alignment of the zones matches the implied alignment constraints and correct it as we go.
2) optionally allow an architecture to say its not aligning and doesn't want to have to align its zone -- providing a config option to add the zone index checks
I think the later is valuable for these test builds and potentially for the embedded side where megabytes mean something.
I'm testing a patch for this at the moment and will drop it out when I'm done.
-apw
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 3 lines · Andy Whitcroft
I agree that there is no need for these checks to leak out of
page_is_buddy(). If its not there or in another zone, its not my buddy.
The allocator loop is nasty enough as it is.
OK, glad you agree.
Quoted 5 lines
I think we need to do a couple of things:
1) check the alignment of the zones matches the implied alignment constraints and correct it as we go.
Yes. And preferably have checks in the generic page allocator setup code, so we can do something sane if the arch code gets it wrong.
Quoted 6 lines
2) optionally allow an architecture to say its not aligning and doesn't want to have to align its zone -- providing a config option to add the zone index checks
I think the later is valuable for these test builds and potentially for the embedded side where megabytes mean something.
Yes. Depends whether we fold it under the HOLES_IN_ZONE config. I guess HOLES_IN_ZONE is potentially quite a bit more expensive than the plain zone check, so having 2 config options may not be unreasonable.
Also, if the architecture doesn't align the ends of zones, *and* they are not adjacent to another zone, they need either CONFIG_HOLES_IN_ZONE or they need to provide dummy 'struct page's that never have PageBuddy set.
Quoted 3 lines
I'm testing a patch for this at the moment and will drop it out when I'm done.
Great!
Signature · 8 lines
SUSE Labs, Novell Inc. Send instant messages to your online friends http://au.messenger.yahoo.com -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
cover Zone boundry alignment fixes
Ok. Finally got my test bed working and got this lot tested.
To summarise the problem , the buddy allocator currently requires that the boundries between zones occur at MAX_ORDER boundries. The specific case where we were tripping up on this was in x86 with NUMA enabled. There we try to ensure that each node's stuct pages are in node local memory, in order to allow them to be virtually mapped we have to reduce the size of ZONE_NORMAL. Here we are rounding the remap space up to a large page size to allow large page TLB entries to be used. However, these are smaller than MAX_ORDER. This can lead to bad buddy merges. With VM_DEBUG enabled we detect the attempts to merge across this boundry and panic.
We have two basic options we can either apply the appropriate alignment when we make make the NUMA remap space, or we can 'fix' the assumption in the buddy allocator. The fix for the buddy allocator involves adding conditionals to the free fast path and so it seems reasonable to at least favor realigning the remap space.
Following this email are 3 patches:
zone-init-check-and-report-unaligned-zone-boundries -- introduces
a zone alignement helper, and uses it to add a check to zone initialisation for unaligned zone boundries,
x86-align-highmem-zone-boundries-with-NUMA -- uses the zone alignment
helper to align the end of ZONE_NORMAL after the remap space has been reserved, and
zone-allow-unaligned-zone-boundries -- modifies the buddy allocator
so that we can allow unaligned zone boundries. A new configuration option is added to enable this functionality.
The first two are the fixes for alignement in x86, these fix the panics thrown when VM_DEBUG is enabled.
The last is a patch to support unaligned zone boundries. As this (re)introduces a zone check into the free hot path it seems reasonable to only enable this should it be needed; for example we never need this if we have a single zone. I have tested the failing system with this patch enabled and it also fixes the panic. I am inclined to suggest that it be included as it very clearly documents the alignment requirements for the buddy allocator.
Comments.
-apw
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 1/3 zone init check and report unaligned zone boundries
zone init check and report unaligned zone boundries
We have a number of strict constraints on the layout of struct page's for use with the buddy allocator. One of which is that zone boundries must occur at MAX_ORDER page boundries. Add a check for this during init.
--- include/linux/mmzone.h | 5 +++++ mm/page_alloc.c | 4 ++++ 2 files changed, 9 insertions(+)
include/linux/mmzone.h +5 -0
@@ -388,6 +388,11 @@ static inline int is_dma(struct zone *zoreturn zone == zone->zone_pgdat->node_zones +ZONE_DMA ; } +static inline unsigned long zone_boundry_align_pfn (unsigned long pfn) +{ +return pfn & ~((1 <<MAX_ORDER ) -1 ); +} +/* These two functions are used to setup the per zone pages min values */ struct ctl_table ;struct file ;
mm/page_alloc.c +4 -0
@@ -2078,6 +2078,10 @@ static void __init free_area_init_core(sstruct zone *zone = pgdat->node_zones + j;unsigned long size, realsize; +if (zone_boundry_align_pfn (zone_start_pfn) != zone_start_pfn) +printk (KERN_CRIT "node %d zone %s missaligned " +"start pfn\n" , nid, zone_names[j]); + realsize = size = zones_size[j];if (zholes_size) realsize -= zholes_size[j];
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 1/3] zone init check and report unaligned zone boundries
Patchset looks nice, Andy. Page allocator stuff looks fine, just a couple of questions about the setup and alignment stuff:
Quoted 31 lines · Andy Whitcroft
zone init check and report unaligned zone boundries
We have a number of strict constraints on the layout of struct page's for use with the buddy allocator. One of which is that zone boundries must occur at
MAX_ORDERpage boundries. Add a check for this during init.Signed-off-by Andy Whitcroft <[email protected]>--- include/linux/mmzone.h | 5 +++++ mm/page_alloc.c | 4 ++++ 2 files changed, 9 insertions(+)diff -upN
reference/include/linux/mmzone.hcurrent/include/linux/mmzone.hinclude/linux/mmzone.h +5
-0@@ -388,6 +388,11 @@ static inline int is_dma(struct zone *zoreturn zone == zone->zone_pgdat->node_zones +ZONE_DMA ; } +static inline unsigned long zone_boundry_align_pfn (unsigned long pfn) +{ +return pfn & ~((1 <<MAX_ORDER ) -1 ); +} +/* These two functions are used to setup the per zone pages min values */ struct ctl_table ;struct file ;diff -upN
reference/mm/page_alloc.ccurrent/mm/page_alloc.c
mm/page_alloc.c static void __init free_area_init_core(s · line 2084
Quoted 7 lines
mm/page_alloc.c +4
-0@@ -2078,6 +2078,10 @@ static void __init free_area_init_core(sstruct zone *zone = pgdat->node_zones + j;unsigned long size, realsize; +if (zone_boundry_align_pfn (zone_start_pfn) != zone_start_pfn) +printk (KERN_CRIT "node %d zone %s missaligned " +"start pfn\n" , nid, zone_names[j]); +
We also need to align the end of the zone I think? I think we should try to force alignment by reducing the size here, or if that is not possible, then panic?
If we don't either fix it or panic, then we're allowing users' machines to run in an unstable state.
Signature · 8 lines
SUSE Labs, Novell Inc. Send instant messages to your online friends http://au.messenger.yahoo.com -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 2/3 x86 align highmem zone boundries with NUMA
In reply to Andy Whitcroftx86 align highmem zone boundries with NUMA
When in x86 NUMA mode we allocate struct pages's node local and map them into the kernel virtual address space in the remap space. This space cuts into the end of ZONE_NORMAL. When we round ZONE_NORMAL down we must ensure we maintain the zone boundry constraint, we must round to MAX_ORDER.
--- discontig.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-)
arch/i386/mm/discontig.c +4 -1
@@ -304,10 +304,13 @@ unsigned long __init setup_memory(void)/* partially used pages are not usable - thus round upwards */ system_start_pfn = min_low_pfn =PFN_UP (init_pg_tables_end); - system_max_low_pfn = max_low_pfn =find_max_low_pfn () - reserve_pages; + max_low_pfn =find_max_low_pfn () - reserve_pages;printk ("reserve_pages = %ld find_max_low_pfn() ~ %ld\n" , reserve_pages, max_low_pfn + reserve_pages);printk ("max_pfn = %ld\n" , max_pfn); + + system_max_low_pfn = max_low_pfn =zone_boundry_align_pfn (max_low_pfn); +#ifdef CONFIG_HIGHMEM highstart_pfn = highend_pfn = max_pfn;if (max_pfn > system_max_low_pfn)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 3/3 zone allow unaligned zone boundries
In reply to Andy Whitcroftzone allow unaligned zone boundries
Currently the buddy allocator requires that zone boundries be at MAX_ORDER boundries. This may not always be desirable or possible. Add a config option to allow these boundies to be arbitrary.
--- include/linux/mm.h | 7 +++++-- include/linux/mmzone.h | 4 ++++ mm/page_alloc.c | 21 ++++++++++++++------- 3 files changed, 23 insertions(+), 9 deletions(-)
include/linux/mm.h +5 -2
@@ -466,10 +466,13 @@ static inline unsigned long page_zonenumstruct zone ;extern struct zone *zone_table[]; +static inline int page_zone_id (struct page *page) +{ +return (page->flags >>ZONETABLE_PGSHIFT ) &ZONETABLE_MASK ; +}static inline struct zone *page_zone (struct page *page) { -return zone_table[(page->flags >>ZONETABLE_PGSHIFT ) & -ZONETABLE_MASK ]; +return zone_table[page_zone_id (page)]; }static inline unsigned long page_to_nid (struct page *page)
include/linux/mmzone.h +4 -0
@@ -390,7 +390,11 @@ static inline int is_dma(struct zone *zostatic inline unsigned long zone_boundry_align_pfn (unsigned long pfn) { +#ifdef CONFIG_UNALIGNED_ZONE_BOUNDRIES +return pfn; +#else return pfn & ~((1 <<MAX_ORDER ) -1 ); +#endif }/* These two functions are used to setup the per zone pages min values */
mm/page_alloc.c +14 -7
@@ -285,22 +285,28 @@ __find_combined_index(unsigned long page* we can do coalesce a page and its buddy if * (a) the buddy is not in a hole && * (b) the buddy is in the buddy system && -* (c) a page and its buddy have the same order. +* (c) a page and its buddy have the same order && +* (d) a page and its buddy are in the same zone. * * For recording whether a page is in the buddy system, we use PG_buddy. * Setting, clearing, and testing PG_buddy is serialized by zone->lock. * * For recording page's order, we use page_private(page). */ -static inline int page_is_buddy (struct page *page,int order) +static inline int page_is_buddy (struct page *page,struct page *buddy, +int order) {#ifdef CONFIG_HOLES_IN_ZONE -if (!pfn_valid (page_to_pfn (page))) +if (!pfn_valid (page_to_pfn (buddy))) +return 0 ; +#endif +#ifdef CONFIG_UNALIGNED_ZONE_BOUNDRIES +if (page_zone_id (page) !=page_zone_id (buddy))return 0 ;#endif -if (PageBuddy (page) &&page_order (page) == order) { -BUG_ON (page_count (page) !=0 ); +if (PageBuddy (buddy) &&page_order (buddy) == order) { +BUG_ON (page_count (buddy) !=0 );return 1 ; }return 0 ;
@@ -351,7 +357,7 @@ static inline void __free_one_page(strucstruct page *buddy; buddy =__page_find_buddy (page, page_idx, order); -if (!page_is_buddy (buddy, order)) +if (!page_is_buddy (page, buddy, order))break ;/* Move the buddy up one level. */ list_del (&buddy->lru);
@@ -2080,7 +2086,8 @@ static void __init free_area_init_core(sif (zone_boundry_align_pfn (zone_start_pfn) != zone_start_pfn)printk (KERN_CRIT "node %d zone %s missaligned " -"start pfn\n" , nid, zone_names[j]); +"start pfn, enable UNALIGNED_ZONE_BOUNDRIES\n" , + nid, zone_names[j]); realsize = size = zones_size[j];if (zholes_size)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 0/3] Zone boundry alignment fixes
In reply to Andy WhitcroftQuoted 37 lines · Andy Whitcroft
Ok. Finally got my test bed working and got this lot tested.
To summarise the problem , the buddy allocator currently requires that the boundries between zones occur at
MAX_ORDERboundries. The specific case where we were tripping up on this was in x86 with NUMA enabled. There we try to ensure that each node's stuct pages are in node local memory, in order to allow them to be virtually mapped we have to reduce the size ofZONE_NORMAL. Here we are rounding the remap space up to a large page size to allow large page TLB entries to be used. However, these are smaller thanMAX_ORDER. This can lead to bad buddy merges. WithVM_DEBUGenabled we detect the attempts to merge across this boundry and panic.We have two basic options we can either apply the appropriate alignment when we make make the NUMA remap space, or we can 'fix' the assumption in the buddy allocator. The fix for the buddy allocator involves adding conditionals to the free fast path and so it seems reasonable to at least favor realigning the remap space.
Following this email are 3 patches:
zone-init-check-and-report-unaligned-zone-boundries -- introduces
a zone alignement helper, and uses it to add a check to zone initialisation for unaligned zone boundries,x86-align-highmem-zone-boundries-with-NUMA -- uses the zone alignment
helper to align the end ofZONE_NORMALafter the remap space has been reserved, andzone-allow-unaligned-zone-boundries -- modifies the buddy allocator
so that we can allow unaligned zone boundries. A new configuration option is added to enable this functionality.The first two are the fixes for alignement in x86, these fix the panics thrown when
VM_DEBUGis enabled.
Quoted 7 lines
The last is a patch to support unaligned zone boundries. As this (re)introduces a zone check into the free hot path it seems reasonable to only enable this should it be needed; for example we never need this if we have a single zone. I have tested the failing system with this patch enabled and it also fixes the panic. I am inclined to suggest that it be included as it very clearly documents the alignment requirements for the buddy allocator.
There's some possibility here of interaction with Mel's "patchset to size zones and memory holes in an architecture-independent manner." I jammed them together - let's see how it goes.
I also fixed the spelling of "boundary" in about 1.5 zillion places ;)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 0/3] Zone boundry alignment fixes
Quoted 3 lines · Andrew Morton
There's some possibility here of interaction with Mel's "patchset to size zones and memory holes in an architecture-independent manner." I jammed them together - let's see how it goes.
update: Andy's 3 patches, applied to 2.6.17-rc3-mm1, fixed all the crashes and asserts i saw. NUMA-on-x86 is now rock-solid on my testbox. Great work Andy!
Ingo
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 0/3] Zone boundry alignment fixes
Quoted 7 lines · Ingo Molnar
Quoted 1 line · Andrew Morton
There's some possibility here of interaction with Mel's "patchset to size zones and memory holes in an architecture-independent manner." I jammed them together - let's see how it goes.
update: Andy's 3 patches, applied to 2.6.17-rc3-mm1, fixed all the crashes and asserts i saw. NUMA-on-x86 is now rock-solid on my testbox. Great work Andy!
Excellent. I think these should get into 2.6.17, and possibly even the -stable series.
Signature · 8 lines
SUSE Labs, Novell Inc. Send instant messages to your online friends http://au.messenger.yahoo.com -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
cover Zone boundary alignment fixes cleanups
In reply to Andrew Morton[Sorry for the delay, we've been busy looking to see what is responsible for the ia64 issues with architecture independant zone sizing.]
Following this email are two cleanup patches for the UNALIGNED_ZONE_BOUNDARIES support in -mm.
zone-init-check-and-report-unaligned-zone-boundaries-fix --
we currently will pointlessly report zones as missaligned even though they are empty and will report the first zone which can never be missaligned assuming node_mem_map is aligned correctly.
zone-allow-unaligned-zone-boundaries-spelling-fix -- when the
spelling errors in zone-allow-unaligned-zone-boundaries-spelling were fixed the configuration options were not updated.
Both of the above patches slot into the linux-2.6.17-rc4-mm1 patch set next to their main patches. Amazingly, they will also apply on top of linux-2.6.17-rc4-mm1, I don't know what patch has been taking but it rocks.
-apw
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 1/2 zone init check and report unaligned zone boundaries fix
zone init check and report unaligned zone boundaries fix
We are reporting bad boundaries for the first zone which is allowed to be missaligned because nodes are not allowed to be missaligned, and zones which have zero size. Cull them.
--- page_alloc.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-)
mm/page_alloc.c +2 -1
@@ -2223,7 +2223,8 @@ static void __meminit free_area_init_corstruct zone *zone = pgdat->node_zones + j;unsigned long size, realsize; -if (zone_boundary_align_pfn (zone_start_pfn) != zone_start_pfn) +if (zone_boundary_align_pfn (zone_start_pfn) != + zone_start_pfn && j !=0 && size !=0 )printk (KERN_CRIT "node %d zone %s missaligned " "start pfn\n" , nid, zone_names[j]);
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 2/2 zone allow unaligned zone boundaries spelling fix
In reply to Andy Whitcroftzone allow unaligned zone boundaries spelling fix
When the spelling of boundary was sorted out the config options got missed.
--- include/linux/mmzone.h | 2 +- mm/page_alloc.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
include/linux/mmzone.h +1 -1
@@ -393,7 +393,7 @@ static inline int is_dma(struct zone *zostatic inline unsigned long zone_boundary_align_pfn (unsigned long pfn) { -#ifdef CONFIG_UNALIGNED_ZONE_BOUNDRIES +#ifdef CONFIG_UNALIGNED_ZONE_BOUNDARIES return pfn;#else return pfn & ~((1 <<MAX_ORDER ) -1 );
mm/page_alloc.c +2 -2
@@ -315,7 +315,7 @@ static inline int page_is_buddy(struct pif (!pfn_valid (page_to_pfn (buddy)))return 0 ;#endif -#ifdef CONFIG_UNALIGNED_ZONE_BOUNDRIES +#ifdef CONFIG_UNALIGNED_ZONE_BOUNDARIES if (page_zone_id (page) !=page_zone_id (buddy))return 0 ;#endif
@@ -2232,7 +2232,7 @@ static void __meminit free_area_init_corif (zone_boundary_align_pfn (zone_start_pfn) != zone_start_pfn && j !=0 && size !=0 )printk (KERN_CRIT "node %d zone %s missaligned " -"start pfn, enable UNALIGNED_ZONE_BOUNDRIES\n" , +"start pfn, enable UNALIGNED_ZONE_BOUNDARIES\n" , nid, zone_names[j]); realsize = size = zones_size[j];
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 2/2] zone allow unaligned zone boundaries spelling fix
Quoted 35 lines · Andy Whitcroft
zone allow unaligned zone boundaries spelling fix
When the spelling of boundary was sorted out the config options got missed.
Signed-off-by Andy Whitcroft <[email protected]>--- include/linux/mmzone.h | 2 +- mm/page_alloc.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)diff -upN
reference/include/linux/mmzone.hcurrent/include/linux/mmzone.hinclude/linux/mmzone.h +1
-1@@ -393,7 +393,7 @@ static inline int is_dma(struct zone *zostatic inline unsigned long zone_boundary_align_pfn (unsigned long pfn) { -#ifdef CONFIG_UNALIGNED_ZONE_BOUNDRIES +#ifdef CONFIG_UNALIGNED_ZONE_BOUNDARIES return pfn;#else return pfn & ~((1 <<MAX_ORDER ) -1 );diff -upN
reference/mm/page_alloc.ccurrent/mm/page_alloc.cmm/page_alloc.c +1
-1@@ -315,7 +315,7 @@ static inline int page_is_buddy(struct pif (!pfn_valid (page_to_pfn (buddy)))return 0 ;#endif -#ifdef CONFIG_UNALIGNED_ZONE_BOUNDRIES +#ifdef CONFIG_UNALIGNED_ZONE_BOUNDARIES if (page_zone_id (page) !=page_zone_id (buddy))return 0 ;#endif
mm/page_alloc.c static void __meminit free_area_init_cor · line 2238
Quoted 8 lines
mm/page_alloc.c +1
-1@@ -2232,7 +2232,7 @@ static void __meminit free_area_init_corif (zone_boundary_align_pfn (zone_start_pfn) != zone_start_pfn && j !=0 && size !=0 )printk (KERN_CRIT "node %d zone %s missaligned " -"start pfn, enable UNALIGNED_ZONE_BOUNDRIES\n" , +"start pfn, enable UNALIGNED_ZONE_BOUNDARIES\n" , nid, zone_names[j]); realsize = size = zones_size[j];
Ignore this patch. Somehow the wrong version has escaped here. Clearly wrong.
-apw
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
cover Zone boundary alignment fixes, cleanups v2
In reply to Andrew Morton[Lets try that again, here is the correct patch this time.]
[Sorry for the delay, we've been busy looking to see what is responsible for the ia64 issues with architecture independant zone sizing.]
Following this email are two cleanup patches for the UNALIGNED_ZONE_BOUNDARIES support in -mm.
zone-init-check-and-report-unaligned-zone-boundaries-fix --
we currently will pointlessly report zones as missaligned even though they are empty and will report the first zone which can never be missaligned assuming node_mem_map is aligned correctly.
zone-allow-unaligned-zone-boundaries-spelling-fix -- when the
spelling errors in zone-allow-unaligned-zone-boundaries-spelling were fixed the configuration options were not updated.
Both of the above patches slot into the linux-2.6.17-rc4-mm1 patch set next to their main patches. Amazingly, they will also apply on top of linux-2.6.17-rc4-mm1, I don't know what patch has been taking but it rocks.
-apw
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 1/2 zone init check and report unaligned zone boundaries fix
zone init check and report unaligned zone boundaries fix v2
We are reporting bad boundaries for the first zone which is allowed to be missaligned because nodes are not allowed to be missaligned, and zones which have zero size. Cull them.
--- page_alloc.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-)
mm/page_alloc.c +5 -4
@@ -2223,10 +2223,6 @@ static void __meminit free_area_init_corstruct zone *zone = pgdat->node_zones + j;unsigned long size, realsize; -if (zone_boundary_align_pfn (zone_start_pfn) != zone_start_pfn) -printk (KERN_CRIT "node %d zone %s missaligned " -"start pfn\n" , nid, zone_names[j]); - realsize = size = zones_size[j];if (zholes_size) realsize -= zholes_size[j];
@@ -2235,6 +2231,11 @@ static void __meminit free_area_init_cor nr_kernel_pages += realsize; nr_all_pages += realsize; +if (zone_boundary_align_pfn (zone_start_pfn) != + zone_start_pfn && j !=0 && size !=0 ) +printk (KERN_CRIT "node %d zone %s missaligned " +"start pfn\n" , nid, zone_names[j]); + zone->spanned_pages = size; zone->present_pages = realsize; zone->name = zone_names[j];
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 2/2 zone allow unaligned zone boundaries spelling fix
In reply to Andy Whitcroftzone allow unaligned zone boundaries spelling fix
When the spelling of boundary was sorted out the config options got missed.
--- include/linux/mmzone.h | 2 +- mm/page_alloc.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
include/linux/mmzone.h +1 -1
@@ -393,7 +393,7 @@ static inline int is_dma(struct zone *zostatic inline unsigned long zone_boundary_align_pfn (unsigned long pfn) { -#ifdef CONFIG_UNALIGNED_ZONE_BOUNDRIES +#ifdef CONFIG_UNALIGNED_ZONE_BOUNDARIES return pfn;#else return pfn & ~((1 <<MAX_ORDER ) -1 );
mm/page_alloc.c +2 -2
@@ -315,7 +315,7 @@ static inline int page_is_buddy(struct pif (!pfn_valid (page_to_pfn (buddy)))return 0 ;#endif -#ifdef CONFIG_UNALIGNED_ZONE_BOUNDRIES +#ifdef CONFIG_UNALIGNED_ZONE_BOUNDARIES if (page_zone_id (page) !=page_zone_id (buddy))return 0 ;#endif
@@ -2232,7 +2232,7 @@ static void __meminit free_area_init_corif (zone_boundary_align_pfn (zone_start_pfn) != zone_start_pfn && j !=0 && size !=0 )printk (KERN_CRIT "node %d zone %s missaligned " -"start pfn, enable UNALIGNED_ZONE_BOUNDRIES\n" , +"start pfn, enable UNALIGNED_ZONE_BOUNDARIES\n" , nid, zone_names[j]); realsize = size = zones_size[j];
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 6 lines · Martin J. Bligh
Quoted 4 lines
Oh that's a 32bit kernel. I don't think the 32bit NUMA has ever worked anywhere but some Summit systems (at least every time I tried it it blew up on me and nobody seems to use it regularly). Maybe it would be finally time to mark it
CONFIG_BROKENthough or just remove it (even by design it doesn't work very well)Bollocks. It works fine,
On what kind of box? Some summit system, right?
Quoted 2 lines
and is tested every single day, on every git
release, and every -mm tree.
Well, it doesn't work for Ingo clearly. My own experiences every time I tried it were similar.
I think I stand by my original statement.
-Andi
Quoted 8 lines · Andi Kleen
Quoted 4 lines · Martin J. Bligh
Quoted 2 lines
Oh that's a 32bit kernel. I don't think the 32bit NUMA has ever worked
anywhere but some Summit systems (at least every time I tried it it blew up on me and nobody seems to use it regularly). Maybe it would be finally time to mark itCONFIG_BROKENthough or just remove it (even by design it doesn't work very well)Bollocks. It works fine,
On what kind of box? Some summit system, right?
Summit and NUMA-Q, ie everything we originally created it for.
Quoted 2 lines
Well, it doesn't work for Ingo clearly. My own experiences every time I tried it were similar.
What platform?
Quoted 1 line
I think I stand by my original statement.
If it works fine on some platforms and not on others, I would venture to suggest it's a platform-specific issue, and marking the whole thing as CONFIG_BROKEN would be an entirely inappropriate overreaction to what is probably a simple bug.
M.
Quoted 8 lines · Martin J. Bligh
Quoted 7 lines · Andi Kleen
Quoted 5 lines · Martin J. Bligh
Quoted 4 lines
Oh that's a 32bit kernel. I don't think the 32bit NUMA has ever worked anywhere but some Summit systems (at least every time I tried it it blew up on me and nobody seems to use it regularly). Maybe it would be finally time to mark it
CONFIG_BROKENthough or just remove it (even by design it doesn't work very well)
Quoted 5 lines
Quoted 3 lines
Quoted 1 line
Bollocks. It works fine,
On what kind of box? Some summit system, right?
Summit and NUMA-Q, ie everything we originally created it for.
That's my point - it usually crashes everywhere else.
Quoted 7 lines
Quoted 2 lines
I think I stand by my original statement.
If it works fine on some platforms and not on others, I would venture to suggest it's a platform-specific issue, and marking the whole thing as
CONFIG_BROKENwould be an entirely inappropriate overreaction to what is probably a simple bug.
The problem is that it's not regression tested and quite complex and tends to break often and stay broken.
If you don't want to mark it CONFIG_BROKEN then i would suggest a panic early when the system isn't SUMMIT (I think NUMAQ does this already)
Something like the appended patch
-Andi
i386: Panic the system early when a NUMA kernel doesn't run on IBM NUMA
It has been broken forever anywhere else and is not too useful anyways so best to disable it.
arch/i386/kernel/srat.c +8 -0
@@ -327,6 +327,14 @@ int __init get_memcfg_from_srat(void)int tables =0 ;int i =0 ; +extern int use_cyclone; +if (use_cyclone ==0 ) { +/* Make sure user sees something */ +static const char s[]__initdata ="Not an IBM x440/NUMAQ. Don't use i386 CONFIG_NUMA anywhere else." + early_printk(s); +panic (s); + } +if (ACPI_FAILURE (acpi_find_root_pointer (ACPI_PHYSICAL_ADDRESSING , rsdp_address))) { printk("%s: System description tables not found\n",
arch/i386/Kconfig +3 -0
@@ -517,6 +517,9 @@ config NUMA depends on SMP && HIGHMEM64G && (X86_NUMAQ || X86_GENERICARCH || (X86_SUMMIT && ACPI)) default n if X86_PC default y if (X86_NUMAQ || X86_SUMMIT) + help + NUMA support. Note this only works on IBM x440 or IBM NUMAQ. + Don't try to use it anywhere else. comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI" depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI)
Quoted 9 lines
Quoted 5 lines
Quoted 3 lines
Quoted 1 line
Bollocks. It works fine,
On what kind of box? Some summit system, right?
Summit and NUMA-Q, ie everything we originally created it for.
Andi:
That's my point - it usually crashes everywhere else.
Quoted 4 lines · Ingo Molnar
i only booted it on a non-NUMA PC. Most likely the instability is caused by some sort of zone mis-sizing. (See more details in this same thread.)
Ooooh, on ordinary PCs. that makes more sense.
Quoted 2 lines
The problem is that it's not regression tested and quite complex and tends to break often and stay broken.
OK, well the regression testing issue is easily fixed, but whether it's worth it or not is a different issue. It was originally done for the distros really, so they could have a single kernel that supported everything.
Quoted 4 lines
If you don't want to mark it
CONFIG_BROKENthen i would suggest a panic early when the system isn't SUMMIT (I think NUMAQ does this already)Something like the appended patch
apw: this was your baby ... what do you want to do with it? Add it to the automated regression testing, or kill it?
Quoted 42 lines
-Andi
i386: Panic the system early when a NUMA kernel doesn't run on IBM NUMA
It has been broken forever anywhere else and is not too useful anyways so best to disable it.
Signed-off-by Andi Kleen <[email protected]>Index:
linux/arch/i386/kernel/srat.c
===================================================================arch/i386/kernel/srat.c +8
-0@@ -327,6 +327,14 @@ int __init get_memcfg_from_srat(void)int tables =0 ;int i =0 ; +extern int use_cyclone; +if (use_cyclone ==0 ) { +/* Make sure user sees something */ +static const char s[]__initdata ="Not an IBM x440/NUMAQ. Don't use i386 CONFIG_NUMA anywhere else." + early_printk(s); +panic (s); + } +if (ACPI_FAILURE (acpi_find_root_pointer (ACPI_PHYSICAL_ADDRESSING , rsdp_address))) { printk("%s: System description tables not found\n",Index: linux/arch/i386/Kconfig
===================================================================arch/i386/Kconfig +3
-0@@ -517,6 +517,9 @@ config NUMA depends on SMP && HIGHMEM64G && (X86_NUMAQ || X86_GENERICARCH || (X86_SUMMIT && ACPI)) default n if X86_PC default y if (X86_NUMAQ || X86_SUMMIT) + help + NUMA support. Note this only works on IBM x440 or IBM NUMAQ. + Don't try to use it anywhere else. comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI" depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI)
Quoted 6 lines · Martin J. Bligh
Quoted 4 lines
i only booted it on a non-NUMA PC. Most likely the instability is caused by some sort of zone mis-sizing. (See more details in this same thread.)
Ooooh, on ordinary PCs. that makes more sense.
It tends to crash on Opteron NUMA systems too.
-Andi
Quoted 5 lines · Martin J. Bligh
Quoted 3 lines
i only booted it on a non-NUMA PC. Most likely the instability is caused by some sort of zone mis-sizing. (See more details in this same thread.)
Ooooh, on ordinary PCs. that makes more sense.
btw., NUMA emulation on 64-bit had problems too on and off (no problems currently), so i'm not surprised that 32-bit NUMA has problems on non-NUMA boxes. It would still be useful to have it, because that way the NUMA codepaths can be excercised.
Ingo
Quoted 2 lines · Andi Kleen
i386: Panic the system early when a NUMA kernel doesn't run on IBM NUMA
nah! Lets just fix the zone sizing bug ...
Ingo
Quoted 7 lines · Ingo Molnar
Quoted 2 lines · Andi Kleen
i386: Panic the system early when a NUMA kernel doesn't run on IBM NUMA
nah! Lets just fix the zone sizing bug ...
The problem is that nobody regression tests it. So even if you fix it now it will be likely broken again in a few months.
-Andi
Quoted 5 lines · Andi Kleen
Quoted 3 lines · Ingo Molnar
* Andi Kleen <[email protected]> wrote:
Quoted 7 lines
Quoted 3 lines
Quoted 1 line
i386: Panic the system early when a NUMA kernel doesn't run on IBM NUMA
nah! Lets just fix the zone sizing bug ...
The problem is that nobody regression tests it. So even if you fix it now it will be likely broken again in a few months.
We can add a box to the test.kernel.org harness easily enough, and it will show up with an eerie red glow.
M.
Quoted 9 lines · Martin Bligh
Quoted 8 lines · Andi Kleen
Quoted 6 lines · Ingo Molnar
Quoted 2 lines · Andi Kleen
i386: Panic the system early when a NUMA kernel doesn't run on IBM NUMA
Quoted 8 lines
Quoted 5 lines
Quoted 1 line
nah! Lets just fix the zone sizing bug ...
The problem is that nobody regression tests it. So even if you fix it now it will be likely broken again in a few months.
We can add a box to the test.kernel.org harness easily enough, and it will show up with an eerie red glow.
Single box is not enough - there are many possible combinations (e.g. Opteron NUMA, IBM NUMA, no NUMA small box, big box with weird mappings etc.). Basically you would need a real tester base.
-Andi
Quoted 9 lines · Andi Kleen
Quoted 5 lines
Quoted 2 lines
The problem is that nobody regression tests it. So even if you fix it now it will be likely broken again in a few months.
We can add a box to the test.kernel.org harness easily enough, and it will show up with an eerie red glow.
Single box is not enough - there are many possible combinations (e.g. Opteron NUMA, IBM NUMA, no NUMA small box, big box with weird mappings etc.). Basically you would need a real tester base.
nah. And the fact that i could boot this on a non-NUMA box already unearthed a weakness in the buddy allocator. (it should have much clearer asserts about mis-sized zones - it's not the first time we had them and they are hard to debug) So consider this a debugging feature. It also found other bugs, so even if nobody but me uses it, it's useful.
ingo
Quoted 4 lines · Ingo Molnar
nah. And the fact that i could boot this on a non-NUMA box already unearthed a weakness in the buddy allocator. (it should have much clearer asserts about mis-sized zones - it's not the first time we had them and they are hard to debug)
GIGO.
Quoted 2 lines
So consider this a debugging feature.
It also found other bugs, so even if nobody but me uses it, it's useful.
It's an awful lot of ugly code for a debugging feature.
Also I never considered i386 NUMA to be particularly interesting because it doesn't work for the kernel lowmem which is always on node 0. So no matter what you try you have a nasty hotspot on node 0's memory.
-Andi
Quoted 4 lines · Martin J. Bligh
Quoted 2 lines
Well, it doesn't work for Ingo clearly. My own experiences every time I tried it were similar.
What platform?
i only booted it on a non-NUMA PC. Most likely the instability is caused by some sort of zone mis-sizing. (See more details in this same thread.)
Ingo
RFC PATCH 1/1 cond_resched() added to close_files()
When a process exits, it might spend a lot of time in close_files() closing thousand of files.
This is bad for latency, and in some cases can trigger 'BUG: soft lockup detected on CPU#0!'
Call Trace: <IRQ> <ffffffff8024dafa>{softlockup_tick+250}
<ffffffff80236cd7>{update_process_times+87}
<ffffffff80215ed3>{smp_local_timer_interrupt+35}
<ffffffff80216411>{smp_apic_timer_interrupt+65}
<ffffffff8020a866>{apic_timer_interrupt+98} <EOI>
<ffffffff803a7100>{sock_destroy_inode+0}
<ffffffff803e4b1f>{tcp_send_fin+207}
<ffffffff803e4ac4>{tcp_send_fin+116} <ffffffff803d988a>{tcp_close+698}
<ffffffff803f4a07>{inet_release+87} <ffffffff803a84e9>{sock_release+25}
<ffffffff803a87f5>{sock_close+53} <ffffffff802767a8>{__fput+88}
<ffffffff8027382d>{filp_close+93}
<ffffffff8022ee2e>{put_files_struct+110}
<ffffffff8023025a>{do_exit+650}
<ffffffff80237bee>{__dequeue_signal+478}
<ffffffff80230998>{do_group_exit+200}
<ffffffff80239c6a>{get_signal_to_deliver+1178}
<ffffffff80209d47>{sysret_signal+28} <ffffffff80209001>{do_signal+129}
<ffffffff8028d623>{dput+35} <ffffffff803a92db>{sys_accept+443}
<ffffffff80241eec>{add_wait_queue+28} <ffffffff802ec581>{__up_write+33}
<ffffffff80209d47>{sysret_signal+28} <ffffffff8020a033>{ptregscall_common+103}
This patch makes sure a cond_resched() call is done every 32 (or 64) files closed. This also helps reducing number of files waiting in RCU queues for final freeing as call_rcu() might have called force_quiescent_state()
kernel/exit.c +1 -0
@@ -445,20 +445,21 @@ set = fdt->open_fds->fds_bits[j++];while (set) {if (set &1 ) {struct file * file =xchg (&fdt->fd[i],NULL );if (file)filp_close (file, files); } i++; set >>=1 ; } +cond_resched (); } }struct files_struct *get_files_struct (struct task_struct *task) {struct files_struct *files;task_lock (task); files = task->files;if (files)
Re: [RFC, PATCH] cond_resched() added to close_files()
Quoted 4 lines · Eric Dumazet
This patch makes sure a
cond_resched()call is done every 32 (or 64) files closed. This also helps reducing number of files waiting in RCU queues for final freeing ascall_rcu()might have calledforce_quiescent_state()
the -rt tree already has this latency breaker (and had it for a long time), it just somehow didnt get pushed upstream.
Quoted 1 line
Signed-off-by Eric Dumazet <[email protected]>
Ingo
Re: [RFC, PATCH] cond_resched() added to close_files()
Quoted 4 lines · Ingo Molnar
* Eric Dumazet <[email protected]> wrote:
Quoted 8 lines
Quoted 4 lines
This patch makes sure a
cond_resched()call is done every 32 (or 64) files closed. This also helps reducing number of files waiting in RCU queues for final freeing ascall_rcu()might have calledforce_quiescent_state()the -rt tree already has this latency breaker (and had it for a long time), it just somehow didnt get pushed upstream.
Makes my machine hang early during the startup of init.
The last process to pass through close_file() is hostname', presuably parented by init. hostname' exits then everything stops. init is left sleeping in select().
All very strange.
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.17-rc3
# Fri May 12 02:35:30 2006
#CONFIG_X86_32=yCONFIG_SEMAPHORE_SLEEPERS=yCONFIG_X86=yCONFIG_MMU=yCONFIG_GENERIC_ISA_DMA=yCONFIG_GENERIC_IOMAP=yCONFIG_GENERIC_HWEIGHT=yCONFIG_ARCH_MAY_HAVE_PC_FDC=yCONFIG_DMI=y
#
# Code maturity level options
#CONFIG_EXPERIMENTAL=yCONFIG_LOCK_KERNEL=yCONFIG_INIT_ENV_ARG_LIMIT=32
#
# General setup
#CONFIG_LOCALVERSION=""CONFIG_LOCALVERSION_AUTO=yCONFIG_SWAP=yCONFIG_SYSVIPC=y
# CONFIG_POSIX_MQUEUE is not setCONFIG_BSD_PROCESS_ACCT=y
# CONFIG_BSD_PROCESS_ACCT_V3 is not setCONFIG_SYSCTL=yCONFIG_AUDIT=yCONFIG_AUDITSYSCALL=yCONFIG_IKCONFIG=y
# CONFIG_IKCONFIG_PROC is not set
# CONFIG_CPUSETS is not set
# CONFIG_RELAY is not setCONFIG_INITRAMFS_SOURCE=""CONFIG_UID16=yCONFIG_VM86=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not setCONFIG_EMBEDDED=yCONFIG_KALLSYMS=yCONFIG_KALLSYMS_ALL=y
# CONFIG_KALLSYMS_EXTRA_PASS is not setCONFIG_HOTPLUG=yCONFIG_PRINTK=yCONFIG_BUG=yCONFIG_ELF_CORE=yCONFIG_BASE_FULL=yCONFIG_FUTEX=yCONFIG_EPOLL=yCONFIG_SHMEM=yCONFIG_SLAB=y
# CONFIG_TINY_SHMEM is not setCONFIG_BASE_SMALL=0
# CONFIG_SLOB is not set
#
# Loadable module support
#CONFIG_MODULES=yCONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not setCONFIG_MODVERSIONS=y
# CONFIG_MODULE_SRCVERSION_ALL is not setCONFIG_KMOD=yCONFIG_STOP_MACHINE=y
#
# Block layer
#
# CONFIG_LBD is not set
# CONFIG_BLK_DEV_IO_TRACE is not set
# CONFIG_LSF is not set
#
# IO Schedulers
#CONFIG_IOSCHED_NOOP=yCONFIG_IOSCHED_AS=yCONFIG_IOSCHED_DEADLINE=yCONFIG_IOSCHED_CFQ=yCONFIG_DEFAULT_AS=y
# CONFIG_DEFAULT_DEADLINE is not set
# CONFIG_DEFAULT_CFQ is not set
# CONFIG_DEFAULT_NOOP is not setCONFIG_DEFAULT_IOSCHED="anticipatory"
#
# Processor type and features
#CONFIG_SMP=yCONFIG_X86_PC=y
# CONFIG_X86_ELAN is not set
# CONFIG_X86_VOYAGER is not set
# CONFIG_X86_NUMAQ is not set
# CONFIG_X86_SUMMIT is not set
# CONFIG_X86_BIGSMP is not set
# CONFIG_X86_VISWS is not set
# CONFIG_X86_GENERICARCH is not set
# CONFIG_X86_ES7000 is not set
# CONFIG_M386 is not set
# CONFIG_M486 is not set
# CONFIG_M586 is not set
# CONFIG_M586TSC is not set
# CONFIG_M586MMX is not set
# CONFIG_M686 is not set
# CONFIG_MPENTIUMII is not set
# CONFIG_MPENTIUMIII is not set
# CONFIG_MPENTIUMM is not setCONFIG_MPENTIUM4=y
# CONFIG_MK6 is not set
# CONFIG_MK7 is not set
# CONFIG_MK8 is not set
# CONFIG_MCRUSOE is not set
# CONFIG_MEFFICEON is not set
# CONFIG_MWINCHIPC6 is not set
# CONFIG_MWINCHIP2 is not set
# CONFIG_MWINCHIP3D is not set
# CONFIG_MGEODEGX1 is not set
# CONFIG_MGEODE_LX is not set
# CONFIG_MCYRIXIII is not set
# CONFIG_MVIAC3_2 is not set
# CONFIG_X86_GENERIC is not setCONFIG_X86_CMPXCHG=yCONFIG_X86_XADD=yCONFIG_X86_L1_CACHE_SHIFT=7CONFIG_RWSEM_XCHGADD_ALGORITHM=yCONFIG_GENERIC_CALIBRATE_DELAY=yCONFIG_X86_WP_WORKS_OK=yCONFIG_X86_INVLPG=yCONFIG_X86_BSWAP=yCONFIG_X86_POPAD_OK=yCONFIG_X86_CMPXCHG64=yCONFIG_X86_GOOD_APIC=yCONFIG_X86_INTEL_USERCOPY=yCONFIG_X86_USE_PPRO_CHECKSUM=yCONFIG_X86_TSC=yCONFIG_HPET_TIMER=yCONFIG_HPET_EMULATE_RTC=yCONFIG_NR_CPUS=8
# CONFIG_SCHED_SMT is not setCONFIG_SCHED_MC=yCONFIG_PREEMPT_NONE=y
# CONFIG_PREEMPT_VOLUNTARY is not set
# CONFIG_PREEMPT is not setCONFIG_PREEMPT_BKL=yCONFIG_X86_LOCAL_APIC=yCONFIG_X86_IO_APIC=yCONFIG_X86_MCE=y
# CONFIG_X86_MCE_NONFATAL is not set
# CONFIG_X86_MCE_P4THERMAL is not set
# CONFIG_TOSHIBA is not set
# CONFIG_I8K is not set
# CONFIG_X86_REBOOTFIXUPS is not set
# CONFIG_MICROCODE is not setCONFIG_X86_MSR=yCONFIG_X86_CPUID=y
#
# Firmware Drivers
#CONFIG_EDD=y
# CONFIG_DELL_RBU is not setCONFIG_DCDBAS=m
# CONFIG_NOHIGHMEM is not set
# CONFIG_HIGHMEM4G is not setCONFIG_HIGHMEM64G=yCONFIG_PAGE_OFFSET=0xC0000000CONFIG_HIGHMEM=yCONFIG_X86_PAE=yCONFIG_ARCH_FLATMEM_ENABLE=yCONFIG_ARCH_SPARSEMEM_ENABLE=yCONFIG_ARCH_SELECT_MEMORY_MODEL=yCONFIG_SELECT_MEMORY_MODEL=yCONFIG_FLATMEM_MANUAL=y
# CONFIG_DISCONTIGMEM_MANUAL is not set
# CONFIG_SPARSEMEM_MANUAL is not setCONFIG_FLATMEM=yCONFIG_FLAT_NODE_MEM_MAP=yCONFIG_SPARSEMEM_STATIC=yCONFIG_SPLIT_PTLOCK_CPUS=4
# CONFIG_HIGHPTE is not set
# CONFIG_MATH_EMULATION is not set
# CONFIG_MTRR is not set
# CONFIG_EFI is not setCONFIG_IRQBALANCE=y
# CONFIG_REGPARM is not setCONFIG_SECCOMP=y
# CONFIG_HZ_100 is not setCONFIG_HZ_250=y
# CONFIG_HZ_1000 is not setCONFIG_HZ=250
# CONFIG_KEXEC is not set
# CONFIG_CRASH_DUMP is not setCONFIG_PHYSICAL_START=0x100000
# CONFIG_HOTPLUG_CPU is not set
#
# Power management options (ACPI, APM)
#CONFIG_PM=yCONFIG_PM_LEGACY=y
# CONFIG_PM_DEBUG is not set
#
# ACPI (Advanced Configuration and Power Interface) Support #CONFIG_ACPI=yCONFIG_ACPI_AC=mCONFIG_ACPI_BATTERY=mCONFIG_ACPI_BUTTON=mCONFIG_ACPI_VIDEO=mCONFIG_ACPI_HOTKEY=mCONFIG_ACPI_FAN=mCONFIG_ACPI_PROCESSOR=mCONFIG_ACPI_THERMAL=mCONFIG_ACPI_ASUS=mCONFIG_ACPI_IBM=m
# CONFIG_ACPI_IBM_DOCK is not set CONFIG_ACPI_TOSHIBA=m
# CONFIG_ACPI_CUSTOM_DSDT is not set CONFIG_ACPI_BLACKLIST_YEAR=0
# CONFIG_ACPI_DEBUG is not setCONFIG_ACPI_EC=yCONFIG_ACPI_POWER=yCONFIG_ACPI_SYSTEM=yCONFIG_X86_PM_TIMER=yCONFIG_ACPI_CONTAINER=m
#
# APM (Advanced Power Management) BIOS Support
#
# CONFIG_APM is not set
#
# CPU Frequency scaling
#CONFIG_CPU_FREQ=yCONFIG_CPU_FREQ_TABLE=y
# CONFIG_CPU_FREQ_DEBUG is not set CONFIG_CPU_FREQ_STAT=y
# CONFIG_CPU_FREQ_STAT_DETAILS is not set CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
#
# CPUFreq processor drivers
#
# CONFIG_X86_ACPI_CPUFREQ is not set
# CONFIG_X86_POWERNOW_K6 is not set
# CONFIG_X86_POWERNOW_K7 is not set
# CONFIG_X86_POWERNOW_K8 is not set
# CONFIG_X86_GX_SUSPMOD is not set
# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
# CONFIG_X86_SPEEDSTEP_ICH is not set
# CONFIG_X86_SPEEDSTEP_SMI is not setCONFIG_X86_P4_CLOCKMOD=m
# CONFIG_X86_CPUFREQ_NFORCE2 is not set
# CONFIG_X86_LONGRUN is not set
#
# shared options # CONFIG_X86_SPEEDSTEP_LIB=m
#
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
#CONFIG_PCI=y
# CONFIG_PCI_GOBIOS is not set
# CONFIG_PCI_GOMMCONFIG is not set
# CONFIG_PCI_GODIRECT is not setCONFIG_PCI_GOANY=yCONFIG_PCI_BIOS=yCONFIG_PCI_DIRECT=yCONFIG_PCI_MMCONFIG=y
# CONFIG_PCIEPORTBUS is not set
# CONFIG_PCI_MSI is not set
# CONFIG_PCI_DEBUG is not setCONFIG_ISA_DMA_API=yCONFIG_ISA=yCONFIG_EISA=y
# CONFIG_EISA_VLB_PRIMING is not setCONFIG_EISA_PCI_EISA=yCONFIG_EISA_VIRTUAL_ROOT=yCONFIG_EISA_NAMES=y
# CONFIG_MCA is not set
# CONFIG_SCx200 is not set
#
# PCCARD (PCMCIA/CardBus) support
#
# CONFIG_PCCARD is not set
#
# PCI Hotplug Support
#CONFIG_HOTPLUG_PCI=y
# CONFIG_HOTPLUG_PCI_FAKE is not set
# CONFIG_HOTPLUG_PCI_COMPAQ is not set
# CONFIG_HOTPLUG_PCI_IBM is not set
# CONFIG_HOTPLUG_PCI_ACPI is not set
# CONFIG_HOTPLUG_PCI_CPCI is not set
# CONFIG_HOTPLUG_PCI_SHPC is not set
#
# Executable file formats
#CONFIG_BINFMT_ELF=yCONFIG_BINFMT_AOUT=yCONFIG_BINFMT_MISC=y
#
# Networking
#CONFIG_NET=y
#
# Networking options
#
# CONFIG_NETDEBUG is not setCONFIG_PACKET=yCONFIG_PACKET_MMAP=yCONFIG_UNIX=yCONFIG_XFRM=y
# CONFIG_XFRM_USER is not setCONFIG_NET_KEY=yCONFIG_INET=y
# CONFIG_IP_MULTICAST is not set
# CONFIG_IP_ADVANCED_ROUTER is not setCONFIG_IP_FIB_HASH=y
# CONFIG_IP_PNP is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_ARPD is not set
# CONFIG_SYN_COOKIES is not set
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
# CONFIG_INET_XFRM_TUNNEL is not set
# CONFIG_INET_TUNNEL is not setCONFIG_INET_DIAG=yCONFIG_INET_TCP_DIAG=y
# CONFIG_TCP_CONG_ADVANCED is not setCONFIG_TCP_CONG_BIC=y
# CONFIG_IPV6 is not set
# CONFIG_INET6_XFRM_TUNNEL is not set
# CONFIG_INET6_TUNNEL is not set
# CONFIG_NETFILTER is not set
#
# DCCP Configuration (EXPERIMENTAL)
#
# CONFIG_IP_DCCP is not set
#
# SCTP Configuration (EXPERIMENTAL)
#
# CONFIG_IP_SCTP is not set
#
# TIPC Configuration (EXPERIMENTAL)
#
# CONFIG_TIPC is not set
# CONFIG_ATM is not setCONFIG_BRIDGE=y
# CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not setCONFIG_LLC=y
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set
#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
# CONFIG_IEEE80211 is not set
#
# Device Drivers
#
#
# Generic Driver Options
#
# CONFIG_STANDALONE is not setCONFIG_PREVENT_FIRMWARE_BUILD=yCONFIG_FW_LOADER=y
# CONFIG_DEBUG_DRIVER is not set
#
# Connector - unified userspace <-> kernelspace linker #CONFIG_CONNECTOR=yCONFIG_PROC_EVENTS=y
#
# Memory Technology Devices (MTD)
#
# CONFIG_MTD is not set
#
# Parallel port support
#
# CONFIG_PARPORT is not set
#
# Plug and Play support
#CONFIG_PNP=yCONFIG_PNP_DEBUG=y
#
# Protocols
#CONFIG_ISAPNP=yCONFIG_PNPBIOS=y
# CONFIG_PNPBIOS_PROC_FS is not setCONFIG_PNPACPI=y
#
# Block devices
#CONFIG_BLK_DEV_FD=y
# CONFIG_BLK_DEV_XD is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set
# CONFIG_BLK_DEV_COW_COMMON is not setCONFIG_BLK_DEV_LOOP=yCONFIG_BLK_DEV_CRYPTOLOOP=y
# CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_SX8 is not setCONFIG_BLK_DEV_RAM=yCONFIG_BLK_DEV_RAM_COUNT=16CONFIG_BLK_DEV_RAM_SIZE=4000CONFIG_BLK_DEV_INITRD=y
# CONFIG_CDROM_PKTCDVD is not set
# CONFIG_ATA_OVER_ETH is not set
#
# ATA/ATAPI/MFM/RLL support
#CONFIG_IDE=yCONFIG_BLK_DEV_IDE=y
#
# Please see Documentation/ide.txt for help/info on IDE drives #
# CONFIG_BLK_DEV_IDE_SATA is not set
# CONFIG_BLK_DEV_HD_IDE is not set CONFIG_BLK_DEV_IDEDISK=yCONFIG_IDEDISK_MULTI_MODE=yCONFIG_BLK_DEV_IDECD=yCONFIG_BLK_DEV_IDETAPE=yCONFIG_BLK_DEV_IDEFLOPPY=y
# CONFIG_BLK_DEV_IDESCSI is not set CONFIG_IDE_TASK_IOCTL=y
#
# IDE chipset support/bugfixes
#CONFIG_IDE_GENERIC=y
# CONFIG_BLK_DEV_CMD640 is not set
# CONFIG_BLK_DEV_IDEPNP is not setCONFIG_BLK_DEV_IDEPCI=yCONFIG_IDEPCI_SHARE_IRQ=y
# CONFIG_BLK_DEV_OFFBOARD is not setCONFIG_BLK_DEV_GENERIC=y
# CONFIG_BLK_DEV_OPTI621 is not set
# CONFIG_BLK_DEV_RZ1000 is not setCONFIG_BLK_DEV_IDEDMA_PCI=y
# CONFIG_BLK_DEV_IDEDMA_FORCED is not setCONFIG_IDEDMA_PCI_AUTO=y
# CONFIG_IDEDMA_ONLYDISK is not set
# CONFIG_BLK_DEV_AEC62XX is not set
# CONFIG_BLK_DEV_ALI15X3 is not set
# CONFIG_BLK_DEV_AMD74XX is not set
# CONFIG_BLK_DEV_ATIIXP is not set
# CONFIG_BLK_DEV_CMD64X is not set
# CONFIG_BLK_DEV_TRIFLEX is not set
# CONFIG_BLK_DEV_CY82C693 is not set
# CONFIG_BLK_DEV_CS5520 is not set
# CONFIG_BLK_DEV_CS5530 is not set
# CONFIG_BLK_DEV_CS5535 is not set
# CONFIG_BLK_DEV_HPT34X is not set
# CONFIG_BLK_DEV_HPT366 is not set
# CONFIG_BLK_DEV_SC1200 is not setCONFIG_BLK_DEV_PIIX=y
# CONFIG_BLK_DEV_IT821X is not set
# CONFIG_BLK_DEV_NS87415 is not set
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
# CONFIG_BLK_DEV_PDC202XX_NEW is not set
# CONFIG_BLK_DEV_SVWKS is not set
# CONFIG_BLK_DEV_SIIMAGE is not set
# CONFIG_BLK_DEV_SIS5513 is not set
# CONFIG_BLK_DEV_SLC90E66 is not set
# CONFIG_BLK_DEV_TRM290 is not set
# CONFIG_BLK_DEV_VIA82CXXX is not set
# CONFIG_IDE_ARM is not set
# CONFIG_IDE_CHIPSETS is not setCONFIG_BLK_DEV_IDEDMA=y
# CONFIG_IDEDMA_IVB is not setCONFIG_IDEDMA_AUTO=y
# CONFIG_BLK_DEV_HD is not set
#
# SCSI device support
#
# CONFIG_RAID_ATTRS is not setCONFIG_SCSI=yCONFIG_SCSI_PROC_FS=y
#
# SCSI support type (disk, tape, CD-ROM)
#CONFIG_BLK_DEV_SD=y
# CONFIG_CHR_DEV_ST is not set
# CONFIG_CHR_DEV_OSST is not setCONFIG_BLK_DEV_SR=y
# CONFIG_BLK_DEV_SR_VENDOR is not setCONFIG_CHR_DEV_SG=y
# CONFIG_CHR_DEV_SCH is not set
#
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs #
# CONFIG_SCSI_MULTI_LUN is not set
# CONFIG_SCSI_CONSTANTS is not set
# CONFIG_SCSI_LOGGING is not set
#
# SCSI Transport Attributes
#CONFIG_SCSI_SPI_ATTRS=yCONFIG_SCSI_FC_ATTRS=y
# CONFIG_SCSI_ISCSI_ATTRS is not set
# CONFIG_SCSI_SAS_ATTRS is not set
#
# SCSI low-level drivers
#
# CONFIG_ISCSI_TCP is not set
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
# CONFIG_SCSI_3W_9XXX is not set
# CONFIG_SCSI_7000FASST is not set
# CONFIG_SCSI_ACARD is not set
# CONFIG_SCSI_AHA152X is not set
# CONFIG_SCSI_AHA1542 is not set
# CONFIG_SCSI_AHA1740 is not set
# CONFIG_SCSI_AACRAID is not set
# CONFIG_SCSI_AIC7XXX is not set
# CONFIG_SCSI_AIC7XXX_OLD is not set
# CONFIG_SCSI_AIC79XX is not set
# CONFIG_SCSI_DPT_I2O is not set
# CONFIG_SCSI_ADVANSYS is not set
# CONFIG_SCSI_IN2000 is not set
# CONFIG_MEGARAID_NEWGEN is not set
# CONFIG_MEGARAID_LEGACY is not set
# CONFIG_MEGARAID_SAS is not set
# CONFIG_SCSI_SATA is not set
# CONFIG_SCSI_BUSLOGIC is not set
# CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_DTC3280 is not set
# CONFIG_SCSI_EATA is not set
# CONFIG_SCSI_FUTURE_DOMAIN is not set
# CONFIG_SCSI_GDTH is not set
# CONFIG_SCSI_GENERIC_NCR5380 is not set
# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
# CONFIG_SCSI_IPS is not set
# CONFIG_SCSI_INITIO is not set
# CONFIG_SCSI_INIA100 is not set
# CONFIG_SCSI_NCR53C406A is not setCONFIG_SCSI_SYM53C8XX_2=yCONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=64CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64CONFIG_SCSI_SYM53C8XX_MMIO=y
# CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_PAS16 is not set
# CONFIG_SCSI_PSI240I is not set
# CONFIG_SCSI_QLOGIC_FAS is not set
# CONFIG_SCSI_QLOGIC_1280 is not set
# CONFIG_SCSI_QLA_FC is not set
# CONFIG_SCSI_LPFC is not set
# CONFIG_SCSI_SIM710 is not set
# CONFIG_SCSI_SYM53C416 is not set
# CONFIG_SCSI_DC395x is not set
# CONFIG_SCSI_DC390T is not set
# CONFIG_SCSI_T128 is not set
# CONFIG_SCSI_U14_34F is not set
# CONFIG_SCSI_ULTRASTOR is not set
# CONFIG_SCSI_NSP32 is not set
# CONFIG_SCSI_DEBUG is not set
#
# Old CD-ROM drivers (not SCSI, not IDE)
#
# CONFIG_CD_NO_IDESCSI is not set
#
# Multi-device support (RAID and LVM)
#
# CONFIG_MD is not set
#
# Fusion MPT device support
#
# CONFIG_FUSION is not set
# CONFIG_FUSION_SPI is not set
# CONFIG_FUSION_FC is not set
# CONFIG_FUSION_SAS is not set
#
# IEEE 1394 (FireWire) support
#
# CONFIG_IEEE1394 is not set
#
# I2O device support
#
# CONFIG_I2O is not set
#
# Network device support
#CONFIG_NETDEVICES=yCONFIG_DUMMY=y
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
# CONFIG_NET_SB1000 is not set
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
#
# PHY device support
#
# CONFIG_PHYLIB is not set
#
# Ethernet (10 or 100Mbit)
#CONFIG_NET_ETHERNET=yCONFIG_MII=y
# CONFIG_HAPPYMEAL is not set
# CONFIG_SUNGEM is not set
# CONFIG_CASSINI is not setCONFIG_NET_VENDOR_3COM=y
# CONFIG_EL1 is not set
# CONFIG_EL2 is not set
# CONFIG_ELPLUS is not set
# CONFIG_EL16 is not setCONFIG_EL3=m
# CONFIG_3C515 is not setCONFIG_VORTEX=m
# CONFIG_TYPHOON is not set
# CONFIG_LANCE is not set
# CONFIG_NET_VENDOR_SMC is not set
# CONFIG_NET_VENDOR_RACAL is not set
#
# Tulip family network device support
#CONFIG_NET_TULIP=y
# CONFIG_DE2104X is not set
# CONFIG_TULIP is not setCONFIG_DE4X5=m
# CONFIG_WINBOND_840 is not set
# CONFIG_DM9102 is not set
# CONFIG_ULI526X is not set
# CONFIG_AT1700 is not set
# CONFIG_DEPCA is not set
# CONFIG_HP100 is not set
# CONFIG_NET_ISA is not setCONFIG_NET_PCI=y
# CONFIG_PCNET32 is not set
# CONFIG_AMD8111_ETH is not set
# CONFIG_ADAPTEC_STARFIRE is not set
# CONFIG_AC3200 is not set
# CONFIG_APRICOT is not set
# CONFIG_B44 is not set
# CONFIG_FORCEDETH is not set
# CONFIG_CS89x0 is not set
# CONFIG_DGRS is not set
# CONFIG_EEPRO100 is not setCONFIG_E100=m
# CONFIG_LNE390 is not set
# CONFIG_FEALNX is not set
# CONFIG_NATSEMI is not set
# CONFIG_NE2K_PCI is not set
# CONFIG_NE3210 is not set
# CONFIG_ES3210 is not set
# CONFIG_8139CP is not set
# CONFIG_8139TOO is not set
# CONFIG_SIS900 is not set
# CONFIG_EPIC100 is not set
# CONFIG_SUNDANCE is not set
# CONFIG_TLAN is not set
# CONFIG_VIA_RHINE is not set
#
# Ethernet (1000 Mbit)
#
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
# CONFIG_E1000 is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not setCONFIG_R8169=y
# CONFIG_R8169_NAPI is not set
# CONFIG_SIS190 is not set
# CONFIG_SKGE is not set
# CONFIG_SKY2 is not set
# CONFIG_SK98LIN is not set
# CONFIG_VIA_VELOCITY is not set
# CONFIG_TIGON3 is not set
# CONFIG_BNX2 is not set
#
# Ethernet (10000 Mbit)
#
# CONFIG_CHELSIO_T1 is not set
# CONFIG_IXGB is not set
# CONFIG_S2IO is not set
#
# Token Ring devices
#
# CONFIG_TR is not set
#
# Wireless LAN (non-hamradio)
#
# CONFIG_NET_RADIO is not set
#
# Wan interfaces
#
# CONFIG_WAN is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set
# CONFIG_NET_FC is not set
# CONFIG_SHAPER is not setCONFIG_NETCONSOLE=yCONFIG_NETPOLL=yCONFIG_NETPOLL_RX=yCONFIG_NETPOLL_TRAP=yCONFIG_NET_POLL_CONTROLLER=y
#
# ISDN subsystem
#
# CONFIG_ISDN is not set
#
# Telephony Support
#
# CONFIG_PHONE is not set
#
# Input device support
#CONFIG_INPUT=y
#
# Userland interfaces
#CONFIG_INPUT_MOUSEDEV=yCONFIG_INPUT_MOUSEDEV_PSAUX=yCONFIG_INPUT_MOUSEDEV_SCREEN_X=1024CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_TSDEV is not set
# CONFIG_INPUT_EVDEV is not set
# CONFIG_INPUT_EVBUG is not set
#
# Input Device Drivers
#CONFIG_INPUT_KEYBOARD=yCONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not setCONFIG_INPUT_MOUSE=yCONFIG_MOUSE_PS2=y
# CONFIG_MOUSE_SERIAL is not set
# CONFIG_MOUSE_INPORT is not set
# CONFIG_MOUSE_LOGIBM is not set
# CONFIG_MOUSE_PC110PAD is not set
# CONFIG_MOUSE_VSXXXAA is not set
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
# CONFIG_INPUT_MISC is not set
#
# Hardware I/O ports
#CONFIG_SERIO=yCONFIG_SERIO_I8042=yCONFIG_SERIO_SERPORT=y
# CONFIG_SERIO_CT82C710 is not set
# CONFIG_SERIO_PCIPS2 is not setCONFIG_SERIO_LIBPS2=y
# CONFIG_SERIO_RAW is not setCONFIG_GAMEPORT=y
# CONFIG_GAMEPORT_NS558 is not set
# CONFIG_GAMEPORT_L4 is not set
# CONFIG_GAMEPORT_EMU10K1 is not set
# CONFIG_GAMEPORT_FM801 is not set
#
# Character devices
#CONFIG_VT=yCONFIG_VT_CONSOLE=yCONFIG_HW_CONSOLE=y
# CONFIG_SERIAL_NONSTANDARD is not set
#
# Serial drivers
#CONFIG_SERIAL_8250=yCONFIG_SERIAL_8250_CONSOLE=yCONFIG_SERIAL_8250_PCI=yCONFIG_SERIAL_8250_PNP=yCONFIG_SERIAL_8250_NR_UARTS=4CONFIG_SERIAL_8250_RUNTIME_UARTS=4
# CONFIG_SERIAL_8250_EXTENDED is not set
#
# Non-8250 serial port support
#CONFIG_SERIAL_CORE=yCONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_SERIAL_JSM is not setCONFIG_UNIX98_PTYS=yCONFIG_LEGACY_PTYS=yCONFIG_LEGACY_PTY_COUNT=256
#
# IPMI
#
# CONFIG_IPMI_HANDLER is not set
#
# Watchdog Cards
#
# CONFIG_WATCHDOG is not set
# CONFIG_HW_RANDOM is not set
# CONFIG_NVRAM is not setCONFIG_RTC=y
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
# CONFIG_SONYPI is not set
#
# Ftape, the floppy tape device driver
#CONFIG_AGP=y
# CONFIG_AGP_ALI is not set
# CONFIG_AGP_ATI is not set
# CONFIG_AGP_AMD is not set
# CONFIG_AGP_AMD64 is not setCONFIG_AGP_INTEL=y
# CONFIG_AGP_NVIDIA is not set
# CONFIG_AGP_SIS is not set
# CONFIG_AGP_SWORKS is not set
# CONFIG_AGP_VIA is not set
# CONFIG_AGP_EFFICEON is not set
# CONFIG_DRM is not set
# CONFIG_MWAVE is not set
# CONFIG_CS5535_GPIO is not setCONFIG_RAW_DRIVER=mCONFIG_MAX_RAW_DEVS=256
# CONFIG_HPET is not set
# CONFIG_HANGCHECK_TIMER is not set
#
# TPM devices
#
# CONFIG_TCG_TPM is not set
# CONFIG_TELCLOCK is not set
#
# I2C support
#
# CONFIG_I2C is not set
#
# SPI support
#
# CONFIG_SPI is not set
# CONFIG_SPI_MASTER is not set
#
# Dallas's 1-wire bus
#
# CONFIG_W1 is not set
#
# Hardware Monitoring support
#
# CONFIG_HWMON is not set
# CONFIG_HWMON_VID is not set
#
# Misc devices
#
# CONFIG_IBM_ASM is not set
#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set
#
# Digital Video Broadcasting Devices
#
# CONFIG_DVB is not set
#
# Graphics support
#
# CONFIG_FB is not setCONFIG_VIDEO_SELECT=y
#
# Console display driver support
#CONFIG_VGA_CONSOLE=y
# CONFIG_VGACON_SOFT_SCROLLBACK is not set
# CONFIG_MDA_CONSOLE is not setCONFIG_DUMMY_CONSOLE=y
#
# Sound
#
# CONFIG_SOUND is not set
#
# USB support
#CONFIG_USB_ARCH_HAS_HCD=yCONFIG_USB_ARCH_HAS_OHCI=yCONFIG_USB_ARCH_HAS_EHCI=y
# CONFIG_USB is not set
#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' #
#
# USB Gadget Support
#
# CONFIG_USB_GADGET is not set
#
# MMC/SD Card support
#
# CONFIG_MMC is not set
#
# LED devices
#
# CONFIG_NEW_LEDS is not set
#
# LED drivers
#
#
# LED Triggers
#
#
# InfiniBand support
#
# CONFIG_INFINIBAND is not set
#
# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) #CONFIG_EDAC=y
#
# Reporting subsystems
#CONFIG_EDAC_DEBUG=yCONFIG_EDAC_MM_EDAC=yCONFIG_EDAC_AMD76X=yCONFIG_EDAC_E7XXX=yCONFIG_EDAC_E752X=yCONFIG_EDAC_I82875P=yCONFIG_EDAC_I82860=yCONFIG_EDAC_R82600=yCONFIG_EDAC_POLL=y
#
# Real Time Clock
#
# CONFIG_RTC_CLASS is not set
#
# File systems
#CONFIG_EXT2_FS=y
# CONFIG_EXT2_FS_XATTR is not set
# CONFIG_EXT2_FS_XIP is not setCONFIG_EXT3_FS=y
# CONFIG_EXT3_FS_XATTR is not setCONFIG_JBD=yCONFIG_JBD_DEBUG=y
# CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not setCONFIG_FS_POSIX_ACL=y
# CONFIG_XFS_FS is not set
# CONFIG_OCFS2_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_ROMFS_FS is not setCONFIG_INOTIFY=y
# CONFIG_QUOTA is not setCONFIG_DNOTIFY=y
# CONFIG_AUTOFS_FS is not setCONFIG_AUTOFS4_FS=y
# CONFIG_FUSE_FS is not set
#
# CD-ROM/DVD Filesystems
#CONFIG_ISO9660_FS=yCONFIG_JOLIET=yCONFIG_ZISOFS=yCONFIG_ZISOFS_FS=yCONFIG_UDF_FS=yCONFIG_UDF_NLS=y
#
# DOS/FAT/NT Filesystems
#CONFIG_FAT_FS=yCONFIG_MSDOS_FS=yCONFIG_VFAT_FS=yCONFIG_FAT_DEFAULT_CODEPAGE=437CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"CONFIG_NTFS_FS=mCONFIG_NTFS_DEBUG=y
# CONFIG_NTFS_RW is not set
#
# Pseudo filesystems
#CONFIG_PROC_FS=yCONFIG_PROC_KCORE=yCONFIG_SYSFS=yCONFIG_TMPFS=yCONFIG_HUGETLBFS=yCONFIG_HUGETLB_PAGE=yCONFIG_RAMFS=y
# CONFIG_CONFIGFS_FS is not set
#
# Miscellaneous filesystems
#
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_CRAMFS is not set
# CONFIG_VXFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
#
# Network File Systems
#CONFIG_NFS_FS=yCONFIG_NFS_V3=y
# CONFIG_NFS_V3_ACL is not setCONFIG_NFS_V4=y
# CONFIG_NFS_DIRECTIO is not setCONFIG_NFSD=yCONFIG_NFSD_V3=y
# CONFIG_NFSD_V3_ACL is not setCONFIG_NFSD_V4=yCONFIG_NFSD_TCP=yCONFIG_LOCKD=yCONFIG_LOCKD_V4=yCONFIG_EXPORTFS=yCONFIG_NFS_COMMON=yCONFIG_SUNRPC=yCONFIG_SUNRPC_GSS=yCONFIG_RPCSEC_GSS_KRB5=yCONFIG_RPCSEC_GSS_SPKM3=m
# CONFIG_SMB_FS is not set
# CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set
# CONFIG_9P_FS is not set
#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not setCONFIG_MSDOS_PARTITION=y
#
# Native Language Support
#CONFIG_NLS=yCONFIG_NLS_DEFAULT="iso8859-1"
# CONFIG_NLS_CODEPAGE_437 is not set
# CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set
# CONFIG_NLS_CODEPAGE_850 is not set
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not setCONFIG_NLS_ASCII=m
# CONFIG_NLS_ISO8859_1 is not set
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
# CONFIG_NLS_UTF8 is not set
#
# Instrumentation Support
#CONFIG_PROFILING=yCONFIG_OPROFILE=y
# CONFIG_KPROBES is not set
#
# Kernel hacking
#
# CONFIG_PRINTK_TIME is not setCONFIG_MAGIC_SYSRQ=yCONFIG_DEBUG_KERNEL=yCONFIG_LOG_BUF_SHIFT=17CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_SCHEDSTATS is not setCONFIG_DEBUG_SLAB=yCONFIG_DEBUG_SLAB_LEAK=yCONFIG_DEBUG_MUTEXES=yCONFIG_DEBUG_SPINLOCK=yCONFIG_DEBUG_SPINLOCK_SLEEP=y
# CONFIG_DEBUG_KOBJECT is not setCONFIG_DEBUG_HIGHMEM=yCONFIG_DEBUG_BUGVERBOSE=yCONFIG_DEBUG_INFO=yCONFIG_DEBUG_FS=yCONFIG_DEBUG_VM=yCONFIG_FRAME_POINTER=y
# CONFIG_UNWIND_INFO is not setCONFIG_FORCED_INLINING=y
# CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_EARLY_PRINTK is not setCONFIG_DEBUG_STACKOVERFLOW=yCONFIG_DEBUG_STACK_USAGE=yCONFIG_STACK_BACKTRACE_COLS=2CONFIG_DEBUG_RODATA=y
# CONFIG_4KSTACKS is not setCONFIG_X86_FIND_SMP_CONFIG=yCONFIG_X86_MPPARSE=yCONFIG_DOUBLEFAULT=y
#
# Security options
#
# CONFIG_KEYS is not set
# CONFIG_SECURITY is not set
#
# Cryptographic options
#CONFIG_CRYPTO=y
# CONFIG_CRYPTO_HMAC is not set
# CONFIG_CRYPTO_NULL is not set
# CONFIG_CRYPTO_MD4 is not setCONFIG_CRYPTO_MD5=y
# CONFIG_CRYPTO_SHA1 is not set
# CONFIG_CRYPTO_SHA256 is not set
# CONFIG_CRYPTO_SHA512 is not set
# CONFIG_CRYPTO_WP512 is not set
# CONFIG_CRYPTO_TGR192 is not setCONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_BLOWFISH is not set
# CONFIG_CRYPTO_TWOFISH is not set
# CONFIG_CRYPTO_SERPENT is not set
# CONFIG_CRYPTO_AES is not set
# CONFIG_CRYPTO_AES_586 is not setCONFIG_CRYPTO_CAST5=m
# CONFIG_CRYPTO_CAST6 is not set
# CONFIG_CRYPTO_TEA is not set
# CONFIG_CRYPTO_ARC4 is not set
# CONFIG_CRYPTO_KHAZAD is not set
# CONFIG_CRYPTO_ANUBIS is not set
# CONFIG_CRYPTO_DEFLATE is not set
# CONFIG_CRYPTO_MICHAEL_MIC is not set
# CONFIG_CRYPTO_CRC32C is not set
# CONFIG_CRYPTO_TEST is not set
#
# Hardware crypto devices
#
# CONFIG_CRYPTO_DEV_PADLOCK is not set
#
# Library routines
#CONFIG_CRC_CCITT=m
# CONFIG_CRC16 is not setCONFIG_CRC32=y
# CONFIG_LIBCRC32C is not setCONFIG_ZLIB_INFLATE=yCONFIG_GENERIC_HARDIRQS=yCONFIG_GENERIC_IRQ_PROBE=yCONFIG_GENERIC_PENDING_IRQ=yCONFIG_X86_SMP=yCONFIG_X86_HT=yCONFIG_X86_BIOS_REBOOT=yCONFIG_X86_TRAMPOLINE=yCONFIG_KTIME_SCALAR=y
Re: [RFC, PATCH] cond_resched() added to close_files()
Quoted 7 lines · Andrew Morton
Makes my machine hang early during the startup of init.
The last process to pass through
close_file()ishostname', presuably parented by init.hostname' exits then everything stops. init is left sleeping inselect().All very strange.
weird. This really shouldnt cause a hang - i think there must be a bug hiding elsewhere, this cond_resched() ought to be fine.
Ingo
Re: [RFC, PATCH] cond_resched() added to close_files()
Quoted 5 lines · Ingo Molnar
Quoted 2 lines · Andrew Morton
Makes my machine hang early during the startup of init.
Quoted 10 lines
Quoted 4 lines
The last process to pass through
close_file()ishostname', presuably parented by init.hostname' exits then everything stops. init is left sleeping inselect().All very strange.
weird. This really shouldnt cause a hang - i think there must be a bug hiding elsewhere, this
cond_resched()ought to be fine.Ingo
Maybe a process is now awaken because of a closed pipe, instead of a SIGCHLD
Process A, father/parent of process B. They share a pipe (A reads the pipe, B writes to)
Before
Process B exits, "atomically close all of its files and sending a SIGCLD to its parent" Process A catch the SIGCLD.
After :
Process B exits "close its files (and the pipe), reschedule before final SIGCLD"
Process A gets the POLLIN/POLLHUP indication on the pipe -> Another code path is run and may trigger a user side bug ?
Eric
Re: [RFC, PATCH] cond_resched() added to close_files()
In reply to Ingo MolnarQuoted 4 lines · Ingo Molnar
Quoted 2 lines · Andrew Morton
Makes my machine hang early during the startup of init.
Quoted 9 lines
Quoted 5 lines
The last process to pass through
close_file()ishostname', presuably parented by init.hostname' exits then everything stops. init is left sleeping inselect().All very strange.
weird. This really shouldnt cause a hang - i think there must be a bug hiding elsewhere, this
cond_resched()ought to be fine.
Ingo,
Would this be the latency it fixes? (seen with 2.6.16):
preemption latency trace v1.1.5 on 2.6.16
--------------------------------------------------------------------
latency: 9313 us, #12766/12766, CPU#0 | (M:rt VP:0, KP:0, SP:0 HP:0)
-----------------
| task: jackd-26580 (uid:1000 nice:0 policy:1 rt_prio:80)
-----------------
_------=> CPU#
/ _-----=> irqs-off
| / _----=> need-resched
|| / _---=> hardirq/softirq
||| / _--=> preempt-depth
|||| /
||||| delay
cmd pid ||||| time | caller
\ / ||||| \ | / ldconfig-26779 0d.h5 0us : __trace_start_sched_wakeup
(try_to_wake_up)
ldconfig-26779 0d.h5 1us : __trace_start_sched_wakeup <<...>-26580>
(13 0)
ldconfig-26779 0d.h. 2us : kill_fasync (snd_pcm_period_elapsed)
ldconfig-26779 0d.h. 3us : snd_emu10k1_voice_intr_ack
(snd_emu10k1_interrupt)
ldconfig-26779 0d.h. 5us+: snd_emu10k1_ptr_read
(snd_emu10k1_interrupt)
ldconfig-26779 0d.h. 8us+: snd_emu10k1_ptr_read
(snd_emu10k1_interrupt)
ldconfig-26779 0d.h1 12us : note_interrupt (__do_IRQ)
ldconfig-26779 0d.h1 13us : end_8259A_irq (__do_IRQ)
ldconfig-26779 0d.h1 13us : enable_8259A_irq (end_8259A_irq)
ldconfig-26779 0dnh2 15us : irq_exit (do_IRQ)
ldconfig-26779 0dn.2 16us < (2097760) ldconfig-26779 0dn.2 17us : preempt_schedule (find_get_page) ldconfig-26779 0dn.2 18us : put_page (free_file) ldconfig-26779 0dn.2 18us : free_file (unmap_vmas) ldconfig-26779 0dn.2 19us : find_get_page (free_file) ldconfig-26779 0dn.3 20us : radix_tree_lookup (find_get_page) ldconfig-26779 0dn.2 20us : preempt_schedule (find_get_page) ldconfig-26779 0dn.2 21us : put_page (free_file) ldconfig-26779 0dn.2 22us : free_file (unmap_vmas) ldconfig-26779 0dn.2 22us : find_get_page (free_file) ldconfig-26779 0dn.3 23us : radix_tree_lookup (find_get_page) ldconfig-26779 0dn.2 24us : preempt_schedule (find_get_page) ldconfig-26779 0dn.2 24us : put_page (free_file) ldconfig-26779 0dn.2 25us : free_file (unmap_vmas) ldconfig-26779 0dn.2 26us : find_get_page (free_file) ldconfig-26779 0dn.3 26us : radix_tree_lookup (find_get_page) ldconfig-26779 0dn.2 27us : preempt_schedule (find_get_page)
(...)
ldconfig-26779 0dn.2 9256us : put_page (free_file) ldconfig-26779 0dn.2 9256us : free_file (unmap_vmas) ldconfig-26779 0dn.2 9257us : find_get_page (free_file) ldconfig-26779 0dn.3 9258us : radix_tree_lookup (find_get_page) ldconfig-26779 0dn.2 9259us : preempt_schedule (find_get_page) ldconfig-26779 0dn.2 9259us : put_page (free_file) ldconfig-26779 0dn.2 9260us : free_file (unmap_vmas) ldconfig-26779 0dn.2 9261us : find_get_page (free_file) ldconfig-26779 0dn.3 9261us : radix_tree_lookup (find_get_page) ldconfig-26779 0dn.2 9262us : preempt_schedule (find_get_page) ldconfig-26779 0dn.2 9263us : put_page (free_file) ldconfig-26779 0dn.1 9263us+: preempt_schedule (unmap_vmas) ldconfig-26779 0dn.1 9266us : free_pgtables (unmap_region) ldconfig-26779 0dn.1 9267us : anon_vma_unlink (free_pgtables) ldconfig-26779 0dn.1 9269us : unlink_file_vma (free_pgtables) ldconfig-26779 0dn.2 9269us : __remove_shared_vm_struct (unlink_file_vma)
ldconfig-26779 0dn.2 9270us : vma_prio_tree_remove (__remove_shared_vm_struct)
ldconfig-26779 0dn.2 9271us : prio_tree_remove (vma_prio_tree_remove) ldconfig-26779 0dn.1 9273us : preempt_schedule (unlink_file_vma) ldconfig-26779 0dn.1 9274us : free_pgd_range (free_pgtables) ldconfig-26779 0dn.1 9275us : free_page_and_swap_cache (free_pgd_range) ldconfig-26779 0dn.1 9276us : put_page (free_page_and_swap_cache) ldconfig-26779 0dn.1 9277us : __page_cache_release (put_page) ldconfig-26779 0dn.1 9278us : preempt_schedule (__page_cache_release) ldconfig-26779 0dn.1 9279us : free_hot_page (__page_cache_release) ldconfig-26779 0dn.1 9279us : free_hot_cold_page (free_hot_page) ldconfig-26779 0dn.2 9280us : __mod_page_state_offset (free_hot_cold_page)
ldconfig-26779 0dn.1 9281us : preempt_schedule (free_hot_cold_page) ldconfig-26779 0dn.1 9282us : mod_page_state_offset (free_pgd_range) ldconfig-26779 0dn.1 9283us : free_page_and_swap_cache (free_pgd_range) ldconfig-26779 0dn.1 9284us : put_page (free_page_and_swap_cache) ldconfig-26779 0dn.1 9285us : __page_cache_release (put_page) ldconfig-26779 0dn.1 9285us : preempt_schedule (__page_cache_release) ldconfig-26779 0dn.1 9286us : free_hot_page (__page_cache_release) ldconfig-26779 0dn.1 9287us : free_hot_cold_page (free_hot_page) ldconfig-26779 0dn.2 9287us : __mod_page_state_offset (free_hot_cold_page)
ldconfig-26779 0dn.1 9288us : preempt_schedule (free_hot_cold_page) ldconfig-26779 0dn.1 9289us : mod_page_state_offset (free_pgd_range) ldconfig-26779 0dn.1 9290us : free_page_and_swap_cache (free_pgd_range) ldconfig-26779 0dn.1 9291us : put_page (free_page_and_swap_cache) ldconfig-26779 0dn.1 9291us : __page_cache_release (put_page) ldconfig-26779 0dn.1 9292us : preempt_schedule (__page_cache_release) ldconfig-26779 0dn.1 9293us : free_hot_page (__page_cache_release) ldconfig-26779 0dn.1 9293us : free_hot_cold_page (free_hot_page) ldconfig-26779 0dn.2 9294us : __mod_page_state_offset (free_hot_cold_page)
ldconfig-26779 0dn.1 9295us : preempt_schedule (free_hot_cold_page) ldconfig-26779 0dn.1 9295us : mod_page_state_offset (free_pgd_range) ldconfig-26779 0dn.. 9297us : preempt_schedule (unmap_region) ldconfig-26779 0dn.. 9298us : schedule (preempt_schedule) ldconfig-26779 0dn.. 9298us : profile_hit (schedule) ldconfig-26779 0dn.1 9299us+: sched_clock (schedule)
<...>-26580 0d..2 9306us+: __switch_to (schedule) <...>-26580 0d..2 9309us : schedule <ldconfig-26779> (76 13) <...>-26580 0d..1 9310us : trace_stop_sched_switched (schedule) <...>-26580 0d..2 9310us : trace_stop_sched_switched <<...>-26580>
(13 0)
<...>-26580 0d..2 9312us : schedule (schedule)
Lee
Quoted 15 lines · Ingo Molnar
Quoted 4 lines · Nick Piggin
It would be interesting to know which assertion failed. I guess it might be a zone alignment problem -- it would be interesting to turn the 2
HOLES_IN_ZONEtests intoBUG_ONs, and enable them (ie. move them out ofHOLES_IN_ZONE).ok, i added a couple of printks (see the patch below), and got this:
zone
c1f0a600(HighMem):
pfn:00037d00
zone->zone_start_pfn:00037e00zone->spanned_pages:00007e00zone->zone_start_pfn+zone->spanned_pages:0003fc00
Quoted 5 lines
------------[ cut here ]------------ kernel BUG at mm/page_alloc.c:524!so the pfn is 1MB below the zone's start address - not good. You can find the full bootup log at:
The zones are 2MB aligned, discontig.c seems to do this. They should be 4MB aligned so the page allocator's assumption that zones are contiguous to MAX_ORDER is satisfied.