ANDROID: vendor hook to control bh_lru and lru_cache_disable

Add vendor hook for bh_lru and lru_cache_disable

Bug: 238728493
Signed-off-by: Minchan Kim <minchan@google.com>
Change-Id: I81bfad317cf6e8633186ebb3238644306d7a102d
Signed-off-by: Richard Chang <richardycc@google.com>
(cherry picked from commit 74e2ea264cd1895c493b9008b62bfea98dacf3f6)
This commit is contained in:
Minchan Kim
2022-10-20 16:03:35 -07:00
committed by Richard Chang
parent 243f54dd3a
commit ba005d6032
5 changed files with 43 additions and 2 deletions

View File

@@ -30,6 +30,7 @@
#include <trace/hooks/ftrace_dump.h> #include <trace/hooks/ftrace_dump.h>
#include <trace/hooks/ufshcd.h> #include <trace/hooks/ufshcd.h>
#include <trace/hooks/block.h> #include <trace/hooks/block.h>
#include <trace/hooks/buffer.h>
#include <trace/hooks/cgroup.h> #include <trace/hooks/cgroup.h>
#include <trace/hooks/sys.h> #include <trace/hooks/sys.h>
#include <trace/hooks/iommu.h> #include <trace/hooks/iommu.h>
@@ -282,3 +283,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_pagevec_drain);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_zap_pte_range_tlb_start); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_zap_pte_range_tlb_start);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_zap_pte_range_tlb_force_flush); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_zap_pte_range_tlb_force_flush);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_zap_pte_range_tlb_end); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_zap_pte_range_tlb_end);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_bh_lru_install);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_skip_lru_disable);

View File

@@ -51,6 +51,8 @@
#include "internal.h" #include "internal.h"
#include <trace/hooks/buffer.h>
static int fsync_buffers_list(spinlock_t *lock, struct list_head *list); static int fsync_buffers_list(spinlock_t *lock, struct list_head *list);
static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh, static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,
enum rw_hint hint, struct writeback_control *wbc); enum rw_hint hint, struct writeback_control *wbc);
@@ -1233,6 +1235,7 @@ static void bh_lru_install(struct buffer_head *bh)
struct buffer_head *evictee = bh; struct buffer_head *evictee = bh;
struct bh_lru *b; struct bh_lru *b;
int i; int i;
bool skip = false;
check_irqs_on(); check_irqs_on();
bh_lru_lock(); bh_lru_lock();
@@ -1248,6 +1251,12 @@ static void bh_lru_install(struct buffer_head *bh)
return; return;
} }
trace_android_vh_bh_lru_install(bh->b_page, &skip);
if (skip) {
bh_lru_unlock();
return;
}
b = this_cpu_ptr(&bh_lrus); b = this_cpu_ptr(&bh_lrus);
for (i = 0; i < BH_LRU_SIZE; i++) { for (i = 0; i < BH_LRU_SIZE; i++) {
swap(evictee, b->bhs[i]); swap(evictee, b->bhs[i]);

View File

@@ -0,0 +1,22 @@
/* SPDX-License-Identifier: GPL-2.0 */
#undef TRACE_SYSTEM
#define TRACE_SYSTEM buffer
#define TRACE_INCLUDE_PATH trace/hooks
#if !defined(_TRACE_HOOK_BUFFER_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_HOOK_BUFFER_H
#include <linux/types.h>
#include <trace/hooks/vendor_hooks.h>
DECLARE_HOOK(android_vh_bh_lru_install,
TP_PROTO(struct page *page, bool *flush),
TP_ARGS(page, flush));
/* macro versions of hooks are no longer required */
#endif /* _TRACE_HOOK_BUFFER_H */
/* This part must be outside protection */
#include <trace/define_trace.h>

View File

@@ -89,6 +89,9 @@ DECLARE_HOOK(android_vh_zap_pte_range_tlb_force_flush,
DECLARE_HOOK(android_vh_zap_pte_range_tlb_end, DECLARE_HOOK(android_vh_zap_pte_range_tlb_end,
TP_PROTO(void *ret), TP_PROTO(void *ret),
TP_ARGS(ret)); TP_ARGS(ret));
DECLARE_HOOK(android_vh_skip_lru_disable,
TP_PROTO(bool *skip),
TP_ARGS(skip));
struct mem_cgroup; struct mem_cgroup;
DECLARE_HOOK(android_vh_mem_cgroup_alloc, DECLARE_HOOK(android_vh_mem_cgroup_alloc,
TP_PROTO(struct mem_cgroup *memcg), TP_PROTO(struct mem_cgroup *memcg),

View File

@@ -9153,6 +9153,7 @@ static int __alloc_contig_migrate_range(struct compact_control *cc,
unsigned int tries = 0; unsigned int tries = 0;
unsigned int max_tries = 5; unsigned int max_tries = 5;
int ret = 0; int ret = 0;
bool skip = false;
struct page *page; struct page *page;
struct migration_target_control mtc = { struct migration_target_control mtc = {
.nid = zone_to_nid(cc->zone), .nid = zone_to_nid(cc->zone),
@@ -9162,7 +9163,9 @@ static int __alloc_contig_migrate_range(struct compact_control *cc,
if (cc->alloc_contig && cc->mode == MIGRATE_ASYNC) if (cc->alloc_contig && cc->mode == MIGRATE_ASYNC)
max_tries = 1; max_tries = 1;
lru_cache_disable(); trace_android_vh_skip_lru_disable(&skip);
if (!skip)
lru_cache_disable();
while (pfn < end || !list_empty(&cc->migratepages)) { while (pfn < end || !list_empty(&cc->migratepages)) {
if (fatal_signal_pending(current)) { if (fatal_signal_pending(current)) {
@@ -9204,7 +9207,8 @@ static int __alloc_contig_migrate_range(struct compact_control *cc,
break; break;
} }
lru_cache_enable(); if (!skip)
lru_cache_enable();
if (ret < 0) { if (ret < 0) {
if (ret == -EBUSY) { if (ret == -EBUSY) {
struct page *page; struct page *page;