2008-08-05 15:32:35

by Gerald Schaefer

[permalink] [raw]
Subject: [PATCH] hugetlb: call arch_prepare_hugepage() for surplus pages

From: Gerald Schaefer <[email protected]>

The s390 software large page emulation implements shared page tables
by using page->index of the first tail page from a compound large page
to store page table information. This is set up in arch_prepare_hugepage(),
which is called from alloc_fresh_huge_page_node().

A similar call to arch_prepare_hugepage() is missing for surplus large
pages that are allocated in alloc_buddy_huge_page(), which breaks the
software emulation mode for (surplus) large pages on s390. This patch
adds the missing call to arch_prepare_hugepage(). It will have no effect
on other architectures where arch_prepare_hugepage() is a nop.

Acked-by: Martin Schwidefsky <[email protected]>
Signed-off-by: Gerald Schaefer <[email protected]>
---

mm/hugetlb.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

Index: linux/mm/hugetlb.c
===================================================================
--- linux.orig/mm/hugetlb.c
+++ linux/mm/hugetlb.c
@@ -565,7 +565,7 @@ static struct page *alloc_fresh_huge_pag
huge_page_order(h));
if (page) {
if (arch_prepare_hugepage(page)) {
- __free_pages(page, HUGETLB_PAGE_ORDER);
+ __free_pages(page, huge_page_order(h));
return NULL;
}
prep_new_huge_page(h, page, nid);
@@ -665,6 +665,11 @@ static struct page *alloc_buddy_huge_pag
__GFP_REPEAT|__GFP_NOWARN,
huge_page_order(h));

+ if (page && arch_prepare_hugepage(page)) {
+ __free_pages(page, huge_page_order(h));
+ return NULL;
+ }
+
spin_lock(&hugetlb_lock);
if (page) {
/*


2008-08-05 15:36:36

by Nick Piggin

[permalink] [raw]
Subject: Re: [PATCH] hugetlb: call arch_prepare_hugepage() for surplus pages

On Wednesday 06 August 2008 01:29, Gerald Schaefer wrote:
> From: Gerald Schaefer <[email protected]>
>
> The s390 software large page emulation implements shared page tables
> by using page->index of the first tail page from a compound large page
> to store page table information. This is set up in arch_prepare_hugepage(),
> which is called from alloc_fresh_huge_page_node().
>
> A similar call to arch_prepare_hugepage() is missing for surplus large
> pages that are allocated in alloc_buddy_huge_page(), which breaks the
> software emulation mode for (surplus) large pages on s390. This patch
> adds the missing call to arch_prepare_hugepage(). It will have no effect
> on other architectures where arch_prepare_hugepage() is a nop.
>
> Acked-by: Martin Schwidefsky <[email protected]>
> Signed-off-by: Gerald Schaefer <[email protected]>
> ---
>
> mm/hugetlb.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> Index: linux/mm/hugetlb.c
> ===================================================================
> --- linux.orig/mm/hugetlb.c
> +++ linux/mm/hugetlb.c
> @@ -565,7 +565,7 @@ static struct page *alloc_fresh_huge_pag
> huge_page_order(h));
> if (page) {
> if (arch_prepare_hugepage(page)) {
> - __free_pages(page, HUGETLB_PAGE_ORDER);
> + __free_pages(page, huge_page_order(h));
> return NULL;
> }
> prep_new_huge_page(h, page, nid);

This looks like a seperate bugfix?


> @@ -665,6 +665,11 @@ static struct page *alloc_buddy_huge_pag
> __GFP_REPEAT|__GFP_NOWARN,
> huge_page_order(h));
>
> + if (page && arch_prepare_hugepage(page)) {
> + __free_pages(page, huge_page_order(h));
> + return NULL;
> + }
> +
> spin_lock(&hugetlb_lock);
> if (page) {
> /*

Acked-by: Nick Piggin <[email protected]>

2008-08-05 15:43:52

by Adam Litke

[permalink] [raw]
Subject: Re: [PATCH] hugetlb: call arch_prepare_hugepage() for surplus pages

On Tue, 2008-08-05 at 17:29 +0200, Gerald Schaefer wrote:
> From: Gerald Schaefer <[email protected]>
>
> The s390 software large page emulation implements shared page tables
> by using page->index of the first tail page from a compound large page
> to store page table information. This is set up in arch_prepare_hugepage(),
> which is called from alloc_fresh_huge_page_node().
>
> A similar call to arch_prepare_hugepage() is missing for surplus large
> pages that are allocated in alloc_buddy_huge_page(), which breaks the
> software emulation mode for (surplus) large pages on s390. This patch
> adds the missing call to arch_prepare_hugepage(). It will have no effect
> on other architectures where arch_prepare_hugepage() is a nop.
>
> Acked-by: Martin Schwidefsky <[email protected]>
> Signed-off-by: Gerald Schaefer <[email protected]>

Seems fine.

Acked-by: Adam Litke <[email protected]>

--
Adam Litke - (agl at us.ibm.com)
IBM Linux Technology Center

2008-08-05 20:40:00

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] hugetlb: call arch_prepare_hugepage() for surplus pages

On Tue, 05 Aug 2008 17:29:07 +0200
Gerald Schaefer <[email protected]> wrote:

> From: Gerald Schaefer <[email protected]>
>
> The s390 software large page emulation implements shared page tables
> by using page->index of the first tail page from a compound large page
> to store page table information. This is set up in arch_prepare_hugepage(),
> which is called from alloc_fresh_huge_page_node().
>
> A similar call to arch_prepare_hugepage() is missing for surplus large
> pages that are allocated in alloc_buddy_huge_page(), which breaks the
> software emulation mode for (surplus) large pages on s390. This patch
> adds the missing call to arch_prepare_hugepage(). It will have no effect
> on other architectures where arch_prepare_hugepage() is a nop.
>
> Acked-by: Martin Schwidefsky <[email protected]>
> Signed-off-by: Gerald Schaefer <[email protected]>
> ---
>
> mm/hugetlb.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> Index: linux/mm/hugetlb.c
> ===================================================================
> --- linux.orig/mm/hugetlb.c
> +++ linux/mm/hugetlb.c
> @@ -565,7 +565,7 @@ static struct page *alloc_fresh_huge_pag
> huge_page_order(h));
> if (page) {
> if (arch_prepare_hugepage(page)) {
> - __free_pages(page, HUGETLB_PAGE_ORDER);
> + __free_pages(page, huge_page_order(h));

As Nick pointed out, this is an unrelated bugfix. I changelogged it.
Really it should have been two patches.

> return NULL;
> }
> prep_new_huge_page(h, page, nid);
> @@ -665,6 +665,11 @@ static struct page *alloc_buddy_huge_pag
> __GFP_REPEAT|__GFP_NOWARN,
> huge_page_order(h));
>
> + if (page && arch_prepare_hugepage(page)) {
> + __free_pages(page, huge_page_order(h));
> + return NULL;
> + }
> +
> spin_lock(&hugetlb_lock);
> if (page) {
> /*

afaict the second fix is needed in 2.6.26.x (but not 2.6.25.x), but
this patch is not applicable to 2.6.26.x.

So if you want this fix to be backported into 2.6.26.x, please send a
suitable version of it to [email protected].

2008-08-06 13:49:20

by Gerald Schaefer

[permalink] [raw]
Subject: Re: [PATCH] hugetlb: call arch_prepare_hugepage() for surplus pages

On Tue, 2008-08-05 at 13:32 -0700, Andrew Morton wrote:
> > ---
> >
> > mm/hugetlb.c | 7 ++++++-
> > 1 file changed, 6 insertions(+), 1 deletion(-)
> >
> > Index: linux/mm/hugetlb.c
> > ===================================================================
> > --- linux.orig/mm/hugetlb.c
> > +++ linux/mm/hugetlb.c
> > @@ -565,7 +565,7 @@ static struct page *alloc_fresh_huge_pag
> > huge_page_order(h));
> > if (page) {
> > if (arch_prepare_hugepage(page)) {
> > - __free_pages(page, HUGETLB_PAGE_ORDER);
> > + __free_pages(page, huge_page_order(h));
>
> As Nick pointed out, this is an unrelated bugfix. I changelogged it.
> Really it should have been two patches.

Ok, thanks. I didn't see it as a bugfix because it doesn't make any
difference on s390, and nobody else is using arch_prepare_hugepage()
so far. But of course this may change, so I should have made two
patches.

> afaict the second fix is needed in 2.6.26.x (but not 2.6.25.x), but
> this patch is not applicable to 2.6.26.x.
>
> So if you want this fix to be backported into 2.6.26.x, please send a
> suitable version of it to [email protected].

Right, this was missing from the beginning. It affects s390 only,
so I'll check if we need a backport.

Thanks,
Gerald