From: Alejandro Vallejo <alejandro.garciavallejo@amd.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: "Andrew Cooper" <andrew.cooper3@citrix.com>,
"Roger Pau Monné" <roger.pau@citrix.com>,
"Jason Andryuk" <jason.andryuk@amd.com>,
xen-devel@lists.xenproject.org
Subject: Re: [PATCH 00/12] const-ify vendor checks
Date: Mon, 9 Feb 2026 12:56:52 +0100 [thread overview]
Message-ID: <DGAEV1NFZF2A.2ATDMEFZAIZ5S@amd.com> (raw)
In-Reply-To: <836c1ef7-4ec3-4c4a-b527-17066327ff19@suse.com>
On Mon Feb 9, 2026 at 11:15 AM CET, Jan Beulich wrote:
> On 09.02.2026 11:05, Alejandro Vallejo wrote:
>> On Mon Feb 9, 2026 at 10:21 AM CET, Jan Beulich wrote:
>>> On 06.02.2026 17:15, Alejandro Vallejo wrote:
>>>> High level description
>>>> ======================
>>>>
>>>> When compared to the RFC this makes a different approach The series introduces
>>>> cpu_vendor() which maps to a constant in the single vendor case and to
>>>> (boot_cpu_data.vendor & X86_ENABLED_VENDORS), where X86_ENABLED_VENDORS is a
>>>> mask of the compile-time chosen vendors. This enables the compiler to detect
>>>> dead-code at the uses and remove all unreachable branches, including in
>>>> switches.
>>>>
>>>> When compared to the x86_vendor_is() macro introduced in the RFC, this is
>>>> simpler. It achieves MOST of what the older macro did without touching the
>>>> switches, with a few caveats:
>>>>
>>>> 1. Compiled-out vendors cause a panic, they don't fallback onto the unknown
>>>> vendor case. In retrospect, this is a much saner thing to do.
>>>
>>> I'm unconvinced here. Especially our Centaur and Shanghai support is at best
>>> rudimentary. Treating those worse when configured-out than when configured-in
>>> feels questionable.
>>
>> Isn't that the point of configuring out?
>
> That's what I'm unsure about.
I'm really missing what you're trying to make, sorry. How, if at all, is it
helpful for a hypervisor with a compiled out vendor to be bootable on a machine
of that vendor?
>
>> Besides the philosophical matter of whether or not a compiled-out vendor
>> should be allowed to run there's the more practical matter of what to do
>> with the x86_vendor field of boot_cpu_data. Because at that point our take
>> that cross-vendor support is forbidden is a lot weaker. If I can run an
>> AMD-hypervisor on an Intel host, what then? What policies would be allowed? If I
>> wipe x86_vendor then policies with some unknown vendor would be fine. Should the
>> leaves match too? If I do not wipe the field, should I do black magic to ensure
>> the behaviour is different depending on whether the vendor is compiled in or
>> not? What if I want to migrate a VM currently running in this hypothetical
>> hypervisor? The rules becomes seriously complex.
>>
>> It's just a lot cleaner to take the stance that compiled out vendors can't run.
>> Then everything else is crystal clear and we avoid a universe's worth of corner
>> cases. I expect upstream Xen to support all cases (I'm skeptical about the
>> utility of the unknown vendor path, but oh well), but many downstreams might
>> benefit from killing off support for vendors they really will never touch.
>
> To them, will panic()ing (or not) make a difference?
One would hope not because the're compiling them out for a reason.
But for upstream, not panicking brings a sea of corner cases. The ones I
mentioned above is not the whole list.
Turning the question around. Who benefits from not panicking?
>
>>>> 2. equalities and inequalities have been replaced by equivalent (cpu_vendor() & ...)
>>>> forms. This isn't stylistic preference. This form allows the compiler
>>>> to merge the compared-against constant with X86_ENABLED_VENDORS, yielding
>>>> much better codegen throughout the tree.
>>>>
>>>> The effect of (2) triples the delta in the full build below.
>>>>
>>>> Some differences might be attributable to the change from policy vendor checks
>>>> to boot_cpu_data. In the case of the emulator it caused a 400 bytes increase
>>>> due to the way it checks using LOTS of macro invocations, so I left that one
>>>> piece using the policy vendor except for the single vendor case.
>>>
>>> For the emulator I'd like to point out this question that I raised in the
>>> AVX10 series:
>>
>> There's no optimisation shortage for the emulator. For that patch I just
>> ensure I didn't make a tricky situation worse. It is much better in the single-vendor case.
>>
>>> "Since it'll be reducing code size, we may want to further convert
>>> host_and_vcpu_must_have() to just vcpu_must_have() where appropriate
>>> (should be [almost?] everywhere)."
>>>
>>> Sadly there was no feedback an that (or really on almost all of that work) at
>>> all so far.
>>
>> It sounds fairly orthogonal to this, unless I'm missing the point.
>
> It's largely orthogonal, except that if we had gone that route already, your
> codegen diff might look somewhat different.
>
>> In principle that would be fine. the vCPU features whose emulation requires
>> special instructions are most definitely a subset of those of the host anyway.
>>
>> I agree many cases could be simplified as you describe.
>>
>> I do see a worrying danger of XSA should the max policy ever exceed the
>> capabilities of the host on a feature required for emulating some instruction
>> for that very feature. Then the guest could abuse the emulator to trigger #UD
>> inside the hypervisor's emulation path.
>
> Well, that max-policy related question is why I've raised the point, rather
> than making (more) patches right away.
All jmp_rel() macros have amd_like() inside, and other checks are open-coded
in many places. The problem is that offsets into the policy pointer (which
is stored in a register) end up being global accesses to an offset from a
non-register-cached 64bit address. And that adds up. having an amd_like boolean
in the ctxt would've helped, but I went for the least intrusive solution.
I'm not sure how what you brought up would've helped for this particular codegen
matter.
Cheers,
Alejandro
next prev parent reply other threads:[~2026-02-09 11:57 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-06 16:15 [PATCH 00/12] const-ify vendor checks Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 01/12] x86: Reject CPU policies with vendors other than the host's Alejandro Vallejo
2026-02-10 8:19 ` Roger Pau Monné
2026-02-10 10:11 ` Alejandro Vallejo
2026-02-11 15:41 ` Jan Beulich
2026-02-11 17:41 ` Alejandro Vallejo
2026-02-12 7:16 ` Jan Beulich
2026-02-06 16:15 ` [PATCH 02/12] x86: Add more granularity to the vendors in Kconfig Alejandro Vallejo
2026-02-10 8:26 ` Roger Pau Monné
2026-02-10 10:04 ` Alejandro Vallejo
2026-02-11 16:06 ` Jan Beulich
2026-02-11 17:51 ` Alejandro Vallejo
2026-02-12 7:24 ` Jan Beulich
2026-02-06 16:15 ` [PATCH 03/12] x86: Add cpu_vendor() as a wrapper for the host's CPU vendor Alejandro Vallejo
2026-02-10 8:46 ` Roger Pau Monné
2026-02-10 10:35 ` Alejandro Vallejo
2026-02-10 12:06 ` Roger Pau Monné
2026-02-11 16:04 ` Jan Beulich
2026-02-11 17:35 ` Alejandro Vallejo
2026-02-11 17:57 ` Alejandro Vallejo
2026-02-12 10:52 ` Jan Beulich
2026-02-12 14:36 ` Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 04/12] x86: Migrate MSR handler vendor checks to cpu_vendor() Alejandro Vallejo
2026-02-11 16:15 ` Jan Beulich
2026-02-06 16:15 ` [PATCH 05/12] x86: Migrate spec_ctrl " Alejandro Vallejo
2026-02-12 10:49 ` Jan Beulich
2026-02-12 14:55 ` Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 06/12] x86: Migrate switch " Alejandro Vallejo
2026-02-12 11:06 ` Jan Beulich
2026-02-12 15:06 ` Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 07/12] x86: Have x86_emulate/ implement the single-vendor optimisation Alejandro Vallejo
2026-02-12 11:26 ` Jan Beulich
2026-02-12 15:29 ` Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 07/12] x86: Migrate x86_emulate/ to use cpu_vendor() Alejandro Vallejo
2026-02-12 11:31 ` Jan Beulich
2026-02-12 15:30 ` Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 08/12] x86/acpi: Migrate vendor checks to cpu_vendor() Alejandro Vallejo
2026-02-12 11:52 ` Jan Beulich
2026-02-12 15:34 ` Alejandro Vallejo
2026-02-12 15:52 ` Jan Beulich
2026-02-06 16:15 ` [PATCH 09/12] x86/pv: " Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 10/12] x86/mcheck: Migrate vendor checks to use cpu_vendor() Alejandro Vallejo
2026-02-12 12:02 ` Jan Beulich
2026-02-12 12:21 ` Jan Beulich
2026-02-12 15:46 ` Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 11/12] x86/cpu: " Alejandro Vallejo
2026-02-12 13:17 ` Jan Beulich
2026-02-06 16:15 ` [PATCH 12/12] x86: Migrate every remaining raw vendor check to cpu_vendor() Alejandro Vallejo
2026-02-12 13:29 ` Jan Beulich
2026-02-09 9:21 ` [PATCH 00/12] const-ify vendor checks Jan Beulich
2026-02-09 10:05 ` Alejandro Vallejo
2026-02-09 10:15 ` Jan Beulich
2026-02-09 11:56 ` Alejandro Vallejo [this message]
2026-02-09 12:52 ` Jan Beulich
2026-02-09 14:37 ` Alejandro Vallejo
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=DGAEV1NFZF2A.2ATDMEFZAIZ5S@amd.com \
--to=alejandro.garciavallejo@amd.com \
--cc=andrew.cooper3@citrix.com \
--cc=jason.andryuk@amd.com \
--cc=jbeulich@suse.com \
--cc=roger.pau@citrix.com \
--cc=xen-devel@lists.xenproject.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.