Merge branch 'akpm' (patches from Andrew)
[platform/kernel/linux-rpi.git] / mm / vmscan.c
index 26f0751..fb95846 100644 (file)
@@ -687,6 +687,21 @@ void unregister_shrinker(struct shrinker *shrinker)
 }
 EXPORT_SYMBOL(unregister_shrinker);
 
+/**
+ * synchronize_shrinkers - Wait for all running shrinkers to complete.
+ *
+ * This is equivalent to calling unregister_shrink() and register_shrinker(),
+ * but atomically and with less overhead. This is useful to guarantee that all
+ * shrinker invocations have seen an update, before freeing memory, similar to
+ * rcu.
+ */
+void synchronize_shrinkers(void)
+{
+       down_write(&shrinker_rwsem);
+       up_write(&shrinker_rwsem);
+}
+EXPORT_SYMBOL(synchronize_shrinkers);
+
 #define SHRINK_BATCH 128
 
 static unsigned long do_shrink_slab(struct shrink_control *shrinkctl,
@@ -1070,12 +1085,12 @@ void reclaim_throttle(pg_data_t *pgdat, enum vmscan_throttle_state reason)
  * pages to clean. If enough pages have been cleaned since throttling
  * started then wakeup the throttled tasks.
  */
-void __acct_reclaim_writeback(pg_data_t *pgdat, struct page *page,
+void __acct_reclaim_writeback(pg_data_t *pgdat, struct folio *folio,
                                                        int nr_throttled)
 {
        unsigned long nr_written;
 
-       inc_node_page_state(page, NR_THROTTLED_WRITTEN);
+       node_stat_add_folio(folio, NR_THROTTLED_WRITTEN);
 
        /*
         * This is an inaccurate read as the per-cpu deltas may not
@@ -2180,6 +2195,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
  */
 int isolate_lru_page(struct page *page)
 {
+       struct folio *folio = page_folio(page);
        int ret = -EBUSY;
 
        VM_BUG_ON_PAGE(!page_count(page), page);
@@ -2189,7 +2205,7 @@ int isolate_lru_page(struct page *page)
                struct lruvec *lruvec;
 
                get_page(page);
-               lruvec = lock_page_lruvec_irq(page);
+               lruvec = folio_lruvec_lock_irq(folio);
                del_page_from_lru_list(page, lruvec);
                unlock_page_lruvec_irq(lruvec);
                ret = 0;
@@ -2296,7 +2312,7 @@ static unsigned int move_pages_to_lru(struct lruvec *lruvec,
                 * All pages were isolated from the same lruvec (and isolation
                 * inhibits memcg migration).
                 */
-               VM_BUG_ON_PAGE(!page_matches_lruvec(page, lruvec), page);
+               VM_BUG_ON_PAGE(!folio_matches_lruvec(page_folio(page), lruvec), page);
                add_page_to_lru_list(page, lruvec);
                nr_pages = thp_nr_pages(page);
                nr_moved += nr_pages;
@@ -4794,6 +4810,7 @@ void check_move_unevictable_pages(struct pagevec *pvec)
 
        for (i = 0; i < pvec->nr; i++) {
                struct page *page = pvec->pages[i];
+               struct folio *folio = page_folio(page);
                int nr_pages;
 
                if (PageTransTail(page))
@@ -4806,7 +4823,7 @@ void check_move_unevictable_pages(struct pagevec *pvec)
                if (!TestClearPageLRU(page))
                        continue;
 
-               lruvec = relock_page_lruvec_irq(page, lruvec);
+               lruvec = folio_lruvec_relock_irq(folio, lruvec);
                if (page_evictable(page) && PageUnevictable(page)) {
                        del_page_from_lru_list(page, lruvec);
                        ClearPageUnevictable(page);