Hi Sebastian,
On 1/7/26 4:02 PM, Sebastian Ott wrote:
> Hey Eric,
>
> On Mon, 22 Dec 2025, Eric Auger wrote:
>> When migrating ARM guests accross same machines with different host
>> kernels we are likely to encounter failures such as:
>>
>> "failed to load cpu:cpreg_vmstate_array_len"
>>
>> This is due to the fact KVM exposes a different number of registers
>> to qemu on source and destination. When trying to migrate a bigger
>> register set to a smaller one, qemu cannot save the CPU state.
>>
>> For example, recently we faced such kind of situations with:
>> - unconditionnal exposure of KVM_REG_ARM_VENDOR_HYP_BMAP_2 FW pseudo
>> register from v6.16 onwards. Causes backward migration failure.
>> - removal of unconditionnal exposure of TCR2_EL1, PIRE0_EL1, PIR_EL1
>> from v6.13 onwards. Causes forward migration failure.
>>
>> This situation is really problematic for distributions which want to
>> guarantee forward and backward migration of a given machine type
>> between different releases.
>>
>> While the series mainly targets KVM acceleration, this problem
>> also exists with TCG. For instance some registers may be exposed
>> while they shouldn't. Then it is tricky to fix that situation
>> without breaking forward migration. An example was provided by
>> Peter: 4f2b82f60 ("target/arm: Reinstate bogus AArch32 DBGDTRTX
>> register for migration compat).
>>
>> This series introduces 2 CPU array properties that list
>> - the CPU registers to hide from the exposes sysregs (aims
>> at removing registers from the destination)
>> - The CPU registers that may not exist but which can be found
>> in the incoming migration stream (aims at ignoring extra
>> registers in the incoming state)
>>
>> An example is given to illustrate how those props
>> could be used to apply compats for machine types supposed to "see" the
>> same register set accross various host kernels.
>>
>> Mitigation of DBGDTRTX issue would be achived by setting
>> x-mig-safe-missing-regs=0x40200000200e0298 which matches
>> AArch32 DBGDTRTX register index.
>>
>> The first patch improves the tracing so that we can quickly detect
>> which registers do not match between the incoming stream and the
>> exposed sysregs
>>
>
> I've played around with these and for virt-10.1 I get:
> ./build/qemu-system-aarch64 -M virt-10.1 [...]
> Unexpected error in set_prop_array() at ../hw/core/qdev-properties.c:717:
> qemu-system-aarch64: can't apply global
> arm-cpu.x-mig-safe-missing-regs=0x603000000013c103,
> 0x603000000013c512, 0x603000000013c513: array size property
> x-mig-safe-missing-regs may not be set more than once
> Aborted (core dumped)
>
> Is it possible to aggregate these, when there are compats at more than
> one level?
Thank you for testing!
The problem relates to my last patch (not to be upstreamed) that leads
x-mig-safe-missing-regs to be set twice.
virt_machine_10_1_options() calls virt_machine_10_2_options which sets
x-mig-safe-missing-regs to DBGDTRTX first (through arm_virt_compat_10_2
compat) and then sets it in virt_machine_10_1_options() to "TCE_EL1,
PIRE0_EL1, PIR_EL1 " (through arm_virt_kernel_compat_10_1). Effectively
this cannot be aggregated that way.
I need to rework that example.
Thanks
Eric
>
> Sebastian
>