aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
Diffstat (limited to 'mm')
-rw-r--r--mm/filemap.c23
1 files changed, 3 insertions, 20 deletions
diff --git a/mm/filemap.c b/mm/filemap.c
index b418405903bc..9665b1d4f318 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -114,14 +114,11 @@ static void page_cache_tree_delete(struct address_space *mapping,
114 struct page *page, void *shadow) 114 struct page *page, void *shadow)
115{ 115{
116 struct radix_tree_node *node; 116 struct radix_tree_node *node;
117 unsigned long index;
118 unsigned int offset;
119 unsigned int tag;
120 void **slot;
121 117
122 VM_BUG_ON(!PageLocked(page)); 118 VM_BUG_ON(!PageLocked(page));
123 119
124 __radix_tree_lookup(&mapping->page_tree, page->index, &node, &slot); 120 node = radix_tree_replace_clear_tags(&mapping->page_tree, page->index,
121 shadow);
125 122
126 if (shadow) { 123 if (shadow) {
127 mapping->nrexceptional++; 124 mapping->nrexceptional++;
@@ -135,23 +132,9 @@ static void page_cache_tree_delete(struct address_space *mapping,
135 } 132 }
136 mapping->nrpages--; 133 mapping->nrpages--;
137 134
138 if (!node) { 135 if (!node)
139 /* Clear direct pointer tags in root node */
140 mapping->page_tree.gfp_mask &= __GFP_BITS_MASK;
141 radix_tree_replace_slot(slot, shadow);
142 return; 136 return;
143 }
144
145 /* Clear tree tags for the removed page */
146 index = page->index;
147 offset = index & RADIX_TREE_MAP_MASK;
148 for (tag = 0; tag < RADIX_TREE_MAX_TAGS; tag++) {
149 if (test_bit(offset, node->tags[tag]))
150 radix_tree_tag_clear(&mapping->page_tree, index, tag);
151 }
152 137
153 /* Delete page, swap shadow entry */
154 radix_tree_replace_slot(slot, shadow);
155 workingset_node_pages_dec(node); 138 workingset_node_pages_dec(node);
156 if (shadow) 139 if (shadow)
157 workingset_node_shadows_inc(node); 140 workingset_node_shadows_inc(node);