ANDROID: Add vendor hook for MemcgV2 optimization

The associated vendor hooks/data are used for implementing dynamic memory.low protection based on memcgv2.

Bug: 232723420
Test: build pass
Change-Id: I2e92bdc2840af1eaaa08ee6427d2a82d78390005
Signed-off-by: zhaoyang.huang <zhaoyang.huang@unisoc.com>
This commit is contained in:
zhaoyang.huang 2022-05-23 08:53:48 +08:00 committed by Carlos Llamas
parent dbb4320c14
commit ebc5cf22b4
6 changed files with 31 additions and 0 deletions

View File

@ -356,3 +356,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_partial_init);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_mmc_cache_card_properties); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_mmc_cache_card_properties);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_print_transaction_info); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_print_transaction_info);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_handle_tlb_conf); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_handle_tlb_conf);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_memcgv2_init);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_memcgv2_calc_decayed_watermark);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_watermark);

View File

@ -21,6 +21,7 @@
#include <linux/vmstat.h> #include <linux/vmstat.h>
#include <linux/writeback.h> #include <linux/writeback.h>
#include <linux/page-flags.h> #include <linux/page-flags.h>
#include <linux/android_vendor.h>
struct mem_cgroup; struct mem_cgroup;
struct obj_cgroup; struct obj_cgroup;
@ -353,6 +354,9 @@ struct mem_cgroup {
struct lru_gen_mm_list mm_list; struct lru_gen_mm_list mm_list;
#endif #endif
/* for dynamic low */
ANDROID_VENDOR_DATA(1);
struct mem_cgroup_per_node *nodeinfo[]; struct mem_cgroup_per_node *nodeinfo[];
}; };

View File

@ -5,6 +5,7 @@
#include <linux/atomic.h> #include <linux/atomic.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <asm/page.h> #include <asm/page.h>
#include <linux/android_vendor.h>
struct page_counter { struct page_counter {
atomic_long_t usage; atomic_long_t usage;
@ -26,6 +27,7 @@ struct page_counter {
/* legacy */ /* legacy */
unsigned long watermark; unsigned long watermark;
unsigned long failcnt; unsigned long failcnt;
ANDROID_VENDOR_DATA(1);
/* /*
* 'parent' is placed here to be far from 'usage' to reduce * 'parent' is placed here to be far from 'usage' to reduce

View File

@ -14,12 +14,26 @@ DECLARE_HOOK(android_vh_cgroup_set_task,
struct cgroup_subsys; struct cgroup_subsys;
struct cgroup_taskset; struct cgroup_taskset;
struct cgroup;
DECLARE_HOOK(android_vh_cgroup_attach, DECLARE_HOOK(android_vh_cgroup_attach,
TP_PROTO(struct cgroup_subsys *ss, struct cgroup_taskset *tset), TP_PROTO(struct cgroup_subsys *ss, struct cgroup_taskset *tset),
TP_ARGS(ss, tset)) TP_ARGS(ss, tset))
DECLARE_RESTRICTED_HOOK(android_rvh_cgroup_force_kthread_migration, DECLARE_RESTRICTED_HOOK(android_rvh_cgroup_force_kthread_migration,
TP_PROTO(struct task_struct *tsk, struct cgroup *dst_cgrp, bool *force_migration), TP_PROTO(struct task_struct *tsk, struct cgroup *dst_cgrp, bool *force_migration),
TP_ARGS(tsk, dst_cgrp, force_migration), 1); TP_ARGS(tsk, dst_cgrp, force_migration), 1);
struct mem_cgroup;
DECLARE_HOOK(android_rvh_memcgv2_init,
TP_PROTO(struct mem_cgroup *memcg),
TP_ARGS(memcg));
DECLARE_HOOK(android_rvh_memcgv2_calc_decayed_watermark,
TP_PROTO(struct mem_cgroup *memcg),
TP_ARGS(memcg));
struct page_counter;
DECLARE_HOOK(android_rvh_update_watermark,
TP_PROTO(u64 new, struct page_counter *counter),
TP_ARGS(new, counter));
#endif #endif
#include <trace/define_trace.h> #include <trace/define_trace.h>

View File

@ -71,6 +71,8 @@
#include <trace/events/vmscan.h> #include <trace/events/vmscan.h>
#include <trace/hooks/cgroup.h>
struct cgroup_subsys memory_cgrp_subsys __read_mostly; struct cgroup_subsys memory_cgrp_subsys __read_mostly;
EXPORT_SYMBOL(memory_cgrp_subsys); EXPORT_SYMBOL(memory_cgrp_subsys);
@ -5212,6 +5214,7 @@ static struct mem_cgroup *mem_cgroup_alloc(void)
INIT_LIST_HEAD(&memcg->event_list); INIT_LIST_HEAD(&memcg->event_list);
spin_lock_init(&memcg->event_list_lock); spin_lock_init(&memcg->event_list_lock);
memcg->socket_pressure = jiffies; memcg->socket_pressure = jiffies;
trace_android_rvh_memcgv2_init(memcg);
#ifdef CONFIG_MEMCG_KMEM #ifdef CONFIG_MEMCG_KMEM
memcg->kmemcg_id = -1; memcg->kmemcg_id = -1;
INIT_LIST_HEAD(&memcg->objcg_list); INIT_LIST_HEAD(&memcg->objcg_list);
@ -6726,6 +6729,8 @@ void mem_cgroup_calculate_protection(struct mem_cgroup *root,
if (!parent) if (!parent)
return; return;
trace_android_rvh_memcgv2_calc_decayed_watermark(memcg);
if (parent == root) { if (parent == root) {
memcg->memory.emin = READ_ONCE(memcg->memory.min); memcg->memory.emin = READ_ONCE(memcg->memory.min);
memcg->memory.elow = READ_ONCE(memcg->memory.low); memcg->memory.elow = READ_ONCE(memcg->memory.low);

View File

@ -12,6 +12,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/bug.h> #include <linux/bug.h>
#include <asm/page.h> #include <asm/page.h>
#include <trace/hooks/cgroup.h>
static void propagate_protected_usage(struct page_counter *c, static void propagate_protected_usage(struct page_counter *c,
unsigned long usage) unsigned long usage)
@ -83,6 +84,7 @@ void page_counter_charge(struct page_counter *counter, unsigned long nr_pages)
*/ */
if (new > READ_ONCE(c->watermark)) if (new > READ_ONCE(c->watermark))
WRITE_ONCE(c->watermark, new); WRITE_ONCE(c->watermark, new);
trace_android_rvh_update_watermark(new, c);
} }
} }
@ -137,6 +139,7 @@ bool page_counter_try_charge(struct page_counter *counter,
*/ */
if (new > READ_ONCE(c->watermark)) if (new > READ_ONCE(c->watermark))
WRITE_ONCE(c->watermark, new); WRITE_ONCE(c->watermark, new);
trace_android_rvh_update_watermark(new, c);
} }
return true; return true;