]> Pileus Git - ~andy/linux/blobdiff - mm/vmscan.c
ext4: fix data offset overflow on 32-bit archs in ext4_inline_data_fiemap()
[~andy/linux] / mm / vmscan.c
index 669fba39be1aa41bb9adfd040c709e43b194cfe2..fa6a85378ee41400985aca748cd76b59c0f87594 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/pagemap.h>
 #include <linux/init.h>
 #include <linux/highmem.h>
+#include <linux/vmpressure.h>
 #include <linux/vmstat.h>
 #include <linux/file.h>
 #include <linux/writeback.h>
@@ -780,7 +781,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
                if (PageAnon(page) && !PageSwapCache(page)) {
                        if (!(sc->gfp_mask & __GFP_IO))
                                goto keep_locked;
-                       if (!add_to_swap(page))
+                       if (!add_to_swap(page, page_list))
                                goto activate_locked;
                        may_enter_fs = 1;
                }
@@ -1982,6 +1983,11 @@ static void shrink_zone(struct zone *zone, struct scan_control *sc)
                        }
                        memcg = mem_cgroup_iter(root, memcg, &reclaim);
                } while (memcg);
+
+               vmpressure(sc->gfp_mask, sc->target_mem_cgroup,
+                          sc->nr_scanned - nr_scanned,
+                          sc->nr_reclaimed - nr_reclaimed);
+
        } while (should_continue_reclaim(zone, sc->nr_reclaimed - nr_reclaimed,
                                         sc->nr_scanned - nr_scanned, sc));
 }
@@ -2167,6 +2173,8 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
                count_vm_event(ALLOCSTALL);
 
        do {
+               vmpressure_prio(sc->gfp_mask, sc->target_mem_cgroup,
+                               sc->priority);
                sc->nr_scanned = 0;
                aborted_reclaim = shrink_zones(zonelist, sc);
 
@@ -2619,7 +2627,6 @@ static unsigned long balance_pgdat(pg_data_t *pgdat, int order,
        bool pgdat_is_balanced = false;
        int i;
        int end_zone = 0;       /* Inclusive.  0 = ZONE_DMA */
-       unsigned long total_scanned;
        struct reclaim_state *reclaim_state = current->reclaim_state;
        unsigned long nr_soft_reclaimed;
        unsigned long nr_soft_scanned;
@@ -2639,7 +2646,6 @@ static unsigned long balance_pgdat(pg_data_t *pgdat, int order,
                .gfp_mask = sc.gfp_mask,
        };
 loop_again:
-       total_scanned = 0;
        sc.priority = DEF_PRIORITY;
        sc.nr_reclaimed = 0;
        sc.may_writepage = !laptop_mode;
@@ -2730,7 +2736,6 @@ loop_again:
                                                        order, sc.gfp_mask,
                                                        &nr_soft_scanned);
                        sc.nr_reclaimed += nr_soft_reclaimed;
-                       total_scanned += nr_soft_scanned;
 
                        /*
                         * We put equal pressure on every zone, unless
@@ -2765,7 +2770,6 @@ loop_again:
                                reclaim_state->reclaimed_slab = 0;
                                nr_slab = shrink_slab(&shrink, sc.nr_scanned, lru_pages);
                                sc.nr_reclaimed += reclaim_state->reclaimed_slab;
-                               total_scanned += sc.nr_scanned;
 
                                if (nr_slab == 0 && !zone_reclaimable(zone))
                                        zone->all_unreclaimable = 1;