drivers/cpufreq/acpi-cpufreq.c | 59 ++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 7 deletions(-)
The _CPC method can get per-core highest frequency.
The highest frequency may varies between cores which mean cores can
running at different max frequency, so can use it as a core priority
and give a hint to scheduler in order to put critical task to the
higher priority core.
Signed-off-by: Tony W Wang-oc <TonyWWang-oc@zhaoxin.com>
---
drivers/cpufreq/acpi-cpufreq.c | 59 ++++++++++++++++++++++++++++++----
1 file changed, 52 insertions(+), 7 deletions(-)
diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c
index b2f05d27167e..5733323e04ac 100644
--- a/drivers/cpufreq/acpi-cpufreq.c
+++ b/drivers/cpufreq/acpi-cpufreq.c
@@ -628,28 +628,35 @@ static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c)
#endif
#ifdef CONFIG_ACPI_CPPC_LIB
-static u64 get_max_boost_ratio(unsigned int cpu)
+static void cpufreq_get_core_perf(int cpu, u64 *highest_perf, u64 *nominal_perf)
{
struct cppc_perf_caps perf_caps;
- u64 highest_perf, nominal_perf;
int ret;
if (acpi_pstate_strict)
- return 0;
+ return;
ret = cppc_get_perf_caps(cpu, &perf_caps);
if (ret) {
pr_debug("CPU%d: Unable to get performance capabilities (%d)\n",
cpu, ret);
- return 0;
+ return;
}
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
- highest_perf = amd_get_highest_perf();
+ *highest_perf = amd_get_highest_perf();
else
- highest_perf = perf_caps.highest_perf;
+ *highest_perf = perf_caps.highest_perf;
+
+ *nominal_perf = perf_caps.nominal_perf;
+ return;
+}
- nominal_perf = perf_caps.nominal_perf;
+static u64 get_max_boost_ratio(unsigned int cpu)
+{
+ u64 highest_perf, nominal_perf;
+
+ cpufreq_get_core_perf(cpu, &highest_perf, &nominal_perf);
if (!highest_perf || !nominal_perf) {
pr_debug("CPU%d: highest or nominal performance missing\n", cpu);
@@ -663,8 +670,44 @@ static u64 get_max_boost_ratio(unsigned int cpu)
return div_u64(highest_perf << SCHED_CAPACITY_SHIFT, nominal_perf);
}
+
+static void cpufreq_sched_itmt_work_fn(struct work_struct *work)
+{
+ sched_set_itmt_support();
+}
+
+static DECLARE_WORK(sched_itmt_work, cpufreq_sched_itmt_work_fn);
+
+static void cpufreq_set_itmt_prio(int cpu)
+{
+ u64 highest_perf, nominal_perf;
+ static u32 max_highest_perf = 0, min_highest_perf = U32_MAX;
+
+ cpufreq_get_core_perf(cpu, &highest_perf, &nominal_perf);
+
+ sched_set_itmt_core_prio(highest_perf, cpu);
+
+ if (max_highest_perf <= min_highest_perf) {
+ if (highest_perf > max_highest_perf)
+ max_highest_perf = highest_perf;
+
+ if (highest_perf < min_highest_perf)
+ min_highest_perf = highest_perf;
+
+ if (max_highest_perf > min_highest_perf) {
+ /*
+ * This code can be run during CPU online under the
+ * CPU hotplug locks, so sched_set_itmt_support()
+ * cannot be called from here. Queue up a work item
+ * to invoke it.
+ */
+ schedule_work(&sched_itmt_work);
+ }
+ }
+}
#else
static inline u64 get_max_boost_ratio(unsigned int cpu) { return 0; }
+static void cpufreq_set_itmt_prio(int cpu) { return; }
#endif
static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
@@ -870,6 +913,8 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
/* notify BIOS that we exist */
acpi_processor_notify_smm(THIS_MODULE);
+ cpufreq_set_itmt_prio(cpu);
+
pr_debug("CPU%u - ACPI performance management activated.\n", cpu);
for (i = 0; i < perf->state_count; i++)
pr_debug(" %cP%d: %d MHz, %d mW, %d uS\n",
--
2.17.1
Hi Tony, kernel test robot noticed the following build errors: [auto build test ERROR on rafael-pm/linux-next] [also build test ERROR on linus/master v6.5-rc5 next-20230807] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Tony-W-Wang-oc/cpufreq-ACPI-add-ITMT-support-when-CPPC-enabled/20230807-161352 base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next patch link: https://lore.kernel.org/r/20230807081248.4745-1-TonyWWang-oc%40zhaoxin.com patch subject: [PATCH] cpufreq: ACPI: add ITMT support when CPPC enabled config: x86_64-rhel-8.3 (https://download.01.org/0day-ci/archive/20230807/202308072108.YTVt2KY2-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce: (https://download.01.org/0day-ci/archive/20230807/202308072108.YTVt2KY2-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202308072108.YTVt2KY2-lkp@intel.com/ All errors (new ones prefixed by >>, old ones prefixed by <<): WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/nvdimm/nd_pmem.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/nvdimm/nd_btt.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/nvdimm/nd_e820.o WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/dca/dca.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/802/p8022.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/802/psnap.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/802/stp.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/802/garp.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/802/mrp.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_htb.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_hfsc.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_red.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_gred.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_ingress.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_sfq.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_tbf.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_teql.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_prio.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_multiq.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_netem.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_drr.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_plug.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_mqprio.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_mqprio_lib.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_choke.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/sch_qfq.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/cls_u32.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/cls_route.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/cls_fw.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/cls_basic.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/em_cmp.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/em_nbyte.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/em_u32.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/em_meta.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sched/em_text.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netlink/netlink_diag.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/nfnetlink_osf.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/nf_conntrack.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/nf_conntrack_netlink.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/nf_conntrack_broadcast.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/nf_nat.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/nf_tables.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/nft_fib.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/nft_chain_nat.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/nft_fwd_netdev.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_rr.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_wrr.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_lc.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_wlc.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_fo.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_ovf.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_lblc.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_lblcr.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_dh.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_sh.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_sed.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_nq.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_ftp.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/netfilter/ipvs/ip_vs_pe_sip.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/netfilter/nf_defrag_ipv4.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/netfilter/nf_reject_ipv4.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/netfilter/iptable_nat.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/netfilter/iptable_raw.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/ip_tunnel.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/ipip.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/ip_gre.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/udp_tunnel.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/ip_vti.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/ah4.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/esp4.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/xfrm4_tunnel.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/tunnel4.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/inet_diag.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/tcp_diag.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/udp_diag.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv4/raw_diag.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/unix/unix_diag.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv6/netfilter/ip6table_raw.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv6/netfilter/ip6table_nat.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv6/netfilter/nf_defrag_ipv6.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv6/netfilter/nf_reject_ipv6.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv6/ah6.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv6/esp6.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv6/xfrm6_tunnel.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv6/tunnel6.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv6/mip6.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv6/sit.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/ipv6/ip6_udp_tunnel.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/packet/af_packet_diag.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sunrpc/auth_gss/auth_rpcgss.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sunrpc/auth_gss/rpcsec_gss_krb5.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/8021q/8021q.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/bridge/netfilter/ebtables.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/bridge/netfilter/ebtable_broute.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/bridge/netfilter/ebtable_filter.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/bridge/netfilter/ebtable_nat.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/bridge/bridge.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/sctp/sctp_diag.o WARNING: modpost: missing MODULE_DESCRIPTION() in net/vmw_vsock/vsock_diag.o >> ERROR: modpost: "sched_set_itmt_core_prio" [drivers/cpufreq/acpi-cpufreq.ko] undefined! >> ERROR: modpost: "sched_set_itmt_support" [drivers/cpufreq/acpi-cpufreq.ko] undefined! -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
© 2016 - 2026 Red Hat, Inc.