]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - mm/workingset.c
Merge tag 'armsoc-fixes-nc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm...
[mirror_ubuntu-artful-kernel.git] / mm / workingset.c
index eda05c71fa49e6e1e4f93a4029ddef04a4f8ab4c..b8c9ab6784795a0e7f8eff82a9a071d481e91a5f 100644 (file)
@@ -269,7 +269,6 @@ bool workingset_refault(void *shadow)
        lruvec = mem_cgroup_lruvec(pgdat, memcg);
        refault = atomic_long_read(&lruvec->inactive_age);
        active_file = lruvec_lru_size(lruvec, LRU_ACTIVE_FILE, MAX_NR_ZONES);
-       rcu_read_unlock();
 
        /*
         * The unsigned subtraction here gives an accurate distance
@@ -290,11 +289,15 @@ bool workingset_refault(void *shadow)
        refault_distance = (refault - eviction) & EVICTION_MASK;
 
        inc_node_state(pgdat, WORKINGSET_REFAULT);
+       inc_memcg_state(memcg, WORKINGSET_REFAULT);
 
        if (refault_distance <= active_file) {
                inc_node_state(pgdat, WORKINGSET_ACTIVATE);
+               inc_memcg_state(memcg, WORKINGSET_ACTIVATE);
+               rcu_read_unlock();
                return true;
        }
+       rcu_read_unlock();
        return false;
 }
 
@@ -472,6 +475,7 @@ static enum lru_status shadow_lru_isolate(struct list_head *item,
        if (WARN_ON_ONCE(node->exceptional))
                goto out_invalid;
        inc_node_state(page_pgdat(virt_to_page(node)), WORKINGSET_NODERECLAIM);
+       inc_memcg_page_state(virt_to_page(node), WORKINGSET_NODERECLAIM);
        __radix_tree_delete_node(&mapping->page_tree, node,
                                 workingset_update_node, mapping);