ANDROID: GKI: add vendor hooks android_vh_page_should_be_protected() and

android_vh_modify_scan_control().

add two vendor hooks:
    android_vh_page_should_be_protected():protect pages from memory
reclaim.
    android_vh_page_referenced_check_bypass():bypass rmap in active list
shrink.

The new vendor data field in scan_control are used to track how many
pages are protected in current reclaim and the "protected / scanned"
rate. These parameters are useful for understanding the impact of page
protection operations on LRU and reclaim, helping us make better
decsions.

Bug: 348285765
Change-Id: I49567a4b1f978821a94da0a8339b2b8fdfd52daf
Signed-off-by: Yuxuan Yan <yanyuxuan3@xiaomi.corp-partner.google.com>
This commit is contained in:
Yuxuan Yan
2024-06-20 14:44:17 +08:00
committed by Todd Kjos
parent 41e1c6f937
commit 530ff6a3e6
4 changed files with 30 additions and 0 deletions

View File

@@ -444,6 +444,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_folio_trylock_clear);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_folio_trylock_set);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_handle_trylock_failed_folio);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_hibernate_state);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_should_be_protected);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_page_referenced_check_bypass);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_swapmem_gather_init);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_swapmem_gather_add_bypass);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_swapmem_gather_finish);

View File

@@ -252,6 +252,11 @@ DECLARE_HOOK(android_vh_shmem_swapin_folio,
DECLARE_HOOK(android_vh_madvise_cold_or_pageout_page,
TP_PROTO(bool pageout, struct page *page),
TP_ARGS(pageout, page));
DECLARE_HOOK(android_vh_page_should_be_protected,
TP_PROTO(struct folio *folio, unsigned long nr_scanned,
s8 priority, u64 *ext, int *should_protect),
TP_ARGS(folio, nr_scanned, priority, ext, should_protect));
DECLARE_HOOK(android_vh_swapmem_gather_init,
TP_PROTO(struct mm_struct *mm),
TP_ARGS(mm));

View File

@@ -69,6 +69,9 @@ DECLARE_HOOK(android_vh_do_folio_trylock,
TP_PROTO(struct folio *folio, struct rw_semaphore *sem,
bool *got_lock, bool *skip),
TP_ARGS(folio, sem, got_lock, skip));
DECLARE_HOOK(android_vh_page_referenced_check_bypass,
TP_PROTO(struct folio *folio, unsigned long nr_to_scan, int lru, bool *bypass),
TP_ARGS(folio, nr_to_scan, lru, bypass));
#endif /* _TRACE_HOOK_VMSCAN_H */
/* This part must be outside protection */
#include <trace/define_trace.h>

View File

@@ -1480,6 +1480,10 @@ static enum folio_references folio_check_references(struct folio *folio,
int ret = 0;
bool trylock_failed = false;
#ifdef CONFIG_ANDROID_VENDOR_OEM_DATA
trace_android_vh_page_should_be_protected(folio, sc->nr_scanned,
sc->priority, &sc->android_vendor_data1, &ret);
#endif
trace_android_vh_check_folio_look_around_ref(folio, &ret);
if (ret)
return ret;
@@ -2649,6 +2653,8 @@ static void shrink_active_list(unsigned long nr_to_scan,
unsigned nr_rotated = 0;
int file = is_file_lru(lru);
struct pglist_data *pgdat = lruvec_pgdat(lruvec);
int should_protect = 0;
bool bypass = false;
lru_add_drain();
@@ -2685,6 +2691,19 @@ static void shrink_active_list(unsigned long nr_to_scan,
}
}
#ifdef CONFIG_ANDROID_VENDOR_OEM_DATA
trace_android_vh_page_should_be_protected(folio, sc->nr_scanned,
sc->priority, &sc->android_vendor_data1, &should_protect);
#endif
if (unlikely(should_protect)) {
nr_rotated += folio_nr_pages(folio);
list_add(&folio->lru, &l_active);
continue;
}
trace_android_vh_page_referenced_check_bypass(folio, nr_to_scan, lru, &bypass);
if (bypass)
goto skip_folio_referenced;
trace_android_vh_folio_trylock_set(folio);
/* Referenced or rmap lock contention: rotate */
if (folio_referenced(folio, 0, sc->target_mem_cgroup,
@@ -2706,6 +2725,7 @@ static void shrink_active_list(unsigned long nr_to_scan,
}
}
trace_android_vh_folio_trylock_clear(folio);
skip_folio_referenced:
folio_clear_active(folio); /* we are de-activating */
folio_set_workingset(folio);
list_add(&folio->lru, &l_inactive);