Commit ef2a5153 authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Linus Torvalds

mm/migrate: mark unmap_and_move() "noinline" to avoid ICE in gcc 4.7.3

With gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-12ubuntu1) :

    mm/migrate.c: In function `migrate_pages':
    mm/migrate.c:1148:1: internal compiler error: in push_minipool_fix, at config/arm/arm.c:13500
    Please submit a full bug report,
    with preprocessed source if appropriate.
    See <file:///usr/share/doc/gcc-4.7/README.Bugs> for instructions.
    Preprocessed source stored into /tmp/ccPoM1tr.out file, please attach this to your bugreport.
    make[1]: *** [mm/migrate.o] Error 1
    make: *** [mm/migrate.o] Error 2

Mark unmap_and_move() (which is used in a single place only) "noinline"
to work around this compiler bug.

[akpm@linux-foundation.org: make it conditional on gcc-4.7.3 and arm]
[khilman@kernel.org: fine-tune compiler versions]
[akpm@linux-foundation.org: fix comment]
Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Reported-by: default avatarKevin Hilman <khilman@kernel.org>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Tested-by: default avatarKevin Hilman <khilman@linaro.org>
Tested-by: default avatarLina Iyer <lina.iyer@linaro.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 692297d8
...@@ -900,13 +900,24 @@ static int __unmap_and_move(struct page *page, struct page *newpage, ...@@ -900,13 +900,24 @@ static int __unmap_and_move(struct page *page, struct page *newpage,
return rc; return rc;
} }
/*
* gcc 4.7 and 4.8 on arm get an ICEs when inlining unmap_and_move(). Work
* around it.
*/
#if (GCC_VERSION >= 40700 && GCC_VERSION < 40900) && defined(CONFIG_ARM)
#define ICE_noinline noinline
#else
#define ICE_noinline
#endif
/* /*
* Obtain the lock on page, remove all ptes and migrate the page * Obtain the lock on page, remove all ptes and migrate the page
* to the newly allocated page in newpage. * to the newly allocated page in newpage.
*/ */
static int unmap_and_move(new_page_t get_new_page, free_page_t put_new_page, static ICE_noinline int unmap_and_move(new_page_t get_new_page,
unsigned long private, struct page *page, int force, free_page_t put_new_page,
enum migrate_mode mode) unsigned long private, struct page *page,
int force, enum migrate_mode mode)
{ {
int rc = 0; int rc = 0;
int *result = NULL; int *result = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment