> On 10 Mar 2026, at 2:38 PM, Misbah Anjum N <[email protected]> wrote:
>
> On 2026-03-10 14:24, Ani Sinha wrote:
>>> On 10 Mar 2026, at 2:09 PM, Misbah Anjum N <[email protected]> wrote:
>>> Hi Ani and Paolo,
>>> We have tested the code by applying both the original commit
>>> (98884e0cc10997a17ce9abfd6ff10be19224ca6a) and your fix patch (commit
>>> 9e5a6945181d4c1fce7f8438e1b6213f1eb79c14) on ppc64le.
>>> However, the issue persists. We've conducted GDB debugging that shows the
>>> hang is occurring in a different location than what the fix addresses.
>>> Since the original patch is breaking KVM guest bringup completely on
>>> ppc64le, and the fix patch does not resolve the issue, given the severity
>>> of this regression (complete KVM breakage on ppc64le), we should either
>>> find a quick fix or consider reverting the patch until a proper solution
>>> can be identified.
>> Based on what you just described, it does not seem like the issue is
>> related to 98884e0cc10997a17ce9abfd6ff10be19224ca6a at all. If you
>> revert this patch in your local tree, can you confirm that your issue
>> gets fixed?
>
> Yes, the issue is not seen with the immediate previous commit:
>
> commit df8df3cb6b743372ebb335bd8404bc3d748da350 (ani-df8df3cb)
> Author: Ani Sinha <[email protected]>
> Date: Wed Feb 25 09:19:09 2026 +0530
>
> system/physmem: add helper to reattach existing memory after KVM VM fd
> change
>
> After the guest KVM file descriptor has changed as a part of the process of
> confidential guest reset mechanism, existing memory needs to be reattached
> to
> the new file descriptor. This change adds a helper function
> ram_block_rebind()
> for this purpose. The next patch will make use of this function.
>
> Signed-off-by: Ani Sinha <[email protected]>
> Link: https://lore.kernel.org/r/[email protected]
> Signed-off-by: Paolo Bonzini <[email protected]>
>
> Looks like the next patch is enabling the functionality of the previous
> patches in such a way which causes bql_lock() to get stuck on architectures
> (ppc64le in this case) which does not support this feature yet.
This theory is not substantiated by code or evidence.
98884e0cc10997a17ce9abfd6ff10be19224ca6a introduces kvm_reset_vmfd() which is
called by this block of code with the tip at
98884e0cc10997a17ce9abfd6ff10be19224ca6a :
if (!cpus_are_resettable() &&
(reason == SHUTDOWN_CAUSE_GUEST_RESET ||
reason == SHUTDOWN_CAUSE_HOST_QMP_SYSTEM_RESET)) {
if (ac->rebuild_guest) {
ret = ac->rebuild_guest(current_machine);
if (ret < 0) {
error_report("unable to rebuild guest: %s(%d)",
strerror(-ret), ret);
vm_stop(RUN_STATE_INTERNAL_ERROR);
} else {
info_report("virtual machine state has been rebuilt with new "
"guest file handle.");
guest_state_rebuilt = true;
}
} else if (!cpus_are_resettable()) {
error_report("accelerator does not support reset!");
} else {
error_report("accelerator does not support rebuilding guest state,"
" proceeding with normal reset!");
}
}
If cpus are resettable, this block will not be called and nothing that the
patch introduces will have been executed.
So I think you guys need to explain a bit more why you so strongly feel this
patch broke it. I am confused and unable to reason this.
>
> Did you validate your patches on other architectures which does not support
> this feature yet?
As you have already seen, on other architectures, the entire block of code is
not executed at all. Only SEV-ES, SEV-SNP and TDX currently exercises this.
>
>>> Analysis:
>>> 1. This is not a confidential guest. This is a regular KVM guest running on
>>> ppc64le.
>>> 2. The execution flow shows that qemu_system_reset() completes successfully
>>> and never enters the code path at line 529-543
>> This is what I expected and therefore, no code related to coco guest
>> rebuilding is getting executed. Your issue seems to be somewhere else.
>
> The issue occurs only with the introduction of this patch and not with the
> previous upstream commit as explained above.
>
>>> 3. The hang occurs later in qemu_default_main() at system/main.c:49, after
>>> calling bql_lock()
>>> 4. The ppc KVM guest boots fine with the previous commit -
>>> df8df3cb6b743372ebb335bd8404bc3d748da350
>>> 5. This suggests the issue is not with error handling of -EOPNOTSUPP during
>>> reset, but bql_lock() getting stuck in qemu_default_main()
>>> GDB Trace Analysis:
>>> We set breakpoints at qemu_system_reset() and qemu_default_main() to trace
>>> the execution flow. The system successfully completes qemu_system_reset()
>>> without entering the problematic code path where the fix provided by you
>>> applies (system/runstate.c:529-543).
>>> # gdb --args /usr/bin/qemu-system-ppc64 -name avocado-vt-vm1 -machine
>>> pseries,accel=kvm -enable-kvm -m 32768 -smp 32,sockets=1,cores=32,threads=1
>>> -nographic -serial pty -device virtio-balloon -device
>>> virtio-scsi-pci,id=scsi0 -drive
>>> file=/home/kvmci/tests/data/avocado-vt/images/rhel8.0devel-ppc64le.qcow2,if=none,id=drive-scsi0-0-0,format=qcow2
>>> -device scsi-hd,bus=scsi0.0,drive=drive-scsi0-0-0 -netdev
>>> bridge,id=net0,br=virbr0 -device virtio-net-pci,netdev=net0
>>> (gdb) handle SIGUSR1 pass nostop noprint
>>> Signal Stop Print Pass to program Description
>>> SIGUSR1 No No Yes User defined signal 1
>>> (gdb) b qemu_system_reset
>>> Breakpoint 1 at 0x69a688: file ../system/runstate.c, line 510.
>>> (gdb) b qemu_default_main
>>> Breakpoint 2 at 0xa9aeb8: file ../system/main.c, line 45.
>>> (gdb) r
>>> Starting program: /usr/bin/qemu-system-ppc64 -name avocado-vt-vm1 -machine
>>> pseries,accel=kvm -enable-kvm -m 32768 -smp 32,sockets=1,cores=32,threads=1
>>> -nographic -serial pty -device virtio-balloon -device
>>> virtio-scsi-pci,id=scsi0 -drive
>>> file=/home/kvmci/tests/data/avocado-vt/images/rhel8.0devel-ppc64le.qcow2,if=none,id=drive-scsi0-0-0,format=qcow2
>>> -device scsi-hd,bus=scsi0.0,drive=drive-scsi0-0-0 -netdev
>>> bridge,id=net0,br=virbr0 -device virtio-net-pci,netdev=net0
>>> Thread 1 "qemu-system-ppc" hit Breakpoint 1, qemu_system_reset
>>> (reason=reason@entry=SHUTDOWN_CAUSE_NONE) at ../system/runstate.c:513
>>> 513 AccelClass *ac = ACCEL_GET_CLASS(current_accel());
>>> (gdb) n
>>> 517 mc = current_machine ? MACHINE_GET_CLASS(current_machine) : NULL;
>>> (gdb) n
>>> 519 cpu_synchronize_all_states();
>>> (gdb) n
>>> 521 switch (reason) {
>>> (gdb) n
>>> 529 if (!cpus_are_resettable() &&
>>> (gdb) n
>>> 553 if (mc && mc->reset) {
>>> (gdb) n
>>> 554 mc->reset(current_machine, type);
>>> (gdb) n
>>> 558 switch (reason) {
>>> (gdb) n
>>> 574 if (cpus_are_resettable()) {
>>> (gdb) n
>>> 583 cpu_synchronize_all_post_reset();
>>> (gdb) n
>>> 587 vm_set_suspended(false);
>>> (gdb) n
>>> qdev_machine_creation_done () at ../hw/core/machine.c:1814
>>> 1814 register_global_state();
>>> (gdb) n
>>> qemu_machine_creation_done (errp=0x10123e028 <error_fatal>) at
>>> ../system/vl.c:2785
>>> 2785 if (machine->cgs && !machine->cgs->ready) {
>>> (gdb) n
>>> 2791 foreach_device_config_or_exit(DEV_GDB, gdbserver_start);
>>> (gdb) n
>>> 2793 if (!vga_interface_created && !default_vga &&
>>> (gdb) n
>>> qmp_x_exit_preconfig (errp=errp@entry=0x10123e028 <error_fatal>) at
>>> ../system/vl.c:2815
>>> 2815 if (loadvm) {
>>> (gdb) n
>>> 2820 if (replay_mode != REPLAY_MODE_NONE) {
>>> (gdb) n
>>> 2824 if (incoming) {
>>> (gdb) n
>>> 2837 } else if (autostart) {
>>> (gdb) n
>>> 2838 qmp_cont(NULL);
>>> (gdb) n
>>> qemu_init (argc=<optimized out>, argv=<optimized out>) at
>>> ../system/vl.c:3849
>>> 3849 qemu_init_displays();
>>> (gdb) n
>>> 3850 accel_setup_post(current_machine);
>>> (gdb) n
>>> 3851 if (migrate_mode() != MIG_MODE_CPR_EXEC) {
>>> (gdb) n
>>> 3852 os_setup_post();
>>> (gdb) n
>>> 3854 resume_mux_open();
>>> (gdb) n
>>> main (argc=<optimized out>, argv=<optimized out>) at ../system/main.c:84
>>> 84 bql_unlock();
>>> (gdb) n
>>> 85 replay_mutex_unlock();
>>> (gdb) n
>>> 87 if (qemu_main) {
>>> (gdb) n
>>> 93 qemu_default_main(NULL);
>>> (gdb) n
>>> Thread 1 "qemu-system-ppc" hit Breakpoint 2, qemu_default_main
>>> (opaque=opaque@entry=0x0) at ../system/main.c:48
>>> 48 replay_mutex_lock();
>>> (gdb) n
>>> 49 bql_lock();
>>> (gdb) n
>>> <hangs>
>>> <system becomes unresponsive at this point>
>>> Thanks,
>>> Misbah Anjum N <[email protected]>
>>> On 2026-03-09 18:53, Ani Sinha wrote:
>>>> Yes seems this is an issue and I will fix it. Not sure if the fix will
>>>> address your issue though ...
>>>> Can you try the following patch?
>>>> From 9e5a6945181d4c1fce7f8438e1b6213f1eb79c14 Mon Sep 17 00:00:00 2001
>>>> From: Ani Sinha <[email protected]>
>>>> Date: Mon, 9 Mar 2026 18:44:40 +0530
>>>> Subject: [PATCH] Fix reset for non-x86 archs that do not support reset yet
>>>> Signed-off-by: Ani Sinha <[email protected]>
>>>> ---
>>>> system/runstate.c | 4 +++-
>>>> 1 file changed, 3 insertions(+), 1 deletion(-)
>>>> diff --git a/system/runstate.c b/system/runstate.c
>>>> index eca722b43c..c1f41284c9 100644
>>>> --- a/system/runstate.c
>>>> +++ b/system/runstate.c
>>>> @@ -531,10 +531,12 @@ void qemu_system_reset(ShutdownCause reason)
>>>> (current_machine->new_accel_vmfd_on_reset ||
>>>> !cpus_are_resettable())) {
>>>> if (ac->rebuild_guest) {
>>>> ret = ac->rebuild_guest(current_machine);
>>>> - if (ret < 0) {
>>>> + if (ret < 0 && ret != -EOPNOTSUPP) {
>>>> error_report("unable to rebuild guest: %s(%d)",
>>>> strerror(-ret), ret);
>>>> vm_stop(RUN_STATE_INTERNAL_ERROR);
>>>> + } else if (ret == -EOPNOTSUPP) {
>>>> + error_report("accelerator does not support reset!");
>>>> } else {
>>>> info_report("virtual machine state has been rebuilt with
>>>> new "
>>>> "guest file handle.");
>>>> --
>>>> 2.42.0
>>>>> Is this a confidential guest that cannot be normally reset?