From: "Pavel Dovgaluk" <Pavel.Dovgaluk@ispras.ru>
To: 'Paolo Bonzini' <pbonzini@redhat.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PULL 13/21] apic_common: vapic_paddr synchronization fix
Date: Mon, 22 Sep 2014 12:21:37 +0400 [thread overview]
Message-ID: <000b01cfd63e$3ac57810$b0506830$@Dovgaluk@ispras.ru> (raw)
In-Reply-To: <541C328D.9020808@redhat.com>
> -----Original Message-----
> From: Paolo Bonzini [mailto:pbonzini@redhat.com]
> Sent: Friday, September 19, 2014 5:42 PM
> To: Pavel Dovgaluk; qemu-devel@nongnu.org
> Subject: Re: [PULL 13/21] apic_common: vapic_paddr synchronization fix
>
> Il 19/09/2014 14:50, Pavel Dovgaluk ha scritto:
> > vapic_paddr depends on cpu_number. cpu_number cannot be retrieved when do_vapic_enable
> executes.
> > Thus we cannot reconstruct vapic_paddr in that function.
>
> cpu_number will always be zero, because do_vapic_enable is only executed
> for smp_cpus == 1.
Right. Here it is:
diff --git a/hw/i386/kvmvapic.c b/hw/i386/kvmvapic.c
index ee95963..8a19699 100644
--- a/hw/i386/kvmvapic.c
+++ b/hw/i386/kvmvapic.c
@@ -59,6 +59,7 @@ typedef struct VAPICROMState {
GuestROMState rom_state;
size_t rom_size;
bool rom_mapped_writable;
+ VMChangeStateEntry *vmsentry;
} VAPICROMState;
#define TYPE_VAPIC "kvmvapic"
@@ -731,14 +732,41 @@ static void do_vapic_enable(void *data)
VAPICROMState *s = data;
X86CPU *cpu = X86_CPU(first_cpu);
- vapic_enable(s, cpu);
+ static const uint8_t enabled = 1;
+ cpu_physical_memory_write(s->vapic_paddr + offsetof(VAPICState, enabled),
+ &enabled, sizeof(enabled));
+ apic_enable_vapic(cpu->apic_state, s->vapic_paddr);
+ s->state = VAPIC_ACTIVE;
}
-static int vapic_post_load(void *opaque, int version_id)
+static void kvmvapic_vm_state_change(void *opaque, int running,
+ RunState state)
{
VAPICROMState *s = opaque;
uint8_t *zero;
+ if (!running) {
+ return;
+ }
+
+ if (s->state == VAPIC_ACTIVE) {
+ if (smp_cpus == 1) {
+ run_on_cpu(first_cpu, do_vapic_enable, s);
+ } else {
+ zero = g_malloc0(s->rom_state.vapic_size);
+ cpu_physical_memory_write(s->vapic_paddr, zero,
+ s->rom_state.vapic_size);
+ g_free(zero);
+ }
+ }
+
+ qemu_del_vm_change_state_handler(s->vmsentry);
+}
+
+static int vapic_post_load(void *opaque, int version_id)
+{
+ VAPICROMState *s = opaque;
+
/*
* The old implementation of qemu-kvm did not provide the state
* VAPIC_STANDBY. Reconstruct it.
@@ -752,17 +780,8 @@ static int vapic_post_load(void *opaque, int version_id)
return -1;
}
}
- if (s->state == VAPIC_ACTIVE) {
- if (smp_cpus == 1) {
- run_on_cpu(first_cpu, do_vapic_enable, s);
- } else {
- zero = g_malloc0(s->rom_state.vapic_size);
- cpu_physical_memory_write(s->vapic_paddr, zero,
- s->rom_state.vapic_size);
- g_free(zero);
- }
- }
+ s->vmsentry = qemu_add_vm_change_state_handler(kvmvapic_vm_state_change, s);
return 0;
}
next prev parent reply other threads:[~2014-09-22 8:21 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-12 13:58 [Qemu-devel] [PULL 00/21] KVM, memory, build, migration changes for 2014-09-11 Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 01/21] kvm: do not abort if KVM_RUN fails Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 02/21] trace: Only link generated-tracers.o with "simple" backend Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 03/21] util: Move general qemu_getauxval to util/getauxval.c Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 04/21] util: Don't link host-utils.o if it's empty Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 05/21] rules.mak: Fix DSO build by pulling in archive symbols Paolo Bonzini
2014-09-22 13:42 ` Christian Borntraeger
2014-09-12 13:58 ` [Qemu-devel] [PULL 06/21] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 07/21] memory: add parameter errp to memory_region_init_ram Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 08/21] memory: add parameter errp to memory_region_init_rom_device Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 09/21] hostmem-ram: don't exit qemu if size of memory-backend-ram is way too big Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 10/21] exec: report error when memory < hpagesize Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 11/21] exec: add parameter errp to gethugepagesize Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 12/21] vl: use QLIST_FOREACH_SAFE to visit change state handlers Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 13/21] apic_common: vapic_paddr synchronization fix Paolo Bonzini
2014-09-19 10:43 ` Pavel Dovgaluk
[not found] ` <30501.4520571151$1411123417@news.gmane.org>
2014-09-19 12:04 ` Paolo Bonzini
2014-09-19 12:50 ` Pavel Dovgaluk
2014-09-19 13:41 ` Paolo Bonzini
2014-09-22 8:21 ` Pavel Dovgaluk [this message]
[not found] ` <8379.85978364504$1411374220@news.gmane.org>
2014-09-22 9:16 ` Paolo Bonzini
2014-09-26 11:18 ` Pavel Dovgaluk
2014-09-26 11:18 ` Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 14/21] cpu: init vmstate for ticks and clock offset Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 15/21] fdc: adding vmstate for save/restore Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 16/21] parallel: " Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 17/21] serial: fixing " Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 18/21] piix: do not set irq while loading vmstate Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 19/21] mc146818rtc: add missed field to vmstate Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 20/21] pckbd: adding new fields " Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 21/21] gdbstub: init mon_chr through qemu_chr_alloc Paolo Bonzini
2014-09-15 15:42 ` [Qemu-devel] [PULL 00/21] KVM, memory, build, migration changes for 2014-09-11 Peter Maydell
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='000b01cfd63e$3ac57810$b0506830$@Dovgaluk@ispras.ru' \
--to=pavel.dovgaluk@ispras.ru \
--cc=pbonzini@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.