summaryrefslogtreecommitdiffstats
path: root/mm/workingset.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/workingset.c')
-rw-r--r--mm/workingset.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/mm/workingset.c b/mm/workingset.c
index 4516dd790129..bb109b3afac2 100644
--- a/mm/workingset.c
+++ b/mm/workingset.c
@@ -155,8 +155,8 @@
155 * refault distance will immediately activate the refaulting page. 155 * refault distance will immediately activate the refaulting page.
156 */ 156 */
157 157
158#define EVICTION_SHIFT (RADIX_TREE_EXCEPTIONAL_ENTRY + \ 158#define EVICTION_SHIFT ((BITS_PER_LONG - BITS_PER_XA_VALUE) + \
159 NODES_SHIFT + \ 159 NODES_SHIFT + \
160 MEM_CGROUP_ID_SHIFT) 160 MEM_CGROUP_ID_SHIFT)
161#define EVICTION_MASK (~0UL >> EVICTION_SHIFT) 161#define EVICTION_MASK (~0UL >> EVICTION_SHIFT)
162 162
@@ -173,20 +173,19 @@ static unsigned int bucket_order __read_mostly;
173static void *pack_shadow(int memcgid, pg_data_t *pgdat, unsigned long eviction) 173static void *pack_shadow(int memcgid, pg_data_t *pgdat, unsigned long eviction)
174{ 174{
175 eviction >>= bucket_order; 175 eviction >>= bucket_order;
176 eviction &= EVICTION_MASK;
176 eviction = (eviction << MEM_CGROUP_ID_SHIFT) | memcgid; 177 eviction = (eviction << MEM_CGROUP_ID_SHIFT) | memcgid;
177 eviction = (eviction << NODES_SHIFT) | pgdat->node_id; 178 eviction = (eviction << NODES_SHIFT) | pgdat->node_id;
178 eviction = (eviction << RADIX_TREE_EXCEPTIONAL_SHIFT);
179 179
180 return (void *)(eviction | RADIX_TREE_EXCEPTIONAL_ENTRY); 180 return xa_mk_value(eviction);
181} 181}
182 182
183static void unpack_shadow(void *shadow, int *memcgidp, pg_data_t **pgdat, 183static void unpack_shadow(void *shadow, int *memcgidp, pg_data_t **pgdat,
184 unsigned long *evictionp) 184 unsigned long *evictionp)
185{ 185{
186 unsigned long entry = (unsigned long)shadow; 186 unsigned long entry = xa_to_value(shadow);
187 int memcgid, nid; 187 int memcgid, nid;
188 188
189 entry >>= RADIX_TREE_EXCEPTIONAL_SHIFT;
190 nid = entry & ((1UL << NODES_SHIFT) - 1); 189 nid = entry & ((1UL << NODES_SHIFT) - 1);
191 entry >>= NODES_SHIFT; 190 entry >>= NODES_SHIFT;
192 memcgid = entry & ((1UL << MEM_CGROUP_ID_SHIFT) - 1); 191 memcgid = entry & ((1UL << MEM_CGROUP_ID_SHIFT) - 1);
@@ -453,7 +452,7 @@ static enum lru_status shadow_lru_isolate(struct list_head *item,
453 goto out_invalid; 452 goto out_invalid;
454 for (i = 0; i < RADIX_TREE_MAP_SIZE; i++) { 453 for (i = 0; i < RADIX_TREE_MAP_SIZE; i++) {
455 if (node->slots[i]) { 454 if (node->slots[i]) {
456 if (WARN_ON_ONCE(!radix_tree_exceptional_entry(node->slots[i]))) 455 if (WARN_ON_ONCE(!xa_is_value(node->slots[i])))
457 goto out_invalid; 456 goto out_invalid;
458 if (WARN_ON_ONCE(!node->exceptional)) 457 if (WARN_ON_ONCE(!node->exceptional))
459 goto out_invalid; 458 goto out_invalid;