Merge tag 'char-misc-5.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[linux-2.6-microblaze.git] / mm / workingset.c
index 941bbaa..92e6611 100644 (file)
@@ -263,7 +263,7 @@ void *workingset_eviction(struct page *page, struct mem_cgroup *target_memcg)
        VM_BUG_ON_PAGE(!PageLocked(page), page);
 
        lruvec = mem_cgroup_lruvec(target_memcg, pgdat);
-       workingset_age_nonresident(lruvec, hpage_nr_pages(page));
+       workingset_age_nonresident(lruvec, thp_nr_pages(page));
        /* XXX: target_memcg can be NULL, go through lruvec */
        memcgid = mem_cgroup_id(lruvec_memcg(lruvec));
        eviction = atomic_long_read(&lruvec->nonresident_age);
@@ -353,21 +353,28 @@ void workingset_refault(struct page *page, void *shadow)
        /*
         * Compare the distance to the existing workingset size. We
         * don't activate pages that couldn't stay resident even if
-        * all the memory was available to the page cache. Whether
-        * cache can compete with anon or not depends on having swap.
+        * all the memory was available to the workingset. Whether
+        * workingset competition needs to consider anon or not depends
+        * on having swap.
         */
        workingset_size = lruvec_page_state(eviction_lruvec, NR_ACTIVE_FILE);
-       if (mem_cgroup_get_nr_swap_pages(memcg) > 0) {
+       if (!file) {
                workingset_size += lruvec_page_state(eviction_lruvec,
-                                                    NR_INACTIVE_ANON);
+                                                    NR_INACTIVE_FILE);
+       }
+       if (mem_cgroup_get_nr_swap_pages(memcg) > 0) {
                workingset_size += lruvec_page_state(eviction_lruvec,
                                                     NR_ACTIVE_ANON);
+               if (file) {
+                       workingset_size += lruvec_page_state(eviction_lruvec,
+                                                    NR_INACTIVE_ANON);
+               }
        }
        if (refault_distance > workingset_size)
                goto out;
 
        SetPageActive(page);
-       workingset_age_nonresident(lruvec, hpage_nr_pages(page));
+       workingset_age_nonresident(lruvec, thp_nr_pages(page));
        inc_lruvec_state(lruvec, WORKINGSET_ACTIVATE_BASE + file);
 
        /* Page was active prior to eviction */
@@ -404,7 +411,7 @@ void workingset_activation(struct page *page)
        if (!mem_cgroup_disabled() && !memcg)
                goto out;
        lruvec = mem_cgroup_page_lruvec(page, page_pgdat(page));
-       workingset_age_nonresident(lruvec, hpage_nr_pages(page));
+       workingset_age_nonresident(lruvec, thp_nr_pages(page));
 out:
        rcu_read_unlock();
 }