Message ID | 4D4C43A5.2030207@siemens.com |
---|---|
State | New |
Headers | show |
On Fri, Feb 04, 2011 at 07:21:25PM +0100, Jan Kiszka wrote: > On 2011-02-04 18:52, Jan Kiszka wrote: > > On 2011-02-04 18:34, Anthony Liguori wrote: > >> On 02/04/2011 09:47 AM, Marcelo Tosatti wrote: > >>> The following changes since commit bfddb47a343b4718e5768aa80bce8adead0f7fca: > >>> > >>> Open up the 0.15 development branch (2011-02-02 08:39:28 +0100) > >>> > >> > >> This series breaks reboot of a Linux guest both with TCG and KVM. > >> > >> Perhaps it's a conflict with the ioapic changes from Jan? I can post a > >> tree but if you just rebase to the latest master there shouldn't be any > >> conflicts. > >> > > > > The problem is some patch in the queue itself. I obviously missed that > > case. Will have a look. > > > > Yet another IOTHREAD vs. !IOTHREAD case: We don't need to do anything in > cpu_stop_current in the single-thread setup as qemu_notify_event already > kicks us out. Specifically, we must not set the current cpu on > stop as reset happens without stop/start. > > This replaces patch 2 in the series. > > Jan Ugh, will check about autotesting !CONFIG_IOTHREAD. Anthony, queue updated. git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git uq/master
diff --git a/cpus.c b/cpus.c index ab6e40e..f8a88e3 100644 --- a/cpus.c +++ b/cpus.c @@ -312,6 +312,10 @@ void qemu_notify_event(void) void qemu_mutex_lock_iothread(void) {} void qemu_mutex_unlock_iothread(void) {} +void cpu_stop_current(void) +{ +} + void vm_stop(int reason) { do_vm_stop(reason); @@ -852,6 +856,14 @@ static void qemu_system_vmstop_request(int reason) qemu_notify_event(); } +void cpu_stop_current(void) +{ + if (cpu_single_env) { + cpu_single_env->stopped = 1; + cpu_exit(cpu_single_env); + } +} + void vm_stop(int reason) { QemuThread me; @@ -863,10 +875,7 @@ void vm_stop(int reason) * FIXME: should not return to device code in case * vm_stop() has been requested. */ - if (cpu_single_env) { - cpu_exit(cpu_single_env); - cpu_single_env->stop = 1; - } + cpu_stop_current(); return; } do_vm_stop(reason); diff --git a/cpus.h b/cpus.h index bf4d9bb..4cadb64 100644 --- a/cpus.h +++ b/cpus.h @@ -6,6 +6,7 @@ int qemu_init_main_loop(void); void qemu_main_loop_start(void); void resume_all_vcpus(void); void pause_all_vcpus(void); +void cpu_stop_current(void); /* vl.c */ extern int smp_cores; diff --git a/vl.c b/vl.c index 655617f..b1dc3ff 100644 --- a/vl.c +++ b/vl.c @@ -1296,6 +1296,7 @@ void qemu_system_reset_request(void) } else { reset_requested = 1; } + cpu_stop_current(); qemu_notify_event(); }