mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
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:
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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>
|
||||
|
||||
20
mm/vmscan.c
20
mm/vmscan.c
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user