From: Sean Christopherson <seanjc@google.com>
To: Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
x86@kernel.org, Sean Christopherson <seanjc@google.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Zimmermann <tzimmermann@suse.de>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
dri-devel@lists.freedesktop.org,
Kevin Loughlin <kevinloughlin@google.com>,
Tom Lendacky <thomas.lendacky@amd.com>,
Kai Huang <kai.huang@intel.com>, Ingo Molnar <mingo@kernel.org>,
Zheyun Shen <szy0127@sjtu.edu.cn>,
Mingwei Zhang <mizhang@google.com>,
Francesco Lavra <francescolavra.fl@gmail.com>
Subject: [PATCH v3 4/8] x86, lib: Add wbinvd and wbnoinvd helpers to target multiple CPUs
Date: Thu, 22 May 2025 16:37:28 -0700 [thread overview]
Message-ID: <20250522233733.3176144-5-seanjc@google.com> (raw)
In-Reply-To: <20250522233733.3176144-1-seanjc@google.com>
From: Zheyun Shen <szy0127@sjtu.edu.cn>
Extract KVM's open-coded calls to do writeback caches on multiple CPUs to
common library helpers for both WBINVD and WBNOINVD (KVM will use both).
Put the onus on the caller to check for a non-empty mask to simplify the
SMP=n implementation, e.g. so that it doesn't need to check that the one
and only CPU in the system is present in the mask.
Signed-off-by: Zheyun Shen <szy0127@sjtu.edu.cn>
Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
Link: https://lore.kernel.org/r/20250128015345.7929-2-szy0127@sjtu.edu.cn
[sean: move to lib, add SMP=n helpers, clarify usage]
Acked-by: Kai Huang <kai.huang@intel.com>
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
arch/x86/include/asm/smp.h | 12 ++++++++++++
arch/x86/kvm/x86.c | 3 +--
arch/x86/lib/cache-smp.c | 12 ++++++++++++
3 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h
index e08f1ae25401..22bfebe6776d 100644
--- a/arch/x86/include/asm/smp.h
+++ b/arch/x86/include/asm/smp.h
@@ -113,7 +113,9 @@ void native_play_dead(void);
void play_dead_common(void);
void wbinvd_on_cpu(int cpu);
void wbinvd_on_all_cpus(void);
+void wbinvd_on_cpus_mask(struct cpumask *cpus);
void wbnoinvd_on_all_cpus(void);
+void wbnoinvd_on_cpus_mask(struct cpumask *cpus);
void smp_kick_mwait_play_dead(void);
void __noreturn mwait_play_dead(unsigned int eax_hint);
@@ -154,11 +156,21 @@ static inline void wbinvd_on_all_cpus(void)
wbinvd();
}
+static inline void wbinvd_on_cpus_mask(struct cpumask *cpus)
+{
+ wbinvd();
+}
+
static inline void wbnoinvd_on_all_cpus(void)
{
wbnoinvd();
}
+static inline void wbnoinvd_on_cpus_mask(struct cpumask *cpus)
+{
+ wbnoinvd();
+}
+
static inline struct cpumask *cpu_llc_shared_mask(int cpu)
{
return (struct cpumask *)cpumask_of(0);
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index be7bb6d20129..1d0e9180148d 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -8245,8 +8245,7 @@ static int kvm_emulate_wbinvd_noskip(struct kvm_vcpu *vcpu)
int cpu = get_cpu();
cpumask_set_cpu(cpu, vcpu->arch.wbinvd_dirty_mask);
- on_each_cpu_mask(vcpu->arch.wbinvd_dirty_mask,
- wbinvd_ipi, NULL, 1);
+ wbinvd_on_cpus_mask(vcpu->arch.wbinvd_dirty_mask);
put_cpu();
cpumask_clear(vcpu->arch.wbinvd_dirty_mask);
} else
diff --git a/arch/x86/lib/cache-smp.c b/arch/x86/lib/cache-smp.c
index 1789db5d8825..b45e8baa69bb 100644
--- a/arch/x86/lib/cache-smp.c
+++ b/arch/x86/lib/cache-smp.c
@@ -20,6 +20,12 @@ void wbinvd_on_all_cpus(void)
}
EXPORT_SYMBOL(wbinvd_on_all_cpus);
+void wbinvd_on_cpus_mask(struct cpumask *cpus)
+{
+ on_each_cpu_mask(cpus, __wbinvd, NULL, 1);
+}
+EXPORT_SYMBOL_GPL(wbinvd_on_cpus_mask);
+
static void __wbnoinvd(void *dummy)
{
wbnoinvd();
@@ -30,3 +36,9 @@ void wbnoinvd_on_all_cpus(void)
on_each_cpu(__wbnoinvd, NULL, 1);
}
EXPORT_SYMBOL(wbnoinvd_on_all_cpus);
+
+void wbnoinvd_on_cpus_mask(struct cpumask *cpus)
+{
+ on_each_cpu_mask(cpus, __wbnoinvd, NULL, 1);
+}
+EXPORT_SYMBOL_GPL(wbnoinvd_on_cpus_mask);
--
2.49.0.1151.ga128411c76-goog
next prev parent reply other threads:[~2025-05-22 23:37 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-22 23:37 [PATCH v3 0/8] x86, KVM: Optimize SEV cache flushing Sean Christopherson
2025-05-22 23:37 ` [PATCH v3 1/8] drm/gpu: Remove dead checks on wbinvd_on_all_cpus()'s return value Sean Christopherson
2025-07-10 14:47 ` [tip: x86/core] " tip-bot2 for Sean Christopherson
2025-07-11 8:52 ` [PATCH v3 1/8] " Simona Vetter
2025-05-22 23:37 ` [PATCH v3 2/8] x86, lib: Drop the unused return value from wbinvd_on_all_cpus() Sean Christopherson
2025-07-10 14:47 ` [tip: x86/core] x86/lib: " tip-bot2 for Sean Christopherson
2025-05-22 23:37 ` [PATCH v3 3/8] x86, lib: Add WBNOINVD helper functions Sean Christopherson
2025-07-10 11:29 ` Borislav Petkov
2025-07-10 13:56 ` Sean Christopherson
2025-07-10 14:38 ` Borislav Petkov
2025-07-10 14:37 ` Peter Zijlstra
2025-07-10 15:47 ` Peter Zijlstra
2025-07-10 15:55 ` Sean Christopherson
2025-07-10 15:58 ` Peter Zijlstra
2025-07-11 8:51 ` Simona Vetter
2025-07-11 8:52 ` Peter Zijlstra
2025-07-10 14:47 ` [tip: x86/core] x86/lib: " tip-bot2 for Kevin Loughlin
2025-05-22 23:37 ` Sean Christopherson [this message]
2025-07-10 14:47 ` [tip: x86/core] x86/lib: Add WBINVD and WBNOINVD helpers to target multiple CPUs tip-bot2 for Zheyun Shen
2025-05-22 23:37 ` [PATCH v3 5/8] KVM: x86: Use wbinvd_on_cpu() instead of an open-coded equivalent Sean Christopherson
2025-05-22 23:37 ` [PATCH v3 6/8] KVM: SVM: Remove wbinvd in sev_vm_destroy() Sean Christopherson
2025-05-22 23:37 ` [PATCH v3 7/8] KVM: SEV: Prefer WBNOINVD over WBINVD for cache maintenance efficiency Sean Christopherson
2025-05-22 23:37 ` [PATCH v3 8/8] KVM: SVM: Flush cache only on CPUs running SEV guest Sean Christopherson
2025-07-09 16:25 ` [PATCH v3 0/8] x86, KVM: Optimize SEV cache flushing Sean Christopherson
2025-07-09 18:57 ` Borislav Petkov
2025-07-09 21:36 ` Sean Christopherson
2025-07-10 23:08 ` Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250522233733.3176144-5-seanjc@google.com \
--to=seanjc@google.com \
--cc=airlied@gmail.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=francescolavra.fl@gmail.com \
--cc=kai.huang@intel.com \
--cc=kevinloughlin@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mingo@kernel.org \
--cc=mingo@redhat.com \
--cc=mizhang@google.com \
--cc=mripard@kernel.org \
--cc=pbonzini@redhat.com \
--cc=simona@ffwll.ch \
--cc=szy0127@sjtu.edu.cn \
--cc=tglx@linutronix.de \
--cc=thomas.lendacky@amd.com \
--cc=tzimmermann@suse.de \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®