x86: add tizen_qemu_x86_defconfig & tizen_qemu_x86_64_defconfig
[platform/kernel/linux-rpi.git] / mm / huge_memory.c
index 92192cb..07941a1 100644 (file)
@@ -2426,6 +2426,8 @@ static void __split_huge_page(struct page *page, struct list_head *list,
        /* lock lru list/PageCompound, ref frozen by page_ref_freeze */
        lruvec = lock_page_lruvec(head);
 
+       ClearPageHasHWPoisoned(head);
+
        for (i = nr - 1; i >= 1; i--) {
                __split_huge_page_tail(head, i, lruvec, list);
                /* Some pages can be beyond EOF: drop them from page cache */
@@ -2615,11 +2617,16 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
        struct address_space *mapping = NULL;
        int extra_pins, ret;
        pgoff_t end;
+       bool is_hzp;
 
-       VM_BUG_ON_PAGE(is_huge_zero_page(head), head);
        VM_BUG_ON_PAGE(!PageLocked(head), head);
        VM_BUG_ON_PAGE(!PageCompound(head), head);
 
+       is_hzp = is_huge_zero_page(head);
+       VM_WARN_ON_ONCE_PAGE(is_hzp, head);
+       if (is_hzp)
+               return -EBUSY;
+
        if (PageWriteback(head))
                return -EBUSY;
 
@@ -2872,14 +2879,15 @@ static void split_huge_pages_all(void)
        unsigned long total = 0, split = 0;
 
        pr_debug("Split all THPs\n");
-       for_each_populated_zone(zone) {
+       for_each_zone(zone) {
+               if (!managed_zone(zone))
+                       continue;
                max_zone_pfn = zone_end_pfn(zone);
                for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++) {
-                       if (!pfn_valid(pfn))
-                               continue;
+                       int nr_pages;
 
-                       page = pfn_to_page(pfn);
-                       if (!get_page_unless_zero(page))
+                       page = pfn_to_online_page(pfn);
+                       if (!page || !get_page_unless_zero(page))
                                continue;
 
                        if (zone != page_zone(page))
@@ -2890,8 +2898,10 @@ static void split_huge_pages_all(void)
 
                        total++;
                        lock_page(page);
+                       nr_pages = thp_nr_pages(page);
                        if (!split_huge_page(page))
                                split++;
+                       pfn += nr_pages - 1;
                        unlock_page(page);
 next:
                        put_page(page);