| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: Yun Hsiang <yun.hsiang@mediatek.com> |
| Date: Thu, 13 Aug 2020 14:41:46 +0800 |
| Subject: NOUPSTREAM: ANDROID: base: Base related vendor hooks |
| |
| Current CPU capacity is scaled by frequency |
| but it will sometime overestimate. |
| Add vendor hook to adjust cpu capacity. |
| |
| android_vh_arch_set_freq_scale |
| Adjust cpu freq scale for each opp. |
| |
| [CPNOTE: 27/05/21] Lee: Vendor related code - maintain forever |
| |
| Squash |
| NOUPSTREAM: ANDROID: PM / Domains: add vendor_hook to disallow domain idle state |
| ANDROID: topology: Add flag to indicate topology has been updated |
| |
| Bug: 163935827 |
| Bug: 200103201 |
| Bug: 175718935 |
| Bug: 195914333 |
| Bug: 187234873 |
| |
| Signed-off-by: Yun Hsiang <yun.hsiang@mediatek.com> |
| Change-Id: I054740a7f60301d5a3b085bfa540d52853f5eec5 |
| [ebiggers: Folded in the following commit: |
| d6d9bb4ff41b ("ANDROID: fix kernelci build break")] |
| Signed-off-by: Eric Biggers <ebiggers@google.com> |
| --- |
| drivers/android/vendor_hooks.c | 3 +++ |
| drivers/base/arch_topology.c | 7 +++++++ |
| drivers/base/power/domain_governor.c | 7 +++++++ |
| include/linux/arch_topology.h | 1 + |
| include/trace/hooks/pm_domain.h | 21 +++++++++++++++++++++ |
| include/trace/hooks/topology.h | 25 +++++++++++++++++++++++++ |
| 6 files changed, 64 insertions(+) |
| create mode 100644 include/trace/hooks/pm_domain.h |
| create mode 100644 include/trace/hooks/topology.h |
| |
| diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c |
| --- a/drivers/android/vendor_hooks.c |
| +++ b/drivers/android/vendor_hooks.c |
| @@ -12,6 +12,7 @@ |
| #include <trace/hooks/fpsimd.h> |
| #include <trace/hooks/dtask.h> |
| #include <trace/hooks/cpuidle.h> |
| +#include <trace/hooks/topology.h> |
| #include <trace/hooks/mpam.h> |
| #include <trace/hooks/wqlockup.h> |
| #include <trace/hooks/debug.h> |
| @@ -50,6 +51,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_prepare_prio_fork); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_finish_prio_fork); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_user_nice); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_setscheduler); |
| +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_arch_set_freq_scale); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_is_fpsimd_save); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sched_show_task); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cpu_idle_enter); |
| @@ -125,6 +127,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_tick); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_wakeup_ignore); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_replace_next_task_fair); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_build_sched_domains); |
| +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_update_topology_flags_workfn); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sched_balance_rt); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_pick_next_entity); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_wakeup); |
| diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c |
| --- a/drivers/base/arch_topology.c |
| +++ b/drivers/base/arch_topology.c |
| @@ -18,6 +18,7 @@ |
| #include <linux/init.h> |
| #include <linux/rcupdate.h> |
| #include <linux/sched.h> |
| +#include <trace/hooks/topology.h> |
| |
| static DEFINE_PER_CPU(struct scale_freq_data __rcu *, sft_data); |
| static struct cpumask scale_freq_counters_mask; |
| @@ -141,6 +142,8 @@ void topology_set_freq_scale(const struct cpumask *cpus, unsigned long cur_freq, |
| |
| scale = (cur_freq << SCHED_CAPACITY_SHIFT) / max_freq; |
| |
| + trace_android_vh_arch_set_freq_scale(cpus, cur_freq, max_freq, &scale); |
| + |
| for_each_cpu(i, cpus) |
| per_cpu(arch_freq_scale, i) = scale; |
| } |
| @@ -199,6 +202,8 @@ static int register_cpu_capacity_sysctl(void) |
| subsys_initcall(register_cpu_capacity_sysctl); |
| |
| static int update_topology; |
| +bool topology_update_done; |
| +EXPORT_SYMBOL_GPL(topology_update_done); |
| |
| int topology_update_cpu_topology(void) |
| { |
| @@ -213,6 +218,8 @@ static void update_topology_flags_workfn(struct work_struct *work) |
| { |
| update_topology = 1; |
| rebuild_sched_domains(); |
| + topology_update_done = true; |
| + trace_android_vh_update_topology_flags_workfn(NULL); |
| pr_debug("sched_domain hierarchy rebuilt, flags updated\n"); |
| update_topology = 0; |
| } |
| diff --git a/drivers/base/power/domain_governor.c b/drivers/base/power/domain_governor.c |
| --- a/drivers/base/power/domain_governor.c |
| +++ b/drivers/base/power/domain_governor.c |
| @@ -12,6 +12,8 @@ |
| #include <linux/cpumask.h> |
| #include <linux/ktime.h> |
| |
| +#include <trace/hooks/pm_domain.h> |
| + |
| static int dev_update_qos_constraint(struct device *dev, void *data) |
| { |
| s64 *constraint_ns_p = data; |
| @@ -174,6 +176,11 @@ static bool __default_power_down_ok(struct dev_pm_domain *pd, |
| struct pm_domain_data *pdd; |
| s64 min_off_time_ns; |
| s64 off_on_time_ns; |
| + bool allow = true; |
| + |
| + trace_android_vh_allow_domain_state(genpd, state, &allow); |
| + if (!allow) |
| + return false; |
| |
| off_on_time_ns = genpd->states[state].power_off_latency_ns + |
| genpd->states[state].power_on_latency_ns; |
| diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h |
| --- a/include/linux/arch_topology.h |
| +++ b/include/linux/arch_topology.h |
| @@ -93,5 +93,6 @@ void remove_cpu_topology(unsigned int cpuid); |
| void reset_cpu_topology(void); |
| int parse_acpi_topology(void); |
| #endif |
| +extern bool topology_update_done; |
| |
| #endif /* _LINUX_ARCH_TOPOLOGY_H_ */ |
| diff --git a/include/trace/hooks/pm_domain.h b/include/trace/hooks/pm_domain.h |
| new file mode 100644 |
| --- /dev/null |
| +++ b/include/trace/hooks/pm_domain.h |
| @@ -0,0 +1,21 @@ |
| +/* SPDX-License-Identifier: GPL-2.0 */ |
| + |
| +#undef TRACE_SYSTEM |
| +#define TRACE_SYSTEM pm_domain |
| + |
| +#define TRACE_INCLUDE_PATH trace/hooks |
| + |
| +#if !defined(_TRACE_HOOK_PM_DOMAIN_H) || defined(TRACE_HEADER_MULTI_READ) |
| +#define _TRACE_HOOK_PM_DOMAIN_H |
| + |
| +#include <linux/tracepoint.h> |
| +#include <trace/hooks/vendor_hooks.h> |
| + |
| +struct generic_pm_domain; |
| +DECLARE_HOOK(android_vh_allow_domain_state, |
| + TP_PROTO(struct generic_pm_domain *genpd, uint32_t idx, bool *allow), |
| + TP_ARGS(genpd, idx, allow)) |
| + |
| +#endif /* _TRACE_HOOK_PM_DOMAIN_H */ |
| + |
| +#include <trace/define_trace.h> |
| diff --git a/include/trace/hooks/topology.h b/include/trace/hooks/topology.h |
| new file mode 100644 |
| --- /dev/null |
| +++ b/include/trace/hooks/topology.h |
| @@ -0,0 +1,25 @@ |
| +/* SPDX-License-Identifier: GPL-2.0 */ |
| +#undef TRACE_SYSTEM |
| +#define TRACE_SYSTEM topology |
| + |
| +#define TRACE_INCLUDE_PATH trace/hooks |
| + |
| +#if !defined(_TRACE_HOOK_TOPOLOGY_H) || defined(TRACE_HEADER_MULTI_READ) |
| +#define _TRACE_HOOK_TOPOLOGY_H |
| + |
| +#include <linux/tracepoint.h> |
| +#include <trace/hooks/vendor_hooks.h> |
| +#include <linux/cpumask.h> |
| + |
| +DECLARE_HOOK(android_vh_arch_set_freq_scale, |
| + TP_PROTO(const struct cpumask *cpus, unsigned long freq, |
| + unsigned long max, unsigned long *scale), |
| + TP_ARGS(cpus, freq, max, scale)); |
| + |
| +DECLARE_HOOK(android_vh_update_topology_flags_workfn, |
| + TP_PROTO(void *unused), |
| + TP_ARGS(unused)); |
| + |
| +#endif /* _TRACE_HOOK_TOPOLOGY_H */ |
| +/* This part must be outside protection */ |
| +#include <trace/define_trace.h> |