|
@@ -900,13 +900,24 @@ out:
|
|
|
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
|
|
|
* to the newly allocated page in newpage.
|
|
|
*/
|
|
|
-static int unmap_and_move(new_page_t get_new_page, free_page_t put_new_page,
|
|
|
- unsigned long private, struct page *page, int force,
|
|
|
- enum migrate_mode mode)
|
|
|
+static ICE_noinline int unmap_and_move(new_page_t get_new_page,
|
|
|
+ free_page_t put_new_page,
|
|
|
+ unsigned long private, struct page *page,
|
|
|
+ int force, enum migrate_mode mode)
|
|
|
{
|
|
|
int rc = 0;
|
|
|
int *result = NULL;
|