* [PATCH] sparsemem vmemmap: initialize memmap.
@ 2008-05-09 6:38 Heiko Carstens, Heiko Carstens
2008-05-09 10:31 ` Andy Whitcroft
2008-05-09 16:25 ` Christoph Lameter
0 siblings, 2 replies; 5+ messages in thread
From: Heiko Carstens, Heiko Carstens @ 2008-05-09 6:38 UTC (permalink / raw)
To: Andrew Morton
Cc: Andy Whitcroft, Christoph Lameter, Gerald Schaefer, linux-kernel,
linux-mm
Trying to online a new memory section that was added via memory hotplug
results in lots of messages of pages in bad page state.
Reason is that the alloacted virtual memmap isn't initialized.
This is only an issue for memory sections that get added after boot
time since for all other memmaps the bootmem allocator was used which
returns only initialized memory.
I noticed this on s390 which has its private vmemmap_populate function
without using callbacks to the common code. But as far as I can see the
generic code has the same bug, so fix it just once.
Cc: Andy Whitcroft <apw@shadowen.org>
Cc: Christoph Lameter <clameter@sgi.com>
Cc: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
---
mm/sparse-vmemmap.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: linux-2.6/mm/sparse-vmemmap.c
===================================================================
--- linux-2.6.orig/mm/sparse-vmemmap.c
+++ linux-2.6/mm/sparse-vmemmap.c
@@ -154,6 +154,6 @@ struct page * __meminit sparse_mem_map_p
int error = vmemmap_populate(map, PAGES_PER_SECTION, nid);
if (error)
return NULL;
-
+ memset(map, 0, PAGES_PER_SECTION * sizeof(struct page));
return map;
}
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] sparsemem vmemmap: initialize memmap.
2008-05-09 6:38 [PATCH] sparsemem vmemmap: initialize memmap Heiko Carstens, Heiko Carstens
@ 2008-05-09 10:31 ` Andy Whitcroft
2008-05-09 11:34 ` Heiko Carstens
2008-05-09 16:25 ` Christoph Lameter
1 sibling, 1 reply; 5+ messages in thread
From: Andy Whitcroft @ 2008-05-09 10:31 UTC (permalink / raw)
To: Heiko Carstens
Cc: Andrew Morton, Christoph Lameter, Gerald Schaefer, linux-kernel,
linux-mm
On Fri, May 09, 2008 at 08:38:56AM +0200, Heiko Carstens wrote:
> From: Heiko Carstens <heiko.carstens@de.ibm.com>
>
> Trying to online a new memory section that was added via memory hotplug
> results in lots of messages of pages in bad page state.
> Reason is that the alloacted virtual memmap isn't initialized.
> This is only an issue for memory sections that get added after boot
> time since for all other memmaps the bootmem allocator was used which
> returns only initialized memory.
>
> I noticed this on s390 which has its private vmemmap_populate function
> without using callbacks to the common code. But as far as I can see the
> generic code has the same bug, so fix it just once.
>
> Cc: Andy Whitcroft <apw@shadowen.org>
> Cc: Christoph Lameter <clameter@sgi.com>
> Cc: Gerald Schaefer <gerald.schaefer@de.ibm.com>
> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
> ---
> mm/sparse-vmemmap.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> Index: linux-2.6/mm/sparse-vmemmap.c
> ===================================================================
> --- linux-2.6.orig/mm/sparse-vmemmap.c
> +++ linux-2.6/mm/sparse-vmemmap.c
> @@ -154,6 +154,6 @@ struct page * __meminit sparse_mem_map_p
> int error = vmemmap_populate(map, PAGES_PER_SECTION, nid);
> if (error)
> return NULL;
> -
> + memset(map, 0, PAGES_PER_SECTION * sizeof(struct page));
> return map;
> }
The normal expectation is that all allocations are made using
vmemmap_alloc_block() which allocates from the appropriate place. Once
the buddy is up and available it uses:
struct page *page = alloc_pages_node(node,
GFP_KERNEL | __GFP_ZERO, get_order(size));
to get the memory so it should all be zero'd. So I would expect all
existing users to be covered by that? Can you not simply use __GFP_ZERO
for your allocations or use vmemmap_alloc_block() ?
-apw
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] sparsemem vmemmap: initialize memmap.
2008-05-09 10:31 ` Andy Whitcroft
@ 2008-05-09 11:34 ` Heiko Carstens
0 siblings, 0 replies; 5+ messages in thread
From: Heiko Carstens @ 2008-05-09 11:34 UTC (permalink / raw)
To: Andy Whitcroft
Cc: Andrew Morton, Christoph Lameter, Gerald Schaefer, linux-kernel,
linux-mm
> > Index: linux-2.6/mm/sparse-vmemmap.c
> > ===================================================================
> > --- linux-2.6.orig/mm/sparse-vmemmap.c
> > +++ linux-2.6/mm/sparse-vmemmap.c
> > @@ -154,6 +154,6 @@ struct page * __meminit sparse_mem_map_p
> > int error = vmemmap_populate(map, PAGES_PER_SECTION, nid);
> > if (error)
> > return NULL;
> > -
> > + memset(map, 0, PAGES_PER_SECTION * sizeof(struct page));
> > return map;
> > }
>
> The normal expectation is that all allocations are made using
> vmemmap_alloc_block() which allocates from the appropriate place. Once
> the buddy is up and available it uses:
>
> struct page *page = alloc_pages_node(node,
> GFP_KERNEL | __GFP_ZERO, get_order(size));
>
> to get the memory so it should all be zero'd. So I would expect all
> existing users to be covered by that? Can you not simply use __GFP_ZERO
> for your allocations or use vmemmap_alloc_block() ?
Ah, I didn't notice the __GFP_ZERO. So it's just an s390 bug. Will
move the memset to our code instead.
Thanks!
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] sparsemem vmemmap: initialize memmap.
2008-05-09 6:38 [PATCH] sparsemem vmemmap: initialize memmap Heiko Carstens, Heiko Carstens
2008-05-09 10:31 ` Andy Whitcroft
@ 2008-05-09 16:25 ` Christoph Lameter
2008-05-09 17:01 ` Heiko Carstens
1 sibling, 1 reply; 5+ messages in thread
From: Christoph Lameter @ 2008-05-09 16:25 UTC (permalink / raw)
To: Heiko Carstens
Cc: Andrew Morton, Andy Whitcroft, Gerald Schaefer, linux-kernel,
linux-mm
Nack. vmemmap_alloc_block does
void * __meminit vmemmap_alloc_block(unsigned long size, int node)
{
/* If the main allocator is up use that, fallback to bootmem. */
if (slab_is_available()) {
struct page *page = alloc_pages_node(node,
GFP_KERNEL | __GFP_ZERO, get_order(size));
if (page)
return page_address(page);
return NULL;
} else
return __earlyonly_bootmem_alloc(node, size, size,
__pa(MAX_DMA_ADDRESS));
}
memory is always zeroed. Maybe you use an alternate implementation that is
broken?
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH] sparsemem vmemmap: initialize memmap.
2008-05-09 16:25 ` Christoph Lameter
@ 2008-05-09 17:01 ` Heiko Carstens
0 siblings, 0 replies; 5+ messages in thread
From: Heiko Carstens @ 2008-05-09 17:01 UTC (permalink / raw)
To: Christoph Lameter
Cc: Andrew Morton, Andy Whitcroft, Gerald Schaefer, linux-kernel,
linux-mm
On Fri, May 09, 2008 at 09:25:41AM -0700, Christoph Lameter wrote:
> Nack. vmemmap_alloc_block does
>
> void * __meminit vmemmap_alloc_block(unsigned long size, int node)
> {
> /* If the main allocator is up use that, fallback to bootmem. */
> if (slab_is_available()) {
> struct page *page = alloc_pages_node(node,
> GFP_KERNEL | __GFP_ZERO, get_order(size));
> if (page)
> return page_address(page);
> return NULL;
> } else
> return __earlyonly_bootmem_alloc(node, size, size,
> __pa(MAX_DMA_ADDRESS));
> }
>
> memory is always zeroed. Maybe you use an alternate implementation that is
> broken?
Yes, I missed the __GFP_ZERO. Already figured out and fixed in arch code.
Thanks ;)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-05-09 17:01 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-09 6:38 [PATCH] sparsemem vmemmap: initialize memmap Heiko Carstens, Heiko Carstens
2008-05-09 10:31 ` Andy Whitcroft
2008-05-09 11:34 ` Heiko Carstens
2008-05-09 16:25 ` Christoph Lameter
2008-05-09 17:01 ` Heiko Carstens
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).