[PATCH v2 4/8] x86, lib: Add WBNOINVD helper functions
Ingo Molnar
mingo at kernel.org
Tue May 20 09:41:24 UTC 2025
* Sean Christopherson <seanjc at google.com> wrote:
> > and to point out that the 'invalidate' part of the WBNOINVD name is
> > a misnomer, as it doesn't invalidate anything, it only writes back
> > dirty cachelines.
>
> I wouldn't call it a misnomer, the NO part makes it semantically
> accurate.
If only 'NO' in that context was unambiguous: initially I fully read it
as some sort of acronym or abbreviation :) Why wasn't it named WBCACHE
or so? But I digress.
> [...] I actually think the mnemonic was well chosen, as it helps
> capture the relationships and behaviors of INVD, WBINVD, and
> WBNOINVD.
>
> How about this?
Much better!
> +/*
> + * Write back all modified lines in all levels of cache associated with this
> + * logical processor to main memory, and then invalidate all caches. Depending
> + * on the micro-architecture, WBINVD (and WBNOINVD below) may or may not affect
> + * lower level caches associated with another logical processor that shares any
> + * level of this processor’s cache hierarchy.
> + *
> + * Note, AMD CPUs enumerate the behavior or WB{NO}{INVD} with respect to other
> + * logical, non-originating processors in CPUID 0x8000001D.EAX[N:0].
> + */
> static __always_inline void wbinvd(void)
> {
> + asm volatile("wbinvd" : : : "memory");
> +}
> +
> +/* Instruction encoding provided for binutils backwards compatibility. */
> +#define ASM_WBNOINVD _ASM_BYTES(0xf3,0x0f,0x09)
> +
> +/*
> + * Write back all modified lines in all levels of cache associated with this
> + * logical processor to main memory, but do NOT explicitly invalidate caches,
> + * i.e. leave all/most cache lines in the hierarchy in non-modified state.
> + */
> +static __always_inline void wbnoinvd(void)
> +{
> + /*
> + * Explicitly encode WBINVD if X86_FEATURE_WBNOINVD is unavailable even
> + * though WBNOINVD is backwards compatible (it's simply WBINVD with an
> + * ignored REP prefix), to guarantee that WBNOINVD isn't used if it
> + * needs to be avoided for any reason. For all supported usage in the
> + * kernel, WBINVD is functionally a superset of WBNOINVD.
> + */
> + alternative("wbinvd", ASM_WBNOINVD, X86_FEATURE_WBNOINVD);
> }
Acked-by: Ingo Molnar <mingo at kernel.org>
Thanks,
Ingo
More information about the dri-devel
mailing list