ANDROID: GKI: add vendor hooks android_vh_page_should_be_protected() and android_vh_page_referenced_check_bypass().
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: 399782297
Change-Id: I49567a4b1f978821a94da0a8339b2b8fdfd52daf
Signed-off-by: Yuxuan Yan <yanyuxuan3@xiaomi.corp-partner.google.com>
This commit is contained in:
@@ -354,6 +354,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_madvise_pageout_bypass);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_pages_prepare_bypass);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_pages_ok_bypass);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_split_large_folio_bypass);
|
||||
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_do_read_fault);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_read);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_map_pages);
|
||||
|
||||
@@ -235,6 +235,10 @@ DECLARE_HOOK(android_vh_free_pages_ok_bypass,
|
||||
DECLARE_HOOK(android_vh_split_large_folio_bypass,
|
||||
TP_PROTO(bool *bypass),
|
||||
TP_ARGS(bypass));
|
||||
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_do_read_fault,
|
||||
TP_PROTO(struct vm_fault *vmf, unsigned long fault_around_bytes),
|
||||
TP_ARGS(vmf, fault_around_bytes));
|
||||
|
||||
@@ -49,6 +49,9 @@ DECLARE_HOOK(android_vh_use_vm_swappiness,
|
||||
DECLARE_HOOK(android_vh_tune_scan_control,
|
||||
TP_PROTO(bool *skip_swap),
|
||||
TP_ARGS(skip_swap));
|
||||
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>
|
||||
|
||||
+21
@@ -876,6 +876,10 @@ static enum folio_references folio_check_references(struct folio *folio,
|
||||
unsigned long vm_flags;
|
||||
int ret = 0;
|
||||
|
||||
#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;
|
||||
@@ -2070,6 +2074,8 @@ static void shrink_active_list(unsigned long nr_to_scan,
|
||||
unsigned nr_rotated = 0;
|
||||
bool file = is_file_lru(lru);
|
||||
struct pglist_data *pgdat = lruvec_pgdat(lruvec);
|
||||
int should_protect = 0;
|
||||
bool bypass = false;
|
||||
|
||||
lru_add_drain();
|
||||
|
||||
@@ -2106,6 +2112,20 @@ 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;
|
||||
|
||||
/* Referenced or rmap lock contention: rotate */
|
||||
if (folio_referenced(folio, 0, sc->target_mem_cgroup,
|
||||
&vm_flags) != 0) {
|
||||
@@ -2125,6 +2145,7 @@ static void shrink_active_list(unsigned long nr_to_scan,
|
||||
}
|
||||
}
|
||||
|
||||
skip_folio_referenced:
|
||||
folio_clear_active(folio); /* we are de-activating */
|
||||
folio_set_workingset(folio);
|
||||
list_add(&folio->lru, &l_inactive);
|
||||
|
||||
Reference in New Issue
Block a user