[PATCH 6/9] mm/mglru: refactor Bloom filter helpers for two filter levels
Baoquan He <[email protected]>
| Newsgroups | org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
Split functions test/update/reset_bloom_filter() into __ prefixed helpers that operate on a generic filters array, and wrappers (test/update/reset_pmd_bloom_filter()) that pass PMD-level mm_state->pmd_filters as parameter. Then PUD-level filter pair can reuse the same hash, double-buffering and reset. no behavior change yet. Signed-off-by: Baoquan He <[email protected]> --- mm/vmscan.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 912cbf86c7ff..062504f287da 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2842,14 +2842,13 @@ static void get_item_key(void *item, int *key) key[1] = hash >> BLOOM_FILTER_SHIFT; } -static bool test_bloom_filter(struct lru_gen_mm_state *mm_state, unsigned long seq, - void *item) +static bool __test_bloom_filter(unsigned long **filters, unsigned long seq, void *item) { int key[2]; unsigned long *filter; int gen = filter_gen_from_seq(seq); - filter = READ_ONCE(mm_state->pmd_filters[gen]); + filter = READ_ONCE(filters[gen]); if (!filter) return true; @@ -2858,14 +2857,13 @@ static bool test_bloom_filter(struct lru_gen_mm_state *mm_state, unsigned long s return test_bit(key[0], filter) && test_bit(key[1], filter); } -static void update_bloom_filter(struct lru_gen_mm_state *mm_state, unsigned long seq, - void *item) +static void __update_bloom_filter(unsigned long **filters, unsigned long seq, void *item) { int key[2]; unsigned long *filter; int gen = filter_gen_from_seq(seq); - filter = READ_ONCE(mm_state->pmd_filters[gen]); + filter = READ_ONCE(filters[gen]); if (!filter) return; @@ -2877,12 +2875,12 @@ static void update_bloom_filter(struct lru_gen_mm_state *mm_state, unsigned long set_bit(key[1], filter); } -static void reset_bloom_filter(struct lru_gen_mm_state *mm_state, unsigned long seq) +static void __reset_bloom_filter(unsigned long **filters, unsigned long seq) { unsigned long *filter; int gen = filter_gen_from_seq(seq); - filter = mm_state->pmd_filters[gen]; + filter = filters[gen]; if (filter) { bitmap_clear(filter, 0, BIT(BLOOM_FILTER_SHIFT)); return; @@ -2890,7 +2888,24 @@ static void reset_bloom_filter(struct lru_gen_mm_state *mm_state, unsigned long filter = bitmap_zalloc(BIT(BLOOM_FILTER_SHIFT), __GFP_HIGH | __GFP_NOMEMALLOC | __GFP_NOWARN); - WRITE_ONCE(mm_state->pmd_filters[gen], filter); + WRITE_ONCE(filters[gen], filter); +} + +static bool test_pmd_bloom_filter(struct lru_gen_mm_state *mm_state, unsigned long seq, + void *item) +{ + return __test_bloom_filter(mm_state->pmd_filters, seq, item); +} + +static void update_pmd_bloom_filter(struct lru_gen_mm_state *mm_state, unsigned long seq, + void *item) +{ + __update_bloom_filter(mm_state->pmd_filters, seq, item); +} + +static void reset_pmd_bloom_filter(struct lru_gen_mm_state *mm_state, unsigned long seq) +{ + __reset_bloom_filter(mm_state->pmd_filters, seq); } /****************************************************************************** @@ -3144,7 +3159,7 @@ static bool iterate_mm_list(struct lru_gen_mm_walk *walk, struct mm_struct **ite spin_unlock(&mm_list->lock); if (mm && first) - reset_bloom_filter(mm_state, walk->seq + 1); + reset_pmd_bloom_filter(mm_state, walk->seq + 1); if (*iter) mmdrop(*iter); @@ -3782,7 +3797,7 @@ static void walk_pmd_range(pud_t *pud, unsigned long start, unsigned long end, walk_pmd_range_locked(pud, addr, vma, args, bitmap, &first); } - if (!walk->force_scan && !test_bloom_filter(mm_state, walk->seq, pmd + i)) + if (!walk->force_scan && !test_pmd_bloom_filter(mm_state, walk->seq, pmd + i)) continue; walk->mm_stats[MM_NONLEAF_FOUND]++; @@ -3793,7 +3808,7 @@ static void walk_pmd_range(pud_t *pud, unsigned long start, unsigned long end, walk->mm_stats[MM_NONLEAF_ADDED]++; /* carry over to the next generation */ - update_bloom_filter(mm_state, walk->seq + 1, pmd + i); + update_pmd_bloom_filter(mm_state, walk->seq + 1, pmd + i); } walk_pmd_range_locked(pud, -1, vma, args, bitmap, &first); @@ -4422,7 +4437,7 @@ bool lru_gen_look_around(struct page_vma_mapped_walk *pvmw, unsigned int nr) /* feedback from rmap walkers to page table walkers */ if (mm_state && suitable_to_scan(i, young)) - update_bloom_filter(mm_state, max_seq, pvmw->pmd); + update_pmd_bloom_filter(mm_state, max_seq, pvmw->pmd); mem_cgroup_put(memcg); -- 2.54.0