2004-11-15 20:41:07

by Hugh Dickins

[permalink] [raw]
Subject: [PATCH] low discontig highmem_start_page

In the case of i386 CONFIG_DISCONTIGMEM CONFIG_HIGHMEM without highmem,
highmem_start_page was wrongly initialized (from a NULL zone_mem_map),
causing __change_page_attr to BUG on boot.

Signed-off-by: Hugh Dickins <[email protected]>

--- 2.6.10-rc2/arch/i386/mm/discontig.c 2004-11-15 16:20:26.000000000 +0000
+++ linux/arch/i386/mm/discontig.c 2004-11-15 17:01:26.000000000 +0000
@@ -468,7 +468,7 @@ void __init set_max_mapnr_init(void)
if (high0->spanned_pages > 0)
highmem_start_page = high0->zone_mem_map;
else
- highmem_start_page = pfn_to_page(max_low_pfn+1);
+ highmem_start_page = pfn_to_page(max_low_pfn - 1) + 1;
num_physpages = highend_pfn;
#else
num_physpages = max_low_pfn;


2004-11-15 20:49:46

by Martin J. Bligh

[permalink] [raw]
Subject: Re: [PATCH] low discontig highmem_start_page

--On Monday, November 15, 2004 20:37:28 +0000 Hugh Dickins <[email protected]> wrote:

> In the case of i386 CONFIG_DISCONTIGMEM CONFIG_HIGHMEM without highmem,
> highmem_start_page was wrongly initialized (from a NULL zone_mem_map),
> causing __change_page_attr to BUG on boot.

Thanks, I'm not suprised that was broken - I never test without highmem ;-)

M.

> Signed-off-by: Hugh Dickins <[email protected]>
>
> --- 2.6.10-rc2/arch/i386/mm/discontig.c 2004-11-15 16:20:26.000000000 +0000
> +++ linux/arch/i386/mm/discontig.c 2004-11-15 17:01:26.000000000 +0000
> @@ -468,7 +468,7 @@ void __init set_max_mapnr_init(void)
> if (high0->spanned_pages > 0)
> highmem_start_page = high0->zone_mem_map;
> else
> - highmem_start_page = pfn_to_page(max_low_pfn+1);
> + highmem_start_page = pfn_to_page(max_low_pfn - 1) + 1;
> num_physpages = highend_pfn;
> #else
> num_physpages = max_low_pfn;
>
>


2004-11-15 21:05:50

by Hugh Dickins

[permalink] [raw]
Subject: Re: [PATCH] low discontig highmem_start_page

On Mon, 15 Nov 2004, Martin J. Bligh wrote:
> --On Monday, November 15, 2004 20:37:28 +0000 Hugh Dickins <[email protected]> wrote:
>
> > In the case of i386 CONFIG_DISCONTIGMEM CONFIG_HIGHMEM without highmem,
> > highmem_start_page was wrongly initialized (from a NULL zone_mem_map),
> > causing __change_page_attr to BUG on boot.
>
> Thanks, I'm not suprised that was broken - I never test without highmem ;-)

Yes, I imagine it's a pretty odd combination: the tmpfs symlink mpol
screwup shows I wasn't testing NUMA enough, and I often lower my mem
with mem= to increase the pressure, so hit this.

Hugh