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:
parent
dbb4320c14
commit
ebc5cf22b4
|
@ -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);
|
||||||
|
|
|
@ -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[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue