]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - mm/migrate.c
lib: radix-tree: check accounting of existing slot replacement users
[karo-tx-linux.git] / mm / migrate.c
index 99250aee1ac166fd8d5bb03849041b2a07fc3f80..0ed24b1fa77b89cd49738390cda724c5e74008f8 100644 (file)
@@ -168,8 +168,6 @@ void putback_movable_pages(struct list_head *l)
                        continue;
                }
                list_del(&page->lru);
-               dec_node_page_state(page, NR_ISOLATED_ANON +
-                               page_is_file_cache(page));
                /*
                 * We isolated non-lru movable page so here we can use
                 * __PageMovable because LRU page's mapping cannot have
@@ -186,6 +184,8 @@ void putback_movable_pages(struct list_head *l)
                        put_page(page);
                } else {
                        putback_lru_page(page);
+                       dec_node_page_state(page, NR_ISOLATED_ANON +
+                                       page_is_file_cache(page));
                }
        }
 }
@@ -482,7 +482,7 @@ int migrate_page_move_mapping(struct address_space *mapping,
                SetPageDirty(newpage);
        }
 
-       radix_tree_replace_slot(pslot, newpage);
+       radix_tree_replace_slot(&mapping->page_tree, pslot, newpage);
 
        /*
         * Drop cache reference from old page by unfreezing
@@ -556,7 +556,7 @@ int migrate_huge_page_move_mapping(struct address_space *mapping,
 
        get_page(newpage);
 
-       radix_tree_replace_slot(pslot, newpage);
+       radix_tree_replace_slot(&mapping->page_tree, pslot, newpage);
 
        page_ref_unfreeze(page, expected_count - 1);
 
@@ -1121,8 +1121,15 @@ out:
                 * restored.
                 */
                list_del(&page->lru);
-               dec_node_page_state(page, NR_ISOLATED_ANON +
-                               page_is_file_cache(page));
+
+               /*
+                * Compaction can migrate also non-LRU pages which are
+                * not accounted to NR_ISOLATED_*. They can be recognized
+                * as __PageMovable
+                */
+               if (likely(!__PageMovable(page)))
+                       dec_node_page_state(page, NR_ISOLATED_ANON +
+                                       page_is_file_cache(page));
        }
 
        /*