mm: stop accounting shadow entries
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Wed, 5 May 2021 01:32:48 +0000 (18:32 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 5 May 2021 18:27:19 +0000 (11:27 -0700)
We no longer need to keep track of how many shadow entries are present in
a mapping.  This saves a few writes to the inode and memory barriers.

Link: https://lkml.kernel.org/r/20201026151849.24232-3-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Tested-by: Vishal Verma <vishal.l.verma@intel.com>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/filemap.c
mm/swap_state.c
mm/truncate.c
mm/workingset.c

index 5be57ba..d08ff15 100644 (file)
@@ -142,17 +142,6 @@ static void page_cache_delete(struct address_space *mapping,
 
        page->mapping = NULL;
        /* Leave page->index set: truncation lookup relies upon it */
-
-       if (shadow) {
-               mapping->nrexceptional += nr;
-               /*
-                * Make sure the nrexceptional update is committed before
-                * the nrpages update so that final truncate racing
-                * with reclaim does not see both counters 0 at the
-                * same time and miss a shadow entry.
-                */
-               smp_wmb();
-       }
        mapping->nrpages -= nr;
 }
 
@@ -925,8 +914,6 @@ noinline int __add_to_page_cache_locked(struct page *page,
                if (xas_error(&xas))
                        goto unlock;
 
-               if (old)
-                       mapping->nrexceptional--;
                mapping->nrpages++;
 
                /* hugetlb pages do not participate in page cache accounting */
index fb7efa0..3a1259c 100644 (file)
@@ -132,7 +132,6 @@ int add_to_swap_cache(struct page *page, swp_entry_t entry,
                        xas_store(&xas, page);
                        xas_next(&xas);
                }
-               address_space->nrexceptional -= nr_shadows;
                address_space->nrpages += nr;
                __mod_node_page_state(page_pgdat(page), NR_FILE_PAGES, nr);
                __mod_lruvec_page_state(page, NR_SWAPCACHE, nr);
@@ -172,8 +171,6 @@ void __delete_from_swap_cache(struct page *page,
                xas_next(&xas);
        }
        ClearPageSwapCache(page);
-       if (shadow)
-               address_space->nrexceptional += nr;
        address_space->nrpages -= nr;
        __mod_node_page_state(page_pgdat(page), NR_FILE_PAGES, -nr);
        __mod_lruvec_page_state(page, NR_SWAPCACHE, -nr);
@@ -275,7 +272,6 @@ void clear_shadow_from_swap_cache(int type, unsigned long begin,
                        xas_store(&xas, NULL);
                        nr_shadows++;
                }
-               address_space->nrexceptional -= nr_shadows;
                xa_unlock_irq(&address_space->i_pages);
 
                /* search the next swapcache until we meet end */
index adb8d41..95af244 100644 (file)
@@ -40,7 +40,6 @@ static inline void __clear_shadow_entry(struct address_space *mapping,
        if (xas_load(&xas) != entry)
                return;
        xas_store(&xas, NULL);
-       mapping->nrexceptional--;
 }
 
 static void clear_shadow_entry(struct address_space *mapping, pgoff_t index,
index cd39902..b7cdeca 100644 (file)
@@ -554,7 +554,6 @@ static enum lru_status shadow_lru_isolate(struct list_head *item,
                goto out_invalid;
        if (WARN_ON_ONCE(node->count != node->nr_values))
                goto out_invalid;
-       mapping->nrexceptional -= node->nr_values;
        xa_delete_node(node, workingset_update_node);
        __inc_lruvec_kmem_state(node, WORKINGSET_NODERECLAIM);