]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - mm/memory-failure.c
KVM: arm64: add SYS_DESC()
[karo-tx-linux.git] / mm / memory-failure.c
index f283c7e0a2a302c617c03a3aebf60e262b94a895..27f7210e7fabd1441d699d328213f95302c79378 100644 (file)
@@ -40,7 +40,8 @@
 #include <linux/mm.h>
 #include <linux/page-flags.h>
 #include <linux/kernel-page-flags.h>
-#include <linux/sched.h>
+#include <linux/sched/signal.h>
+#include <linux/sched/task.h>
 #include <linux/ksm.h>
 #include <linux/rmap.h>
 #include <linux/export.h>
@@ -1527,7 +1528,8 @@ static int get_any_page(struct page *page, unsigned long pfn, int flags)
 {
        int ret = __get_any_page(page, pfn, flags);
 
-       if (ret == 1 && !PageHuge(page) && !PageLRU(page)) {
+       if (ret == 1 && !PageHuge(page) &&
+           !PageLRU(page) && !__PageMovable(page)) {
                /*
                 * Try to free it.
                 */
@@ -1649,7 +1651,10 @@ static int __soft_offline_page(struct page *page, int flags)
         * Try to migrate to a new page instead. migrate.c
         * handles a large number of cases for us.
         */
-       ret = isolate_lru_page(page);
+       if (PageLRU(page))
+               ret = isolate_lru_page(page);
+       else
+               ret = isolate_movable_page(page, ISOLATE_UNEVICTABLE);
        /*
         * Drop page reference which is came from get_any_page()
         * successful isolate_lru_page() already took another one.
@@ -1657,18 +1662,20 @@ static int __soft_offline_page(struct page *page, int flags)
        put_hwpoison_page(page);
        if (!ret) {
                LIST_HEAD(pagelist);
-               inc_node_page_state(page, NR_ISOLATED_ANON +
-                                       page_is_file_cache(page));
+               /*
+                * After isolated lru page, the PageLRU will be cleared,
+                * so use !__PageMovable instead for LRU page's mapping
+                * cannot have PAGE_MAPPING_MOVABLE.
+                */
+               if (!__PageMovable(page))
+                       inc_node_page_state(page, NR_ISOLATED_ANON +
+                                               page_is_file_cache(page));
                list_add(&page->lru, &pagelist);
                ret = migrate_pages(&pagelist, new_page, NULL, MPOL_MF_MOVE_ALL,
                                        MIGRATE_SYNC, MR_MEMORY_FAILURE);
                if (ret) {
-                       if (!list_empty(&pagelist)) {
-                               list_del(&page->lru);
-                               dec_node_page_state(page, NR_ISOLATED_ANON +
-                                               page_is_file_cache(page));
-                               putback_lru_page(page);
-                       }
+                       if (!list_empty(&pagelist))
+                               putback_movable_pages(&pagelist);
 
                        pr_info("soft offline: %#lx: migration failed %d, type %lx\n",
                                pfn, ret, page->flags);