mm: add setup_initial_init_mm() helper
[linux-block.git] / mm / workingset.c
index cd39902c10629da18b8835da14f31ca3ddb15376..5ba3e42446fa606b24581999678fa7a1dcd5e838 100644 (file)
  * refault distance will immediately activate the refaulting page.
  */
 
+#define WORKINGSET_SHIFT 1
 #define EVICTION_SHIFT ((BITS_PER_LONG - BITS_PER_XA_VALUE) +  \
-                        1 + NODES_SHIFT + MEM_CGROUP_ID_SHIFT)
+                        WORKINGSET_SHIFT + NODES_SHIFT + \
+                        MEM_CGROUP_ID_SHIFT)
 #define EVICTION_MASK  (~0UL >> EVICTION_SHIFT)
 
 /*
@@ -189,7 +191,7 @@ static void *pack_shadow(int memcgid, pg_data_t *pgdat, unsigned long eviction,
        eviction &= EVICTION_MASK;
        eviction = (eviction << MEM_CGROUP_ID_SHIFT) | memcgid;
        eviction = (eviction << NODES_SHIFT) | pgdat->node_id;
-       eviction = (eviction << 1) | workingset;
+       eviction = (eviction << WORKINGSET_SHIFT) | workingset;
 
        return xa_mk_value(eviction);
 }
@@ -201,8 +203,8 @@ static void unpack_shadow(void *shadow, int *memcgidp, pg_data_t **pgdat,
        int memcgid, nid;
        bool workingset;
 
-       workingset = entry & 1;
-       entry >>= 1;
+       workingset = entry & ((1UL << WORKINGSET_SHIFT) - 1);
+       entry >>= WORKINGSET_SHIFT;
        nid = entry & ((1UL << NODES_SHIFT) - 1);
        entry >>= NODES_SHIFT;
        memcgid = entry & ((1UL << MEM_CGROUP_ID_SHIFT) - 1);
@@ -408,7 +410,7 @@ void workingset_activation(struct page *page)
        memcg = page_memcg_rcu(page);
        if (!mem_cgroup_disabled() && !memcg)
                goto out;
-       lruvec = mem_cgroup_page_lruvec(page, page_pgdat(page));
+       lruvec = mem_cgroup_page_lruvec(page);
        workingset_age_nonresident(lruvec, thp_nr_pages(page));
 out:
        rcu_read_unlock();
@@ -554,7 +556,6 @@ static enum lru_status shadow_lru_isolate(struct list_head *item,
                goto out_invalid;
        if (WARN_ON_ONCE(node->count != node->nr_values))
                goto out_invalid;
-       mapping->nrexceptional -= node->nr_values;
        xa_delete_node(node, workingset_update_node);
        __inc_lruvec_kmem_state(node, WORKINGSET_NODERECLAIM);