Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp1805464ybc; Wed, 13 Nov 2019 04:42:38 -0800 (PST) X-Google-Smtp-Source: APXvYqxCk3hI6/nsaXqXh4V5ZEYCqgTkJVjqBnNj3GjlU9rDVMs7DpMgf23hiiLZWTR5ewRHmm47 X-Received: by 2002:a17:906:c41:: with SMTP id t1mr2510517ejf.282.1573648958734; Wed, 13 Nov 2019 04:42:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573648958; cv=none; d=google.com; s=arc-20160816; b=O4MwEGCzooxLMWOlBOiH/DxnfZ2J7KrZVC89XKVstfuSKzHl1yjJON0OfZ1nF9U+4k eIXNFsb6dAGmFu2CjzsOnMHHH2ZLAhO2LdxkElh62Qwzkou2QYf8abhpOqfwcXmzC+PX KuhwX5YfNiPL7yGwqfd1q3P/MuQv9Cz8B5NraJaUrHEuRazn7W6uFnfQ8aA45sns/dBd CiqjMlYAMAuImiZA5B20x1Ubc6CUposppt6cbghnulnvhD1E2Pw7pYpv30/bMZPp+mT4 ZjFC1ouwAF2EdLzLxVXuRTjQo+VkoKUpUs3krbH4jlmbEIuuMS1m6JYMSzTvmTwh82uk lnEw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=F9Ubkny/LuRcgElu8deYvF2mEAm8TFsZOwavBiPABl0=; b=tXt4+1F89y0I+FEI8Jd5HglkWDGc5YKzALp4GLLhNfQpkAEv4bKP8tDrfcRbJqLqrg 36QuloyXLMfvNFdOupSIOqI9dj0BzOaLHoD/c9IjKQN1G3tKfKCMBGkCQx9eBx4T9GqW GJrlTxenYNUdliQuls/wRetFg7oZ5Xibp6+Fgv+6IvXIy571YNNsrJ38uDZ3bgyGQ/Eg O0KCJhqXGj4EPbN+t5gMut6sVxCvATbj2xDHCtxR9p+0olTtnbdLqZh8UPXCi6yFlmhw 7SMioo+1ZsG06Y68tDEI0p63phqnz1ptN/1JCxDcAzBVjFG1nmP0JVCHFVoJSxLea1HC ewLw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g4si1604409edj.263.2019.11.13.04.42.13; Wed, 13 Nov 2019 04:42:38 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727357AbfKMMl0 (ORCPT + 99 others); Wed, 13 Nov 2019 07:41:26 -0500 Received: from mx2.suse.de ([195.135.220.15]:39346 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727192AbfKMMlX (ORCPT ); Wed, 13 Nov 2019 07:41:23 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id B9AE6B556; Wed, 13 Nov 2019 12:41:20 +0000 (UTC) From: Giovanni Gherdovich To: Srinivas Pandruvada , Thomas Gleixner , Ingo Molnar , Peter Zijlstra , Borislav Petkov , Len Brown , "Rafael J . Wysocki" Cc: x86@kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Mel Gorman , Matt Fleming , Viresh Kumar , Juri Lelli , Paul Turner , Vincent Guittot , Quentin Perret , Dietmar Eggemann , Doug Smythies , Giovanni Gherdovich Subject: [PATCH v4 6/6] x86: intel_pstate: handle runtime turbo disablement/enablement in freq. invariance Date: Wed, 13 Nov 2019 13:46:54 +0100 Message-Id: <20191113124654.18122-7-ggherdovich@suse.cz> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20191113124654.18122-1-ggherdovich@suse.cz> References: <20191113124654.18122-1-ggherdovich@suse.cz> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On some platforms such as the Dell XPS 13 laptop the firmware disables turbo when the machine is disconnected from AC, and viceversa it enables it again when it's reconnected. In these cases a _PPC ACPI notification is issued. The scheduler needs to know freq_max for frequency-invariant calculations. To account for turbo availability to come and go, record freq_max at boot as if turbo was available and store it in a helper variable. Use a setter function to swap between 1024 and freq_max every time turbo goes off or on. Reminder: "freq_max" isn't really the maximum frequency but the ratio turbo_freq*1024/base_freq, which becomes 1024 when turbo is disabled. The name could be misleading but makes explainations a lot simpler and is really convenient in calculations. Signed-off-by: Giovanni Gherdovich --- arch/x86/include/asm/topology.h | 5 +++++ arch/x86/kernel/smpboot.c | 14 ++++++++++---- drivers/cpufreq/intel_pstate.c | 1 + 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h index 9b3aca463c8f..4834bde53b5a 100644 --- a/arch/x86/include/asm/topology.h +++ b/arch/x86/include/asm/topology.h @@ -214,6 +214,11 @@ static inline long arch_scale_freq_capacity(int cpu) extern void arch_scale_freq_tick(void); #define arch_scale_freq_tick arch_scale_freq_tick +extern void set_arch_max_freq(bool turbo_disabled); +#else +static inline void set_arch_max_freq(bool turbo_disabled) +{ +} #endif #endif /* _ASM_X86_TOPOLOGY_H */ diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 8988177064be..f94aa1dfc778 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c @@ -1807,8 +1807,15 @@ DEFINE_STATIC_KEY_FALSE(arch_scale_freq_key); static DEFINE_PER_CPU(u64, arch_prev_aperf); static DEFINE_PER_CPU(u64, arch_prev_mperf); +static u64 arch_max_turbo_freq = SCHED_CAPACITY_SCALE; static u64 arch_max_freq = SCHED_CAPACITY_SCALE; +void set_arch_max_freq(bool turbo_disabled) +{ + arch_max_freq = turbo_disabled ? SCHED_CAPACITY_SCALE : + arch_max_turbo_freq; +} + static bool turbo_disabled(void) { u64 misc_en; @@ -2004,9 +2011,6 @@ static void intel_set_cpu_max_freq(void) { u64 ratio = 1, turbo_ratio = 1; - if (turbo_disabled()) - return; - if (slv_set_cpu_max_freq(&ratio, &turbo_ratio)) goto set_value; @@ -2022,7 +2026,9 @@ static void intel_set_cpu_max_freq(void) core_set_cpu_max_freq(&ratio, &turbo_ratio); set_value: - arch_max_freq = div_u64(turbo_ratio * SCHED_CAPACITY_SCALE, ratio); + arch_max_turbo_freq = div_u64(turbo_ratio * SCHED_CAPACITY_SCALE, + ratio); + set_arch_max_freq(turbo_disabled()); static_branch_enable(&arch_scale_freq_key); } diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index 8ab31702cf6a..6bf50783bc24 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c @@ -922,6 +922,7 @@ static void intel_pstate_update_limits(unsigned int cpu) */ if (global.turbo_disabled_mf != global.turbo_disabled) { global.turbo_disabled_mf = global.turbo_disabled; + set_arch_max_freq(global.turbo_disabled); for_each_possible_cpu(cpu) intel_pstate_update_max_freq(cpu); } else { -- 2.16.4