All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gleb Natapov <gleb@redhat.com>
To: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Avi Kivity <avi@redhat.com>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	kvm@vger.kernel.org, Anthony Liguori <aliguori@us.ibm.com>,
	Alexander Graf <agraf@suse.de>,
	Glauber Costa <glommer@redhat.com>,
	qemu-devel@nongnu.org
Subject: Re: [PATCH 15/21] qemu-kvm: Clean up mpstate synchronization
Date: Tue, 2 Feb 2010 14:23:47 +0200	[thread overview]
Message-ID: <20100202122347.GC739@redhat.com> (raw)
In-Reply-To: <5104499c6d629296d385179f95163e7c16e1ec01.1265098707.git.jan.kiszka@siemens.com>

On Tue, Feb 02, 2010 at 09:19:01AM +0100, Jan Kiszka wrote:
> Push mpstate reading/writing into kvm_arch_load/save_regs and, on x86,
> properly synchronize with halted in the accessor functions.
> 
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
>  hw/apic.c             |    7 ----
>  qemu-kvm-ia64.c       |    4 ++-
>  qemu-kvm-x86.c        |   88 +++++++++++++++++++++++++++---------------------
>  qemu-kvm.c            |   30 -----------------
>  qemu-kvm.h            |   15 --------
>  target-i386/machine.c |    6 ---
>  target-ia64/machine.c |    3 ++
>  7 files changed, 55 insertions(+), 98 deletions(-)
> 
> diff --git a/hw/apic.c b/hw/apic.c
> index 3e03e10..092c61e 100644
> --- a/hw/apic.c
> +++ b/hw/apic.c
> @@ -507,13 +507,6 @@ void apic_init_reset(CPUState *env)
>      s->wait_for_sipi = 1;
>  
>      env->halted = !(s->apicbase & MSR_IA32_APICBASE_BSP);
> -#ifdef KVM_CAP_MP_STATE
> -    if (kvm_enabled() && kvm_irqchip_in_kernel()) {
> -        env->mp_state
> -            = env->halted ? KVM_MP_STATE_UNINITIALIZED : KVM_MP_STATE_RUNNABLE;
> -        kvm_load_mpstate(env);
> -    }
> -#endif
>  }
>  
>  static void apic_startup(APICState *s, int vector_num)
> diff --git a/qemu-kvm-ia64.c b/qemu-kvm-ia64.c
> index fc8110e..39bcbeb 100644
> --- a/qemu-kvm-ia64.c
> +++ b/qemu-kvm-ia64.c
> @@ -124,7 +124,9 @@ void kvm_arch_cpu_reset(CPUState *env)
>  {
>      if (kvm_irqchip_in_kernel(kvm_context)) {
>  #ifdef KVM_CAP_MP_STATE
> -	kvm_reset_mpstate(env->kvm_cpu_state.vcpu_ctx);
> +        struct kvm_mp_state mp_state = {.mp_state = KVM_MP_STATE_UNINITIALIZED
> +        };
> +        kvm_set_mpstate(env, &mp_state);
>  #endif
>      } else {
>  	env->interrupt_request &= ~CPU_INTERRUPT_HARD;
> diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
> index 63cd095..6b5895f 100644
> --- a/qemu-kvm-x86.c
> +++ b/qemu-kvm-x86.c
> @@ -754,6 +754,48 @@ static int get_msr_entry(struct kvm_msr_entry *entry, CPUState *env)
>          return 0;
>  }
>  
> +static void kvm_arch_save_mpstate(CPUState *env)
> +{
> +#ifdef KVM_CAP_MP_STATE
> +    int r;
> +    struct kvm_mp_state mp_state;
> +
> +    r = kvm_get_mpstate(env, &mp_state);
> +    if (r < 0) {
> +        env->mp_state = -1;
> +    } else {
> +        env->mp_state = mp_state.mp_state;
> +        if (kvm_irqchip_in_kernel()) {
> +            env->halted = (env->mp_state == KVM_MP_STATE_HALTED);
> +        }
> +    }
> +#else
> +    env->mp_state = -1;
> +#endif
> +}
> +
> +static void kvm_arch_load_mpstate(CPUState *env)
> +{
> +#ifdef KVM_CAP_MP_STATE
> +    struct kvm_mp_state mp_state;
> +
> +    /*
> +     * -1 indicates that the host did not support GET_MP_STATE ioctl,
> +     *  so don't touch it.
> +     */
> +    if (env->mp_state != -1) {
> +        if (kvm_irqchip_in_kernel()) {
> +            env->mp_state = env->halted ? KVM_MP_STATE_UNINITIALIZED :
> +                                          KVM_MP_STATE_RUNNABLE;
When irqchip is in kernel env->halted doesn't contain any relevant
information, so this is incorrect. Actually env->halted is updated only
to show correct cpu state during "info cpus".

> +            /* Avoid deadlock: no user space IRQ will ever clear it. */
And this comment explains why looking at env->halt when irqchip is in
kernel is wrong :)

> +            env->halted = 0;
> +        }
> +        mp_state.mp_state = env->mp_state;
> +        kvm_set_mpstate(env, &mp_state);
> +    }
> +#endif
> +}
> +
>  static void set_v8086_seg(struct kvm_segment *lhs, const SegmentCache *rhs)
>  {
>      lhs->selector = rhs->selector;
> @@ -926,6 +968,10 @@ void kvm_arch_load_regs(CPUState *env, int level)
>      rc = kvm_set_msrs(env, msrs, n);
>      if (rc == -1)
>          perror("kvm_set_msrs FAILED");
> +
> +    if (level >= KVM_PUT_RESET_STATE) {
> +        kvm_arch_load_mpstate(env);
> +    }
>  }
>  
>  void kvm_load_tsc(CPUState *env)
> @@ -940,36 +986,6 @@ void kvm_load_tsc(CPUState *env)
>          perror("kvm_set_tsc FAILED.\n");
>  }
>  
> -void kvm_arch_save_mpstate(CPUState *env)
> -{
> -#ifdef KVM_CAP_MP_STATE
> -    int r;
> -    struct kvm_mp_state mp_state;
> -
> -    r = kvm_get_mpstate(env, &mp_state);
> -    if (r < 0)
> -        env->mp_state = -1;
> -    else
> -        env->mp_state = mp_state.mp_state;
> -#else
> -    env->mp_state = -1;
> -#endif
> -}
> -
> -void kvm_arch_load_mpstate(CPUState *env)
> -{
> -#ifdef KVM_CAP_MP_STATE
> -    struct kvm_mp_state mp_state = { .mp_state = env->mp_state };
> -
> -    /*
> -     * -1 indicates that the host did not support GET_MP_STATE ioctl,
> -     *  so don't touch it.
> -     */
> -    if (env->mp_state != -1)
> -        kvm_set_mpstate(env, &mp_state);
> -#endif
> -}
> -
>  void kvm_arch_save_regs(CPUState *env)
>  {
>      struct kvm_regs regs;
> @@ -1366,15 +1382,9 @@ void kvm_arch_cpu_reset(CPUState *env)
>  {
>      kvm_arch_reset_vcpu(env);
>      kvm_put_vcpu_events(env);
> -    if (!cpu_is_bsp(env)) {
> -	if (kvm_irqchip_in_kernel()) {
> -#ifdef KVM_CAP_MP_STATE
> -	    kvm_reset_mpstate(env);
> -#endif
> -	} else {
> -	    env->interrupt_request &= ~CPU_INTERRUPT_HARD;
> -	    env->halted = 1;
> -	}
> +    if (!cpu_is_bsp(env) && !kvm_irqchip_in_kernel()) {
> +        env->interrupt_request &= ~CPU_INTERRUPT_HARD;
> +        env->halted = 1;
>      }
>  }
>  
> diff --git a/qemu-kvm.c b/qemu-kvm.c
> index 53030f1..efa6a29 100644
> --- a/qemu-kvm.c
> +++ b/qemu-kvm.c
> @@ -1579,36 +1579,6 @@ void kvm_update_interrupt_request(CPUState *env)
>      }
>  }
>  
> -static void kvm_do_load_mpstate(void *_env)
> -{
> -    CPUState *env = _env;
> -
> -    kvm_arch_load_mpstate(env);
> -}
> -
> -void kvm_load_mpstate(CPUState *env)
> -{
> -    if (kvm_enabled() && qemu_system_ready && kvm_vcpu_inited(env))
> -        on_vcpu(env, kvm_do_load_mpstate, env);
> -}
> -
> -static void kvm_do_save_mpstate(void *_env)
> -{
> -    CPUState *env = _env;
> -
> -    kvm_arch_save_mpstate(env);
> -#ifdef KVM_CAP_MP_STATE
> -    if (kvm_irqchip_in_kernel())
> -        env->halted = (env->mp_state == KVM_MP_STATE_HALTED);
> -#endif
> -}
> -
> -void kvm_save_mpstate(CPUState *env)
> -{
> -    if (kvm_enabled())
> -        on_vcpu(env, kvm_do_save_mpstate, env);
> -}
> -
>  int kvm_cpu_exec(CPUState *env)
>  {
>      int r;
> diff --git a/qemu-kvm.h b/qemu-kvm.h
> index 6d785a0..aa7bcce 100644
> --- a/qemu-kvm.h
> +++ b/qemu-kvm.h
> @@ -299,16 +299,6 @@ int kvm_get_mpstate(CPUState *env, struct kvm_mp_state *mp_state);
>   *
>   */
>  int kvm_set_mpstate(CPUState *env, struct kvm_mp_state *mp_state);
> -/*!
> - *  * \brief Reset VCPU MP state
> - *
> - */
> -static inline int kvm_reset_mpstate(CPUState *env)
> -{
> -    struct kvm_mp_state mp_state = {.mp_state = KVM_MP_STATE_UNINITIALIZED
> -    };
> -    return kvm_set_mpstate(env, &mp_state);
> -}
>  #endif
>  
>  /*!
> @@ -874,8 +864,6 @@ static inline void kvm_inject_x86_mce(CPUState *cenv, int bank,
>  int kvm_main_loop(void);
>  int kvm_init_ap(void);
>  int kvm_vcpu_inited(CPUState *env);
> -void kvm_load_mpstate(CPUState *env);
> -void kvm_save_mpstate(CPUState *env);
>  void kvm_apic_init(CPUState *env);
>  /* called from vcpu initialization */
>  void qemu_kvm_load_lapic(CPUState *env);
> @@ -909,8 +897,6 @@ int kvm_arch_qemu_create_context(void);
>  
>  void kvm_arch_save_regs(CPUState *env);
>  void kvm_arch_load_regs(CPUState *env, int level);
> -void kvm_arch_load_mpstate(CPUState *env);
> -void kvm_arch_save_mpstate(CPUState *env);
>  int kvm_arch_has_work(CPUState *env);
>  void kvm_arch_process_irqchip_events(CPUState *env);
>  int kvm_arch_try_push_interrupts(void *opaque);
> @@ -979,7 +965,6 @@ void kvm_load_tsc(CPUState *env);
>  #ifdef TARGET_I386
>  #define qemu_kvm_has_pit_state2() (0)
>  #endif
> -#define kvm_save_mpstate(env)   do {} while(0)
>  #define qemu_kvm_cpu_stop(env) do {} while(0)
>  static inline void kvm_load_tsc(CPUState *env)
>  {
> diff --git a/target-i386/machine.c b/target-i386/machine.c
> index bebde82..61e6a87 100644
> --- a/target-i386/machine.c
> +++ b/target-i386/machine.c
> @@ -323,7 +323,6 @@ static void cpu_pre_save(void *opaque)
>      int i;
>  
>      if (kvm_enabled()) {
> -        kvm_save_mpstate(env);
>          kvm_get_vcpu_events(env);
>      }
>  
> @@ -362,12 +361,7 @@ static int cpu_post_load(void *opaque, int version_id)
>      tlb_flush(env, 1);
>  
>      if (kvm_enabled()) {
> -        /* when in-kernel irqchip is used, env->halted causes deadlock
> -           because no userspace IRQs will ever clear this flag */
> -        env->halted = 0;
> -
>          kvm_load_tsc(env);
> -        kvm_load_mpstate(env);
>          kvm_put_vcpu_events(env);
>      }
>  
> diff --git a/target-ia64/machine.c b/target-ia64/machine.c
> index fdbeeef..8cf5bdd 100644
> --- a/target-ia64/machine.c
> +++ b/target-ia64/machine.c
> @@ -4,6 +4,9 @@
>  #include "exec-all.h"
>  #include "qemu-kvm.h"
>  
> +void kvm_arch_save_mpstate(CPUState *env);
> +void kvm_arch_load_mpstate(CPUState *env);
> +
>  void cpu_save(QEMUFile *f, void *opaque)
>  {
>      CPUState *env = opaque;
> -- 
> 1.6.0.2
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
			Gleb.

WARNING: multiple messages have this Message-ID (diff)
From: Gleb Natapov <gleb@redhat.com>
To: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Anthony Liguori <aliguori@us.ibm.com>,
	kvm@vger.kernel.org, Glauber Costa <glommer@redhat.com>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Alexander Graf <agraf@suse.de>,
	qemu-devel@nongnu.org, Avi Kivity <avi@redhat.com>
Subject: [Qemu-devel] Re: [PATCH 15/21] qemu-kvm: Clean up mpstate synchronization
Date: Tue, 2 Feb 2010 14:23:47 +0200	[thread overview]
Message-ID: <20100202122347.GC739@redhat.com> (raw)
In-Reply-To: <5104499c6d629296d385179f95163e7c16e1ec01.1265098707.git.jan.kiszka@siemens.com>

On Tue, Feb 02, 2010 at 09:19:01AM +0100, Jan Kiszka wrote:
> Push mpstate reading/writing into kvm_arch_load/save_regs and, on x86,
> properly synchronize with halted in the accessor functions.
> 
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
>  hw/apic.c             |    7 ----
>  qemu-kvm-ia64.c       |    4 ++-
>  qemu-kvm-x86.c        |   88 +++++++++++++++++++++++++++---------------------
>  qemu-kvm.c            |   30 -----------------
>  qemu-kvm.h            |   15 --------
>  target-i386/machine.c |    6 ---
>  target-ia64/machine.c |    3 ++
>  7 files changed, 55 insertions(+), 98 deletions(-)
> 
> diff --git a/hw/apic.c b/hw/apic.c
> index 3e03e10..092c61e 100644
> --- a/hw/apic.c
> +++ b/hw/apic.c
> @@ -507,13 +507,6 @@ void apic_init_reset(CPUState *env)
>      s->wait_for_sipi = 1;
>  
>      env->halted = !(s->apicbase & MSR_IA32_APICBASE_BSP);
> -#ifdef KVM_CAP_MP_STATE
> -    if (kvm_enabled() && kvm_irqchip_in_kernel()) {
> -        env->mp_state
> -            = env->halted ? KVM_MP_STATE_UNINITIALIZED : KVM_MP_STATE_RUNNABLE;
> -        kvm_load_mpstate(env);
> -    }
> -#endif
>  }
>  
>  static void apic_startup(APICState *s, int vector_num)
> diff --git a/qemu-kvm-ia64.c b/qemu-kvm-ia64.c
> index fc8110e..39bcbeb 100644
> --- a/qemu-kvm-ia64.c
> +++ b/qemu-kvm-ia64.c
> @@ -124,7 +124,9 @@ void kvm_arch_cpu_reset(CPUState *env)
>  {
>      if (kvm_irqchip_in_kernel(kvm_context)) {
>  #ifdef KVM_CAP_MP_STATE
> -	kvm_reset_mpstate(env->kvm_cpu_state.vcpu_ctx);
> +        struct kvm_mp_state mp_state = {.mp_state = KVM_MP_STATE_UNINITIALIZED
> +        };
> +        kvm_set_mpstate(env, &mp_state);
>  #endif
>      } else {
>  	env->interrupt_request &= ~CPU_INTERRUPT_HARD;
> diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
> index 63cd095..6b5895f 100644
> --- a/qemu-kvm-x86.c
> +++ b/qemu-kvm-x86.c
> @@ -754,6 +754,48 @@ static int get_msr_entry(struct kvm_msr_entry *entry, CPUState *env)
>          return 0;
>  }
>  
> +static void kvm_arch_save_mpstate(CPUState *env)
> +{
> +#ifdef KVM_CAP_MP_STATE
> +    int r;
> +    struct kvm_mp_state mp_state;
> +
> +    r = kvm_get_mpstate(env, &mp_state);
> +    if (r < 0) {
> +        env->mp_state = -1;
> +    } else {
> +        env->mp_state = mp_state.mp_state;
> +        if (kvm_irqchip_in_kernel()) {
> +            env->halted = (env->mp_state == KVM_MP_STATE_HALTED);
> +        }
> +    }
> +#else
> +    env->mp_state = -1;
> +#endif
> +}
> +
> +static void kvm_arch_load_mpstate(CPUState *env)
> +{
> +#ifdef KVM_CAP_MP_STATE
> +    struct kvm_mp_state mp_state;
> +
> +    /*
> +     * -1 indicates that the host did not support GET_MP_STATE ioctl,
> +     *  so don't touch it.
> +     */
> +    if (env->mp_state != -1) {
> +        if (kvm_irqchip_in_kernel()) {
> +            env->mp_state = env->halted ? KVM_MP_STATE_UNINITIALIZED :
> +                                          KVM_MP_STATE_RUNNABLE;
When irqchip is in kernel env->halted doesn't contain any relevant
information, so this is incorrect. Actually env->halted is updated only
to show correct cpu state during "info cpus".

> +            /* Avoid deadlock: no user space IRQ will ever clear it. */
And this comment explains why looking at env->halt when irqchip is in
kernel is wrong :)

> +            env->halted = 0;
> +        }
> +        mp_state.mp_state = env->mp_state;
> +        kvm_set_mpstate(env, &mp_state);
> +    }
> +#endif
> +}
> +
>  static void set_v8086_seg(struct kvm_segment *lhs, const SegmentCache *rhs)
>  {
>      lhs->selector = rhs->selector;
> @@ -926,6 +968,10 @@ void kvm_arch_load_regs(CPUState *env, int level)
>      rc = kvm_set_msrs(env, msrs, n);
>      if (rc == -1)
>          perror("kvm_set_msrs FAILED");
> +
> +    if (level >= KVM_PUT_RESET_STATE) {
> +        kvm_arch_load_mpstate(env);
> +    }
>  }
>  
>  void kvm_load_tsc(CPUState *env)
> @@ -940,36 +986,6 @@ void kvm_load_tsc(CPUState *env)
>          perror("kvm_set_tsc FAILED.\n");
>  }
>  
> -void kvm_arch_save_mpstate(CPUState *env)
> -{
> -#ifdef KVM_CAP_MP_STATE
> -    int r;
> -    struct kvm_mp_state mp_state;
> -
> -    r = kvm_get_mpstate(env, &mp_state);
> -    if (r < 0)
> -        env->mp_state = -1;
> -    else
> -        env->mp_state = mp_state.mp_state;
> -#else
> -    env->mp_state = -1;
> -#endif
> -}
> -
> -void kvm_arch_load_mpstate(CPUState *env)
> -{
> -#ifdef KVM_CAP_MP_STATE
> -    struct kvm_mp_state mp_state = { .mp_state = env->mp_state };
> -
> -    /*
> -     * -1 indicates that the host did not support GET_MP_STATE ioctl,
> -     *  so don't touch it.
> -     */
> -    if (env->mp_state != -1)
> -        kvm_set_mpstate(env, &mp_state);
> -#endif
> -}
> -
>  void kvm_arch_save_regs(CPUState *env)
>  {
>      struct kvm_regs regs;
> @@ -1366,15 +1382,9 @@ void kvm_arch_cpu_reset(CPUState *env)
>  {
>      kvm_arch_reset_vcpu(env);
>      kvm_put_vcpu_events(env);
> -    if (!cpu_is_bsp(env)) {
> -	if (kvm_irqchip_in_kernel()) {
> -#ifdef KVM_CAP_MP_STATE
> -	    kvm_reset_mpstate(env);
> -#endif
> -	} else {
> -	    env->interrupt_request &= ~CPU_INTERRUPT_HARD;
> -	    env->halted = 1;
> -	}
> +    if (!cpu_is_bsp(env) && !kvm_irqchip_in_kernel()) {
> +        env->interrupt_request &= ~CPU_INTERRUPT_HARD;
> +        env->halted = 1;
>      }
>  }
>  
> diff --git a/qemu-kvm.c b/qemu-kvm.c
> index 53030f1..efa6a29 100644
> --- a/qemu-kvm.c
> +++ b/qemu-kvm.c
> @@ -1579,36 +1579,6 @@ void kvm_update_interrupt_request(CPUState *env)
>      }
>  }
>  
> -static void kvm_do_load_mpstate(void *_env)
> -{
> -    CPUState *env = _env;
> -
> -    kvm_arch_load_mpstate(env);
> -}
> -
> -void kvm_load_mpstate(CPUState *env)
> -{
> -    if (kvm_enabled() && qemu_system_ready && kvm_vcpu_inited(env))
> -        on_vcpu(env, kvm_do_load_mpstate, env);
> -}
> -
> -static void kvm_do_save_mpstate(void *_env)
> -{
> -    CPUState *env = _env;
> -
> -    kvm_arch_save_mpstate(env);
> -#ifdef KVM_CAP_MP_STATE
> -    if (kvm_irqchip_in_kernel())
> -        env->halted = (env->mp_state == KVM_MP_STATE_HALTED);
> -#endif
> -}
> -
> -void kvm_save_mpstate(CPUState *env)
> -{
> -    if (kvm_enabled())
> -        on_vcpu(env, kvm_do_save_mpstate, env);
> -}
> -
>  int kvm_cpu_exec(CPUState *env)
>  {
>      int r;
> diff --git a/qemu-kvm.h b/qemu-kvm.h
> index 6d785a0..aa7bcce 100644
> --- a/qemu-kvm.h
> +++ b/qemu-kvm.h
> @@ -299,16 +299,6 @@ int kvm_get_mpstate(CPUState *env, struct kvm_mp_state *mp_state);
>   *
>   */
>  int kvm_set_mpstate(CPUState *env, struct kvm_mp_state *mp_state);
> -/*!
> - *  * \brief Reset VCPU MP state
> - *
> - */
> -static inline int kvm_reset_mpstate(CPUState *env)
> -{
> -    struct kvm_mp_state mp_state = {.mp_state = KVM_MP_STATE_UNINITIALIZED
> -    };
> -    return kvm_set_mpstate(env, &mp_state);
> -}
>  #endif
>  
>  /*!
> @@ -874,8 +864,6 @@ static inline void kvm_inject_x86_mce(CPUState *cenv, int bank,
>  int kvm_main_loop(void);
>  int kvm_init_ap(void);
>  int kvm_vcpu_inited(CPUState *env);
> -void kvm_load_mpstate(CPUState *env);
> -void kvm_save_mpstate(CPUState *env);
>  void kvm_apic_init(CPUState *env);
>  /* called from vcpu initialization */
>  void qemu_kvm_load_lapic(CPUState *env);
> @@ -909,8 +897,6 @@ int kvm_arch_qemu_create_context(void);
>  
>  void kvm_arch_save_regs(CPUState *env);
>  void kvm_arch_load_regs(CPUState *env, int level);
> -void kvm_arch_load_mpstate(CPUState *env);
> -void kvm_arch_save_mpstate(CPUState *env);
>  int kvm_arch_has_work(CPUState *env);
>  void kvm_arch_process_irqchip_events(CPUState *env);
>  int kvm_arch_try_push_interrupts(void *opaque);
> @@ -979,7 +965,6 @@ void kvm_load_tsc(CPUState *env);
>  #ifdef TARGET_I386
>  #define qemu_kvm_has_pit_state2() (0)
>  #endif
> -#define kvm_save_mpstate(env)   do {} while(0)
>  #define qemu_kvm_cpu_stop(env) do {} while(0)
>  static inline void kvm_load_tsc(CPUState *env)
>  {
> diff --git a/target-i386/machine.c b/target-i386/machine.c
> index bebde82..61e6a87 100644
> --- a/target-i386/machine.c
> +++ b/target-i386/machine.c
> @@ -323,7 +323,6 @@ static void cpu_pre_save(void *opaque)
>      int i;
>  
>      if (kvm_enabled()) {
> -        kvm_save_mpstate(env);
>          kvm_get_vcpu_events(env);
>      }
>  
> @@ -362,12 +361,7 @@ static int cpu_post_load(void *opaque, int version_id)
>      tlb_flush(env, 1);
>  
>      if (kvm_enabled()) {
> -        /* when in-kernel irqchip is used, env->halted causes deadlock
> -           because no userspace IRQs will ever clear this flag */
> -        env->halted = 0;
> -
>          kvm_load_tsc(env);
> -        kvm_load_mpstate(env);
>          kvm_put_vcpu_events(env);
>      }
>  
> diff --git a/target-ia64/machine.c b/target-ia64/machine.c
> index fdbeeef..8cf5bdd 100644
> --- a/target-ia64/machine.c
> +++ b/target-ia64/machine.c
> @@ -4,6 +4,9 @@
>  #include "exec-all.h"
>  #include "qemu-kvm.h"
>  
> +void kvm_arch_save_mpstate(CPUState *env);
> +void kvm_arch_load_mpstate(CPUState *env);
> +
>  void cpu_save(QEMUFile *f, void *opaque)
>  {
>      CPUState *env = opaque;
> -- 
> 1.6.0.2
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
			Gleb.

  reply	other threads:[~2010-02-02 12:24 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-02  8:18 [PATCH 00/21] qemu-kvm: Hook cleanups and extended use of upstream code Jan Kiszka
2010-02-02  8:18 ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:18 ` [PATCH 01/21] qemu-kvm: Drop vmport changes Jan Kiszka
2010-02-02  8:18   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:18 ` [PATCH 02/21] KVM: Make vmport KVM-compatible Jan Kiszka
2010-02-02  8:18   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:18 ` [PATCH 03/21] qemu-kvm: Clean up register access API Jan Kiszka
2010-02-02  8:18   ` [Qemu-devel] " Jan Kiszka
2010-02-02 11:06   ` Gleb Natapov
2010-02-02 11:06     ` [Qemu-devel] " Gleb Natapov
2010-02-02 11:18     ` Jan Kiszka
2010-02-02 11:18       ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:18 ` [PATCH 04/21] KVM: x86: Fix up misreported CPU features Jan Kiszka
2010-02-02  8:18   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:18 ` [PATCH 05/21] qemu-kvm: Use upstream kvm_enabled and cpu_synchronize_state Jan Kiszka
2010-02-02  8:18   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:18 ` [PATCH 06/21] qemu-kvm: Use upstream kvm_setup_guest_memory Jan Kiszka
2010-02-02  8:18   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:18 ` [PATCH 07/21] qemu-kvm: Use some more upstream prototypes Jan Kiszka
2010-02-02  8:18   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:18 ` [PATCH 08/21] qemu-kvm: Use upstream kvm_arch_get_supported_cpuid Jan Kiszka
2010-02-02  8:18   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:18 ` [PATCH 09/21] qemu-kvm: Use upstream kvm_pit_in_kernel Jan Kiszka
2010-02-02  8:18   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:18 ` [PATCH 10/21] KVM: Move and rename regs_modified Jan Kiszka
2010-02-02  8:18   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:18 ` [PATCH 11/21] KVM: Rework of guest debug state writing Jan Kiszka
2010-02-02  8:18   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:18 ` [PATCH 12/21] qemu-kvm: Use upstream kvm_vcpu_dirty Jan Kiszka
2010-02-02  8:18   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:18 ` [PATCH 13/21] qemu-kvm: Use upstream guest debug code Jan Kiszka
2010-02-02  8:18   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:19 ` [PATCH 14/21] qemu-kvm: Rework VCPU state writeback API Jan Kiszka
2010-02-02  8:19   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:19 ` [PATCH 15/21] qemu-kvm: Clean up mpstate synchronization Jan Kiszka
2010-02-02  8:19   ` [Qemu-devel] " Jan Kiszka
2010-02-02 12:23   ` Gleb Natapov [this message]
2010-02-02 12:23     ` [Qemu-devel] " Gleb Natapov
2010-02-02 12:31     ` Jan Kiszka
2010-02-02 12:31       ` [Qemu-devel] " Jan Kiszka
2010-02-02 12:37       ` Gleb Natapov
2010-02-02 12:37         ` [Qemu-devel] " Gleb Natapov
2010-02-02 12:40         ` Jan Kiszka
2010-02-02 12:40           ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:19 ` [PATCH 16/21] KVM: x86: Restrict writeback of VCPU state Jan Kiszka
2010-02-02  8:19   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:19 ` [PATCH 17/21] qemu-kvm: Use VCPU event state for reset and vmsave/load Jan Kiszka
2010-02-02  8:19   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:19 ` [PATCH 18/21] qemu-kvm: Cleanup/fix TSC and PV clock writeback Jan Kiszka
2010-02-02  8:19   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:19 ` [PATCH 19/21] qemu-kvm: Clean up KVM's APIC hooks Jan Kiszka
2010-02-02  8:19   ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:19 ` [PATCH 20/21] qemu-kvm: Move kvm_set_boot_cpu_id Jan Kiszka
2010-02-02  8:19   ` [Qemu-devel] " Jan Kiszka
2010-02-02 14:11   ` Gleb Natapov
2010-02-02 14:11     ` [Qemu-devel] " Gleb Natapov
2010-02-02 14:20     ` Jan Kiszka
2010-02-02 14:20       ` [Qemu-devel] " Jan Kiszka
2010-02-02 14:28       ` Gleb Natapov
2010-02-02 14:28         ` [Qemu-devel] " Gleb Natapov
2010-02-02 14:33         ` Jan Kiszka
2010-02-02 14:33           ` [Qemu-devel] " Jan Kiszka
2010-02-02  8:19 ` [PATCH 21/21] qemu-kvm: Bring qemu_init_vcpu back home Jan Kiszka
2010-02-02  8:19   ` [Qemu-devel] " Jan Kiszka
2010-02-02 10:52 ` [PATCH 00/21] qemu-kvm: Hook cleanups and extended use of upstream code Alexander Graf
2010-02-02 10:52   ` [Qemu-devel] " Alexander Graf
2010-02-02 11:19   ` Jan Kiszka
2010-02-02 11:19     ` [Qemu-devel] " Jan Kiszka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100202122347.GC739@redhat.com \
    --to=gleb@redhat.com \
    --cc=agraf@suse.de \
    --cc=aliguori@us.ibm.com \
    --cc=avi@redhat.com \
    --cc=glommer@redhat.com \
    --cc=jan.kiszka@siemens.com \
    --cc=kvm@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.