On 29.07.2014 18:58, Paolo Bonzini wrote:
Il 18/07/2014 10:48, Paolo Bonzini ha scritto:

It is easy to find out if the "fix" is related to 1 or 2/3: just write

      if (cpu->kvm_vcpu_dirty) {
          printf ("do_kvm_cpu_synchronize_state_always: look at 2/3\n");
          kvm_arch_get_registers(cpu);
      } else {
          printf ("do_kvm_cpu_synchronize_state_always: look at 1\n");
      }

To further refine between 2 and 3, I suppose you can set a breakpoint on
cpu_synchronize_all_states and kvm_cpu_exec, and see which is called
first after cpu_synchronize_all_states_always.

Marcin, have you ever gotten round to doing this?

Source side of migration, without my ugly hack:

called do_kvm_cpu_synchronize_state: vcpu not dirty, getting registers
called do_kvm_cpu_synchronize_state: vcpu not dirty, getting registers
called kvm_cpu_synchronize_state: vcpu dirty
called kvm_cpu_synchronize_state: vcpu dirty
shutting down

without it:

called do_kvm_cpu_synchronize_state_always
called do_kvm_cpu_synchronize_state_always
called do_kvm_cpu_synchronize_state: vcpu not dirty, getting registers
called do_kvm_cpu_synchronize_state: vcpu not dirty, getting registers
shutting down

So it's probably about 2 from your list ("the next call to do_kvm_cpu_synchronize_state will do kvm_arch_get_registers").

I've tapped into kvm_cpu_exec() to find out if it's kvm_arch_put_registers(), but nothing was logged during migration so it's probably not 3.

--
mg

Reply via email to