Received: by 2002:a05:6602:2086:0:0:0:0 with SMTP id a6csp4822171ioa; Wed, 27 Apr 2022 11:52:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwhU/gYYbRTOyP031Ud7+7VzWDuzGJoYOD3yhAKKrhxhXzEeX6v6hlLqggcyf8SyuEKAXIZ X-Received: by 2002:a63:79ce:0:b0:3a9:efa0:17d with SMTP id u197-20020a6379ce000000b003a9efa0017dmr25370353pgc.170.1651085564436; Wed, 27 Apr 2022 11:52:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651085564; cv=none; d=google.com; s=arc-20160816; b=xgpA6kUpw5FVKH6KrYXo4xVJWgILP+cM2KiBjikfZ1jBiLlvwMc0iGnVWc43tPIt3+ wmEywugajHbDHKTAPx2rNvDTtlFyB0JdX9dilF25p3IpTmbSw4YD58PuPdZ1K8rVG03t 5o02Ei6/BsAz4YJqvADa9G3atJLmBqBLIB29ITQUMGQpJV8u5kFSk1BYGYzSE3Tb71u2 yZ8lt83U1LkJV+Ptwfk2sGQbufiLMb56FafPqZqv0xYAaEyxW3sTZ7vYo4VzfFlhBXYy wPumqMKAXSxTsTAaG+tRxFnWJ7HacVx3fuQZAdysEjJYOrLtYDr4q9TcGRTZ6n8I38Lh KOvw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:robot-unsubscribe :robot-id:message-id:mime-version:references:in-reply-to:cc:subject :to:reply-to:sender:from:dkim-signature:dkim-signature:date; bh=OUG3m1MthjKXEiE4SPVuyCHw6+lmoAd7G/v5j8Qftu8=; b=tF1EC2UYXXxhqjZqA800OdwcgfbjAJWoX1MJk12DtLAYyvUYWN2ogtUBwsVAZbt3LY X9SpFvbLVM3Jv5ZRv2ibCeRvfdCZdRa3M7X+fLSYBkGEBHoNYNVHOpJb7zeAgZUOzG47 Gk4q/ZmJ08VKb4+5XX6eOqxKgwTPKbpgFBidpeHcbMrUM+5wjzG8iIBFkNqhH9iUHzi6 eI+FAKQYbK/h9yEUCYtUbtVMlAjwMDzd6XC8INE17PGmpshvVaGZ7yMFDXsEbj0ljcMu EbLXMCyWmS9dzHHYeACy7CrJXS2mNAFuwoDsUBDlobvVLjWruir4lvuXcUGozjSsSo9U elww== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=Dbyi0RuJ; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ls16-20020a17090b351000b001d2e910d225si6802886pjb.31.2022.04.27.11.52.28; Wed, 27 Apr 2022 11:52:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=Dbyi0RuJ; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229854AbiD0SrH (ORCPT + 99 others); Wed, 27 Apr 2022 14:47:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49290 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229887AbiD0SqG (ORCPT ); Wed, 27 Apr 2022 14:46:06 -0400 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C6E71D76D9; Wed, 27 Apr 2022 11:27:23 -0700 (PDT) Date: Wed, 27 Apr 2022 18:27:21 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1651084042; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OUG3m1MthjKXEiE4SPVuyCHw6+lmoAd7G/v5j8Qftu8=; b=Dbyi0RuJM0XNFqD2hauMyyG8Jy5E+PlwcDkaFvxguPzDnCFiuX3EmG2dfLk5Nfuf+QYNPp Yah/ZeVjhslvpNzzlez0B36jP/EGWFW3zBI7UV2MjVkGQSCoQI5mTwy+e+IYTpFw6A7vGo XqrrSoiCTEN4Z8ZFM9w1UqdakaubD3TI7+SUWbddIfVphPLtUj8/3coRK8xdgMhFbtHMTD 2jqI1JuyoitbPzXVopvWfWNcX88HjHS9uw7dDHgNOGI5T8uLje3NLzsAFNrPSmuH5gpBZH ckY6bLl9Ag/o4E5fdS3HROBRd1kR2eX39xJ84R+uDBc4dMQPXrWYNyvJRhfJFQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1651084042; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OUG3m1MthjKXEiE4SPVuyCHw6+lmoAd7G/v5j8Qftu8=; b=OqkrwVugFtSM1lA5lJHyFovK3ASTYWod6wREq7fBq3gbIE9NwpeCCOfggddQyjmkDrMFUH SR+X5D/tEEyLoQCA== From: "tip-bot2 for Thomas Gleixner" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: x86/cleanups] x86/aperfmperf: Replace arch_freq_get_on_cpu() Cc: Thomas Gleixner , Eric Dumazet , "Rafael J. Wysocki" , "Peter Zijlstra (Intel)" , "Paul E. McKenney" , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: <20220415161206.934040006@linutronix.de> References: <20220415161206.934040006@linutronix.de> MIME-Version: 1.0 Message-ID: <165108404119.4207.7430875005053093644.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The following commit has been merged into the x86/cleanups branch of tip: Commit-ID: f3eca381bd49d708073ba1a9af4fa6ea5d5810a6 Gitweb: https://git.kernel.org/tip/f3eca381bd49d708073ba1a9af4fa6ea5d5810a6 Author: Thomas Gleixner AuthorDate: Fri, 15 Apr 2022 21:20:04 +02:00 Committer: Thomas Gleixner CommitterDate: Wed, 27 Apr 2022 20:22:19 +02:00 x86/aperfmperf: Replace arch_freq_get_on_cpu() Reading the current CPU frequency from /sys/..../scaling_cur_freq involves in the worst case two IPIs due to the ad hoc sampling. The frequency invariance infrastructure provides the APERF/MPERF samples already. Utilize them and consolidate this with the /proc/cpuinfo readout. The sample is considered valid for 20ms. So for idle or isolated NOHZ full CPUs the function returns 0, which is matching the previous behaviour. The resulting text size vs. the original APERF/MPERF plus the separate frequency invariance code: text: 2411 -> 723 init.text: 0 -> 767 Signed-off-by: Thomas Gleixner Tested-by: Eric Dumazet Reviewed-by: Rafael J. Wysocki Acked-by: Peter Zijlstra (Intel) Acked-by: Paul E. McKenney Link: https://lore.kernel.org/r/20220415161206.934040006@linutronix.de --- arch/x86/kernel/cpu/aperfmperf.c | 94 +------------------------------- arch/x86/kernel/cpu/proc.c | 2 +- 2 files changed, 2 insertions(+), 94 deletions(-) diff --git a/arch/x86/kernel/cpu/aperfmperf.c b/arch/x86/kernel/cpu/aperfmperf.c index e9d2da7..b15c884 100644 --- a/arch/x86/kernel/cpu/aperfmperf.c +++ b/arch/x86/kernel/cpu/aperfmperf.c @@ -36,98 +36,6 @@ static DEFINE_PER_CPU_SHARED_ALIGNED(struct aperfmperf, cpu_samples) = { .seq = SEQCNT_ZERO(cpu_samples.seq) }; -struct aperfmperf_sample { - unsigned int khz; - atomic_t scfpending; - ktime_t time; - u64 aperf; - u64 mperf; -}; - -static DEFINE_PER_CPU(struct aperfmperf_sample, samples); - -#define APERFMPERF_CACHE_THRESHOLD_MS 10 -#define APERFMPERF_REFRESH_DELAY_MS 10 -#define APERFMPERF_STALE_THRESHOLD_MS 1000 - -/* - * aperfmperf_snapshot_khz() - * On the current CPU, snapshot APERF, MPERF, and jiffies - * unless we already did it within 10ms - * calculate kHz, save snapshot - */ -static void aperfmperf_snapshot_khz(void *dummy) -{ - u64 aperf, aperf_delta; - u64 mperf, mperf_delta; - struct aperfmperf_sample *s = this_cpu_ptr(&samples); - unsigned long flags; - - local_irq_save(flags); - rdmsrl(MSR_IA32_APERF, aperf); - rdmsrl(MSR_IA32_MPERF, mperf); - local_irq_restore(flags); - - aperf_delta = aperf - s->aperf; - mperf_delta = mperf - s->mperf; - - /* - * There is no architectural guarantee that MPERF - * increments faster than we can read it. - */ - if (mperf_delta == 0) - return; - - s->time = ktime_get(); - s->aperf = aperf; - s->mperf = mperf; - s->khz = div64_u64((cpu_khz * aperf_delta), mperf_delta); - atomic_set_release(&s->scfpending, 0); -} - -static bool aperfmperf_snapshot_cpu(int cpu, ktime_t now, bool wait) -{ - s64 time_delta = ktime_ms_delta(now, per_cpu(samples.time, cpu)); - struct aperfmperf_sample *s = per_cpu_ptr(&samples, cpu); - - /* Don't bother re-computing within the cache threshold time. */ - if (time_delta < APERFMPERF_CACHE_THRESHOLD_MS) - return true; - - if (!atomic_xchg(&s->scfpending, 1) || wait) - smp_call_function_single(cpu, aperfmperf_snapshot_khz, NULL, wait); - - /* Return false if the previous iteration was too long ago. */ - return time_delta <= APERFMPERF_STALE_THRESHOLD_MS; -} - -unsigned int arch_freq_get_on_cpu(int cpu) -{ - struct aperfmperf_sample *s = per_cpu_ptr(&samples, cpu); - - if (!cpu_khz) - return 0; - - if (!boot_cpu_has(X86_FEATURE_APERFMPERF)) - return 0; - - if (!housekeeping_cpu(cpu, HK_TYPE_MISC)) - return 0; - - if (rcu_is_idle_cpu(cpu)) - return 0; - - if (aperfmperf_snapshot_cpu(cpu, ktime_get(), true)) - return per_cpu(samples.khz, cpu); - - msleep(APERFMPERF_REFRESH_DELAY_MS); - atomic_set(&s->scfpending, 1); - smp_mb(); /* ->scfpending before smp_call_function_single(). */ - smp_call_function_single(cpu, aperfmperf_snapshot_khz, NULL, 1); - - return per_cpu(samples.khz, cpu); -} - static void init_counter_refs(void) { u64 aperf, mperf; @@ -494,7 +402,7 @@ void arch_scale_freq_tick(void) */ #define MAX_SAMPLE_AGE ((unsigned long)HZ / 50) -unsigned int aperfmperf_get_khz(int cpu) +unsigned int arch_freq_get_on_cpu(int cpu) { struct aperfmperf *s = per_cpu_ptr(&cpu_samples, cpu); unsigned long last; diff --git a/arch/x86/kernel/cpu/proc.c b/arch/x86/kernel/cpu/proc.c index 4eec888..0a0ee55 100644 --- a/arch/x86/kernel/cpu/proc.c +++ b/arch/x86/kernel/cpu/proc.c @@ -84,7 +84,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) seq_printf(m, "microcode\t: 0x%x\n", c->microcode); if (cpu_has(c, X86_FEATURE_TSC)) { - unsigned int freq = aperfmperf_get_khz(cpu); + unsigned int freq = arch_freq_get_on_cpu(cpu); if (!freq) freq = cpufreq_quick_get(cpu);