mm/workingset: prepare the workingset detection infrastructure for anon LRU
To prepare the workingset detection for anon LRU, this patch splits workingset event counters for refault, activate and restore into anon and file variants, as well as the refaults counter in struct lruvec. Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Hugh Dickins <hughd@google.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Michal Hocko <mhocko@kernel.org> Cc: Minchan Kim <minchan@kernel.org> Link: http://lkml.kernel.org/r/1595490560-15117-4-git-send-email-iamjoonsoo.kim@lge.com Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
b518154e59
commit
170b04b7ae
@@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/memcontrol.h>
|
||||
#include <linux/mm_inline.h>
|
||||
#include <linux/writeback.h>
|
||||
#include <linux/shmem_fs.h>
|
||||
#include <linux/pagemap.h>
|
||||
@@ -280,6 +281,7 @@ void *workingset_eviction(struct page *page, struct mem_cgroup *target_memcg)
|
||||
*/
|
||||
void workingset_refault(struct page *page, void *shadow)
|
||||
{
|
||||
bool file = page_is_file_lru(page);
|
||||
struct mem_cgroup *eviction_memcg;
|
||||
struct lruvec *eviction_lruvec;
|
||||
unsigned long refault_distance;
|
||||
@@ -346,7 +348,7 @@ void workingset_refault(struct page *page, void *shadow)
|
||||
memcg = page_memcg(page);
|
||||
lruvec = mem_cgroup_lruvec(memcg, pgdat);
|
||||
|
||||
inc_lruvec_state(lruvec, WORKINGSET_REFAULT);
|
||||
inc_lruvec_state(lruvec, WORKINGSET_REFAULT_BASE + file);
|
||||
|
||||
/*
|
||||
* Compare the distance to the existing workingset size. We
|
||||
@@ -366,7 +368,7 @@ void workingset_refault(struct page *page, void *shadow)
|
||||
|
||||
SetPageActive(page);
|
||||
workingset_age_nonresident(lruvec, hpage_nr_pages(page));
|
||||
inc_lruvec_state(lruvec, WORKINGSET_ACTIVATE);
|
||||
inc_lruvec_state(lruvec, WORKINGSET_ACTIVATE_BASE + file);
|
||||
|
||||
/* Page was active prior to eviction */
|
||||
if (workingset) {
|
||||
@@ -375,7 +377,7 @@ void workingset_refault(struct page *page, void *shadow)
|
||||
spin_lock_irq(&page_pgdat(page)->lru_lock);
|
||||
lru_note_cost_page(page);
|
||||
spin_unlock_irq(&page_pgdat(page)->lru_lock);
|
||||
inc_lruvec_state(lruvec, WORKINGSET_RESTORE);
|
||||
inc_lruvec_state(lruvec, WORKINGSET_RESTORE_BASE + file);
|
||||
}
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
|
Reference in New Issue
Block a user