Zhao Liu <zhao1....@intel.com> writes: > On Wed, May 07, 2025 at 05:11:39PM +0200, Markus Armbruster wrote: >> Date: Wed, 07 May 2025 17:11:39 +0200 >> From: Markus Armbruster <arm...@redhat.com> >> Subject: Re: KVM/QEMU Community call 29/04/2025 agenda items? >> >> Philippe Mathieu-Daudé <phi...@linaro.org> writes: >> >> > On 30/4/25 12:41, Markus Armbruster wrote: >> >> [...] >> >> >> Pierrick's stated goal is to have no noticable differences between the >> >> single binary and the qemu-system-<target> it covers. >> >> >> >> We have two external interfaces to worry about: QMP and the command >> >> line. Let's ignore the latter for now. >> >> >> >> Target-specific differences in *syntax* come from QAPI schema >> >> conditionals with target-specific conditions. Example: >> >> >> >> { 'command': 'query-cpu-definitions', 'returns': >> >> ['CpuDefinitionInfo'], >> >> 'if': { 'any': [ 'TARGET_PPC', >> >> 'TARGET_ARM', >> >> 'TARGET_I386', >> >> 'TARGET_S390X', >> >> 'TARGET_MIPS', >> >> 'TARGET_LOONGARCH64', >> >> 'TARGET_RISCV' ] } } >> >> >> >> This command is only defined for some targets. >> >> >> >> The value of query-qmp-schema reflects this: it has >> >> query-cpu-definitions exactly when the condition is satisfied. The >> >> condition is evaluated at compile-time, because that's how QAPI schema >> >> 'if' works. >> >> >> >> Say we drop the condition and instead add an equivalent run-time >> >> condition to command registration. This preserves behavior of command >> >> execution. But query-qmp-schema now has query-cpu-definitions *always*. >> >> This is a noticable difference. It may break management applications >> >> that use query-qmp-schema to probe for the command. >> >> >> >> Moreover, conditionals aren't limited to commands. Example: >> >> >> >> { 'struct': 'CpuModelExpansionInfo', >> >> 'data': { 'model': 'CpuModelInfo', >> >> 'deprecated-props' : { 'type': ['str'], >> >> ---> 'if': 'TARGET_S390X' } }, >> >> 'if': { 'any': [ 'TARGET_S390X', >> >> 'TARGET_I386', >> >> 'TARGET_ARM', >> >> 'TARGET_LOONGARCH64', >> >> 'TARGET_RISCV' ] } } >> >> >> >> Here we have a conditional member. >> >> [...] >> >> > IMHO conditionals should only depend on host / static configuration >> > features, not features modifiable from the command line. >> >> This is how the QAPI schema works now. >> >> > (I'm always >> > confused by KVM features published in the schema, but then you start >> > your binary with -accel=tcg and still can run KVM specific commands >> > via QMP, returning errors). >> >> Not exactly a ringing endorsement for keeping the QAPI schema work the >> way it does now, isn't it? ;) >> >> The problem at hand is QAPI-generated files in a single binary. >> >> Pierrick posted "[RFC PATCH 0/3] single-binary: make QAPI generated >> files common". The patches are flawed, but that's alright for RFC. >> >> In review, I pointed out three possible solutions, and discussed their >> pros and cons: >> >> (1) Drop target-specific conditionals. >> >> (2) Replace them by run-time checks. >> >> (3) Have target-specific QAPI-generated code for multiple targets >> coexist in the single binary. > > Thank you Markus for your nice summary! I also apologize to you and > Philippe if I didn't understand correctly (I tried to look at > Pierrick's and Philippe's work, but still worry about I may have wrong > understanding :-) ) > >> Both (1) and (3) keep the QAPI schema work as it does now. >> >> Pierrick's patches are an incomplete attempt at (2). > > I see. > >> Daniel made a case for (1). You and I actually discussed (1) before, >> and I encouraged you to explore it. > > And I notice Philippe has 2 patches: > > (1) For QAPI, this is to drop target-specific cond: > > https://lore.kernel.org/qemu-devel/20250429100419.20427-1-phi...@linaro.org/ > > I feel it's a smart way to make it optional. > > (2) Not for QAPI, but this is try to add runtime check: > > https://lore.kernel.org/qemu-devel/20250502214551.80401-5-phi...@linaro.org/ > > I am thinking about how kvm-pmu-filter could be aligned with these > current efforts in mail list. > > I can drop all the target conditions for KvmPmuEventFormat: > > { 'enum': 'KvmPmuEventFormat', > 'data': ['raw', 'x86-select-umask', 'x86-masked-entry'] }
This is what you need to do if we pick solution (1). > This is what you listed before and it is similar to the way in (1). But > only (1) is not enough because I can't make these formats as optional > (pls educate me if I'm wrong :-) ). > > Therefore, I think I need run-time check like Philippe did in (2), in > my kvm-pmu.c file. Do you think so? In general, not just for your KVM PMU filter work: dropping target-specific conditionals makes the formerly conditional things exist for targets where they didn't exist before. This commonly breaks the build for these targets. To fix a target's build, we can either implement things for the target, or make attempts to use them fail cleanly. > An additional question - about CONFIG_KVM - is that I see that it's all > currently focused on solving target-specific problems, and I understand > that it's not yet kvm-specific's turn. > > But kvm-pmu-filter does (or, may :-) ) need CONFIG_KVM. My initial > thought is, is it possible to remove the CONFIG_KVM condition for > kvm-pmu-filter in QAPI and use the same runtime check? But this would > require accel-info as Philippe's work on target-info in [2]). I'm afraid I don't understand your question. >> We can certainly discuss this some more, but I'd prefer to review a >> working solution instead. > > With so many options on the table, I'm a bit confused about the fate of > kvm-pmu-filter. Should this case wait for the most appropriate option to > come along, or could it move forward based on the status quo, and then > consider the refactoring later with the final optimal option? Up to you. We'll hopefully reach consensus fairly soon. You might want to wait a few days for that.