All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 00/10] Mitigation of "failed to load cpu:cpreg_vmstate_array_len" migration failures
@ 2025-12-22 13:39 Eric Auger
  2025-12-22 13:39 ` [PATCH v4 01/10] hw/arm/virt: Rename arm_virt_compat into arm_virt_compat_defaults Eric Auger
                   ` (10 more replies)
  0 siblings, 11 replies; 17+ messages in thread
From: Eric Auger @ 2025-12-22 13:39 UTC (permalink / raw)
  To: eric.auger.pro, eric.auger, qemu-devel, qemu-arm, peter.maydell,
	cohuck, maz, oliver.upton, sebott, gshan, ddutile, peterx, philmd,
	pbonzini

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

---

History:

v3 -> v4:
- Collected Connie's & Sebastian's R-bs
- Squashed patches 3 and 5
- various typos and rewording

v2 -> v3:
- revert target/arm: Reinstate bogus AArch32 DBGDTRTX register for migration compat
- fix some typos and rework target/arm/cpu.h hidden_regs comment (Connie)
- Even for TCG we use KVM index

v1 -> v2:
- fixed typos (Connie)
- Make it less KVM specific (tentative hidding of TCG regs, not
  tested)
- Tested DBGDTRTX TCG case reported by Peter
- No change to the property format yet. Ran out of idea. However
  I changed the name of the property with x-mig prefix
- Changed the terminology, kept hidding but remove fake which was
  confusing
- Simplified the logic for regs missing in the incoming stream and
  do not check anymore they are exposed on dest

Available at:
https://github.com/eauger/qemu/tree/mitig-v4


Eric Auger (10):
  hw/arm/virt: Rename arm_virt_compat into arm_virt_compat_defaults
  target/arm/machine: Improve traces on register mismatch during
    migration
  target/arm/cpu: Allow registers to be hidden
  target/arm/machine: Allow extra regs in the incoming stream
  kvm-all: Enforce hidden regs are never accessed
  target/arm/cpu: Implement hide_reg callback()
  target/arm/cpu: Expose x-mig-hidden-regs and x-mig-safe-missing-regs
    properties
  hw/arm/virt: Declare AArch32 DBGDTRTX as safe to ignore in incoming
    stream
  Revert "target/arm: Reinstate bogus AArch32 DBGDTRTX register for
    migration compat"
  hw/arm/virt: [DO NOT UPSTREAM] Enforce compatibility with older
    kernels

 include/hw/core/cpu.h     |  2 ++
 target/arm/cpu.h          | 48 +++++++++++++++++++++++++++
 accel/kvm/kvm-all.c       | 12 +++++++
 hw/arm/virt.c             | 42 +++++++++++++++++++----
 target/arm/cpu.c          | 11 ++++++
 target/arm/debug_helper.c | 29 ----------------
 target/arm/helper.c       | 12 ++++++-
 target/arm/kvm.c          | 35 +++++++++++++++++++-
 target/arm/machine.c      | 70 +++++++++++++++++++++++++++++++++++----
 target/arm/trace-events   | 10 ++++++
 10 files changed, 228 insertions(+), 43 deletions(-)

-- 
2.52.0



^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2026-01-07 17:19 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-22 13:39 [PATCH v4 00/10] Mitigation of "failed to load cpu:cpreg_vmstate_array_len" migration failures Eric Auger
2025-12-22 13:39 ` [PATCH v4 01/10] hw/arm/virt: Rename arm_virt_compat into arm_virt_compat_defaults Eric Auger
2025-12-22 13:39 ` [PATCH v4 02/10] target/arm/machine: Improve traces on register mismatch during migration Eric Auger
2025-12-22 13:40 ` [PATCH v4 03/10] target/arm/cpu: Allow registers to be hidden Eric Auger
2025-12-23 14:24   ` Cornelia Huck
2025-12-22 13:40 ` [PATCH v4 04/10] target/arm/machine: Allow extra regs in the incoming stream Eric Auger
2025-12-22 13:40 ` [PATCH v4 05/10] kvm-all: Enforce hidden regs are never accessed Eric Auger
2025-12-22 13:40 ` [PATCH v4 06/10] target/arm/cpu: Implement hide_reg callback() Eric Auger
2025-12-22 13:40 ` [PATCH v4 07/10] target/arm/cpu: Expose x-mig-hidden-regs and x-mig-safe-missing-regs properties Eric Auger
2025-12-23 14:27   ` Cornelia Huck
2025-12-22 13:40 ` [PATCH v4 08/10] hw/arm/virt: Declare AArch32 DBGDTRTX as safe to ignore in incoming stream Eric Auger
2025-12-23 14:30   ` Cornelia Huck
2026-01-07 17:18     ` Eric Auger
2025-12-22 13:40 ` [PATCH v4 09/10] Revert "target/arm: Reinstate bogus AArch32 DBGDTRTX register for migration compat" Eric Auger
2025-12-22 13:40 ` [PATCH v4 10/10] hw/arm/virt: [DO NOT UPSTREAM] Enforce compatibility with older kernels Eric Auger
2026-01-07 15:02 ` [PATCH v4 00/10] Mitigation of "failed to load cpu:cpreg_vmstate_array_len" migration failures Sebastian Ott
2026-01-07 17:17   ` Eric Auger

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.