diff options
Diffstat (limited to 'mm/workingset.c')
-rw-r--r-- | mm/workingset.c | 13 |
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; | |||
173 | static void *pack_shadow(int memcgid, pg_data_t *pgdat, unsigned long eviction) | 173 | static 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 | ||
183 | static void unpack_shadow(void *shadow, int *memcgidp, pg_data_t **pgdat, | 183 | static 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; |