Login
Log in using an SSO provider:
Fedora Account System
Red Hat Associate
Red Hat Customer
Login using a Red Hat Bugzilla account
Forgot Password
Create an Account
Red Hat Bugzilla – Attachment 635535 Details for
Bug 867366
virtio-serial misses irq delivery on migration
Home
New
Search
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh90 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
[?]
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
patch to synchronize APIC state upon load
bz867366.patch (text/plain), 12.94 KB, created by
Paolo Bonzini
on 2012-10-30 11:58:54 UTC
(
hide
)
Description:
patch to synchronize APIC state upon load
Filename:
MIME Type:
Creator:
Paolo Bonzini
Created:
2012-10-30 11:58:54 UTC
Size:
12.94 KB
patch
obsolete
>From 7f5adc3533a43446350dd4ccc4c1f4dd6a060d5d Mon Sep 17 00:00:00 2001 >From: Paolo Bonzini <pbonzini@redhat.com> >Date: Tue, 30 Oct 2012 12:46:57 +0100 >Subject: [PATCH 0/3] *** SUBJECT HERE *** > >*** BLURB HERE *** > >Paolo Bonzini (3): > kvm: move KVM_GET_LAPIC/KVM_SET_LAPIC to hw/kvm/apic.c > apic: add get/put methods > apic: always update the in-kernel status after loading > > hw/apic.h | 2 + > hw/apic_common.c | 33 +++++++++++++++++++++ > hw/apic_internal.h | 2 + > hw/kvm/apic.c | 80 +++++++++++++++++++++++++++++---------------------- > kvm.h | 3 -- > target-i386/kvm.c | 34 +--------------------- > 6 files changed, 84 insertions(+), 70 deletions(-) > >From f84779359e87602cb41f09b0bad8f41dab43a9a9 Mon Sep 17 00:00:00 2001 >From: Paolo Bonzini <pbonzini@redhat.com> >Date: Tue, 30 Oct 2012 12:10:29 +0100 >Subject: [PATCH 1/3] kvm: move KVM_GET_LAPIC/KVM_SET_LAPIC to hw/kvm/apic.c > >Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> >--- > hw/kvm/apic.c | 76 ++++++++++++++++++++++++++++++----------------------- > kvm.h | 4 +- > target-i386/kvm.c | 14 +-------- > 3 files changed, 47 insertions(+), 47 deletions(-) > >diff --git a/hw/kvm/apic.c b/hw/kvm/apic.c >index dbac7ff..ddf6b7d 100644 >--- a/hw/kvm/apic.c >+++ b/hw/kvm/apic.c >@@ -25,62 +25,72 @@ static inline uint32_t kvm_apic_get_reg(struct kvm_lapic_state *kapic, > return *((uint32_t *)(kapic->regs + (reg_id << 4))); > } > >-void kvm_put_apic_state(DeviceState *d, struct kvm_lapic_state *kapic) >+int kvm_put_apic_state(DeviceState *d) > { > APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d); >+ struct kvm_lapic_state kapic; > int i; > >- memset(kapic, 0, sizeof(*kapic)); >- kvm_apic_set_reg(kapic, 0x2, s->id << 24); >- kvm_apic_set_reg(kapic, 0x8, s->tpr); >- kvm_apic_set_reg(kapic, 0xd, s->log_dest << 24); >- kvm_apic_set_reg(kapic, 0xe, s->dest_mode << 28 | 0x0fffffff); >- kvm_apic_set_reg(kapic, 0xf, s->spurious_vec); >+ memset(&kapic, 0, sizeof(kapic)); >+ kvm_apic_set_reg(&kapic, 0x2, s->id << 24); >+ kvm_apic_set_reg(&kapic, 0x8, s->tpr); >+ kvm_apic_set_reg(&kapic, 0xd, s->log_dest << 24); >+ kvm_apic_set_reg(&kapic, 0xe, s->dest_mode << 28 | 0x0fffffff); >+ kvm_apic_set_reg(&kapic, 0xf, s->spurious_vec); > for (i = 0; i < 8; i++) { >- kvm_apic_set_reg(kapic, 0x10 + i, s->isr[i]); >- kvm_apic_set_reg(kapic, 0x18 + i, s->tmr[i]); >- kvm_apic_set_reg(kapic, 0x20 + i, s->irr[i]); >+ kvm_apic_set_reg(&kapic, 0x10 + i, s->isr[i]); >+ kvm_apic_set_reg(&kapic, 0x18 + i, s->tmr[i]); >+ kvm_apic_set_reg(&kapic, 0x20 + i, s->irr[i]); > } >- kvm_apic_set_reg(kapic, 0x28, s->esr); >- kvm_apic_set_reg(kapic, 0x30, s->icr[0]); >- kvm_apic_set_reg(kapic, 0x31, s->icr[1]); >+ kvm_apic_set_reg(&kapic, 0x28, s->esr); >+ kvm_apic_set_reg(&kapic, 0x30, s->icr[0]); >+ kvm_apic_set_reg(&kapic, 0x31, s->icr[1]); > for (i = 0; i < APIC_LVT_NB; i++) { >- kvm_apic_set_reg(kapic, 0x32 + i, s->lvt[i]); >+ kvm_apic_set_reg(&kapic, 0x32 + i, s->lvt[i]); > } >- kvm_apic_set_reg(kapic, 0x38, s->initial_count); >- kvm_apic_set_reg(kapic, 0x3e, s->divide_conf); >+ kvm_apic_set_reg(&kapic, 0x38, s->initial_count); >+ kvm_apic_set_reg(&kapic, 0x3e, s->divide_conf); >+ >+ return kvm_vcpu_ioctl(s->cpu_env, KVM_SET_LAPIC, &kapic); > } > >-void kvm_get_apic_state(DeviceState *d, struct kvm_lapic_state *kapic) >+int kvm_get_apic_state(DeviceState *d) > { > APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d); >- int i, v; >- >- s->id = kvm_apic_get_reg(kapic, 0x2) >> 24; >- s->tpr = kvm_apic_get_reg(kapic, 0x8); >- s->arb_id = kvm_apic_get_reg(kapic, 0x9); >- s->log_dest = kvm_apic_get_reg(kapic, 0xd) >> 24; >- s->dest_mode = kvm_apic_get_reg(kapic, 0xe) >> 28; >- s->spurious_vec = kvm_apic_get_reg(kapic, 0xf); >+ struct kvm_lapic_state kapic; >+ int i, v, ret; >+ >+ ret = kvm_vcpu_ioctl(s->cpu_env, KVM_GET_LAPIC, &kapic); >+ if (ret < 0) { >+ return ret; >+ } >+ >+ s->id = kvm_apic_get_reg(&kapic, 0x2) >> 24; >+ s->tpr = kvm_apic_get_reg(&kapic, 0x8); >+ s->arb_id = kvm_apic_get_reg(&kapic, 0x9); >+ s->log_dest = kvm_apic_get_reg(&kapic, 0xd) >> 24; >+ s->dest_mode = kvm_apic_get_reg(&kapic, 0xe) >> 28; >+ s->spurious_vec = kvm_apic_get_reg(&kapic, 0xf); > for (i = 0; i < 8; i++) { >- s->isr[i] = kvm_apic_get_reg(kapic, 0x10 + i); >- s->tmr[i] = kvm_apic_get_reg(kapic, 0x18 + i); >- s->irr[i] = kvm_apic_get_reg(kapic, 0x20 + i); >+ s->isr[i] = kvm_apic_get_reg(&kapic, 0x10 + i); >+ s->tmr[i] = kvm_apic_get_reg(&kapic, 0x18 + i); >+ s->irr[i] = kvm_apic_get_reg(&kapic, 0x20 + i); > } >- s->esr = kvm_apic_get_reg(kapic, 0x28); >- s->icr[0] = kvm_apic_get_reg(kapic, 0x30); >- s->icr[1] = kvm_apic_get_reg(kapic, 0x31); >+ s->esr = kvm_apic_get_reg(&kapic, 0x28); >+ s->icr[0] = kvm_apic_get_reg(&kapic, 0x30); >+ s->icr[1] = kvm_apic_get_reg(&kapic, 0x31); > for (i = 0; i < APIC_LVT_NB; i++) { >- s->lvt[i] = kvm_apic_get_reg(kapic, 0x32 + i); >+ s->lvt[i] = kvm_apic_get_reg(&kapic, 0x32 + i); > } >- s->initial_count = kvm_apic_get_reg(kapic, 0x38); >- s->divide_conf = kvm_apic_get_reg(kapic, 0x3e); >+ s->initial_count = kvm_apic_get_reg(&kapic, 0x38); >+ s->divide_conf = kvm_apic_get_reg(&kapic, 0x3e); > > v = (s->divide_conf & 3) | ((s->divide_conf >> 1) & 4); > s->count_shift = (v + 1) & 7; > > s->initial_count_load_time = qemu_get_clock_ns(vm_clock); > apic_next_timer(s, s->initial_count_load_time); >+ return 0; > } > > static void kvm_apic_set_base(APICCommonState *s, uint64_t val) >diff --git a/kvm.h b/kvm.h >index 2b26dcb..0056f92 100644 >--- a/kvm.h >+++ b/kvm.h >@@ -191,8 +191,8 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg); > > void kvm_irqchip_add_irq_route(KVMState *s, int gsi, int irqchip, int pin); > >-void kvm_put_apic_state(DeviceState *d, struct kvm_lapic_state *kapic); >-void kvm_get_apic_state(DeviceState *d, struct kvm_lapic_state *kapic); >+int kvm_put_apic_state(DeviceState *d); >+int kvm_get_apic_state(DeviceState *d); > > struct kvm_guest_debug; > struct kvm_debug_exit_arch; >diff --git a/target-i386/kvm.c b/target-i386/kvm.c >index 3aa62b2..092d4f1 100644 >--- a/target-i386/kvm.c >+++ b/target-i386/kvm.c >@@ -1384,16 +1384,9 @@ static int kvm_get_mp_state(CPUX86State *env) > static int kvm_get_apic(CPUX86State *env) > { > DeviceState *apic = env->apic_state; >- struct kvm_lapic_state kapic; >- int ret; > > if (apic && kvm_irqchip_in_kernel()) { >- ret = kvm_vcpu_ioctl(env, KVM_GET_LAPIC, &kapic); >- if (ret < 0) { >- return ret; >- } >- >- kvm_get_apic_state(apic, &kapic); >+ return kvm_get_apic_state(apic); > } > return 0; > } >@@ -1401,12 +1394,9 @@ static int kvm_get_apic(CPUX86State *env) > static int kvm_put_apic(CPUX86State *env) > { > DeviceState *apic = env->apic_state; >- struct kvm_lapic_state kapic; > > if (apic && kvm_irqchip_in_kernel()) { >- kvm_put_apic_state(apic, &kapic); >- >- return kvm_vcpu_ioctl(env, KVM_SET_LAPIC, &kapic); >+ return kvm_put_apic_state(apic); > } > return 0; > } >-- >1.7.1 > > >From 063623f837d6c43b0bb36326f91b333321c5e0d0 Mon Sep 17 00:00:00 2001 >From: Paolo Bonzini <pbonzini@redhat.com> >Date: Tue, 30 Oct 2012 12:25:44 +0100 >Subject: [PATCH 2/3] apic: add get/put methods > >Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> >--- > hw/apic.h | 2 ++ > hw/apic_common.c | 32 ++++++++++++++++++++++++++++++++ > hw/apic_internal.h | 2 ++ > hw/kvm/apic.c | 8 ++++---- > kvm.h | 3 --- > target-i386/kvm.c | 24 ++---------------------- > 6 files changed, 42 insertions(+), 29 deletions(-) > >diff --git a/hw/apic.h b/hw/apic.h >index 1d48e02..f15d100 100644 >--- a/hw/apic.h >+++ b/hw/apic.h >@@ -12,6 +12,8 @@ void apic_deliver_nmi(DeviceState *d); > int apic_get_interrupt(DeviceState *s); > void apic_reset_irq_delivered(void); > int apic_get_irq_delivered(void); >+int cpu_get_apic_state(DeviceState *d); >+int cpu_put_apic_state(DeviceState *d); > void cpu_set_apic_base(DeviceState *s, uint64_t val); > uint64_t cpu_get_apic_base(DeviceState *s); > void cpu_set_apic_tpr(DeviceState *s, uint8_t val); >diff --git a/hw/apic_common.c b/hw/apic_common.c >index d68116d..f373ba8 100644 >--- a/hw/apic_common.c >+++ b/hw/apic_common.c >@@ -312,6 +312,38 @@ static int apic_init_common(SysBusDevice *dev) > return 0; > } > >+int cpu_get_apic_state(DeviceState *apic) >+{ >+ APICCommonState *s; >+ APICCommonClass *info; >+ if (!apic) { >+ return 0; >+ } >+ >+ s = APIC_COMMON(apic); >+ info = APIC_COMMON_GET_CLASS(s); >+ if (info->get) { >+ return info->get(s); >+ } >+ return 0; >+} >+ >+int cpu_put_apic_state(DeviceState *apic) >+{ >+ APICCommonState *s; >+ APICCommonClass *info; >+ if (!apic) { >+ return 0; >+ } >+ >+ s = APIC_COMMON(apic); >+ info = APIC_COMMON_GET_CLASS(s); >+ if (info->put) { >+ return info->put(s); >+ } >+ return 0; >+} >+ > static void apic_dispatch_pre_save(void *opaque) > { > APICCommonState *s = APIC_COMMON(opaque); >diff --git a/hw/apic_internal.h b/hw/apic_internal.h >index 30932a3..256fb1a 100644 >--- a/hw/apic_internal.h >+++ b/hw/apic_internal.h >@@ -89,6 +89,8 @@ typedef struct APICCommonClass > void (*enable_tpr_reporting)(APICCommonState *s, bool enable); > void (*vapic_base_update)(APICCommonState *s); > void (*external_nmi)(APICCommonState *s); >+ int (*get)(APICCommonState *s); >+ int (*put)(APICCommonState *s); > void (*pre_save)(APICCommonState *s); > void (*post_load)(APICCommonState *s); > } APICCommonClass; >diff --git a/hw/kvm/apic.c b/hw/kvm/apic.c >index ddf6b7d..35afe0c 100644 >--- a/hw/kvm/apic.c >+++ b/hw/kvm/apic.c >@@ -25,9 +25,8 @@ static inline uint32_t kvm_apic_get_reg(struct kvm_lapic_state *kapic, > return *((uint32_t *)(kapic->regs + (reg_id << 4))); > } > >-int kvm_put_apic_state(DeviceState *d) >+static int kvm_put_apic_state(APICCommonState *s) > { >- APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d); > struct kvm_lapic_state kapic; > int i; > >@@ -54,9 +53,8 @@ int kvm_put_apic_state(DeviceState *d) > return kvm_vcpu_ioctl(s->cpu_env, KVM_SET_LAPIC, &kapic); > } > >-int kvm_get_apic_state(DeviceState *d) >+static int kvm_get_apic_state(APICCommonState *s) > { >- APICCommonState *s = DO_UPCAST(APICCommonState, busdev.qdev, d); > struct kvm_lapic_state kapic; > int i, v, ret; > >@@ -202,6 +200,8 @@ static void kvm_apic_class_init(ObjectClass *klass, void *data) > k->enable_tpr_reporting = kvm_apic_enable_tpr_reporting; > k->vapic_base_update = kvm_apic_vapic_base_update; > k->external_nmi = kvm_apic_external_nmi; >+ k->get = kvm_get_apic_state; >+ k->put = kvm_put_apic_state; > } > > static TypeInfo kvm_apic_info = { >diff --git a/kvm.h b/kvm.h >index 0056f92..83f7b05 100644 >--- a/kvm.h >+++ b/kvm.h >@@ -191,9 +191,6 @@ int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg); > > void kvm_irqchip_add_irq_route(KVMState *s, int gsi, int irqchip, int pin); > >-int kvm_put_apic_state(DeviceState *d); >-int kvm_get_apic_state(DeviceState *d); >- > struct kvm_guest_debug; > struct kvm_debug_exit_arch; > >diff --git a/target-i386/kvm.c b/target-i386/kvm.c >index 092d4f1..0912e15 100644 >--- a/target-i386/kvm.c >+++ b/target-i386/kvm.c >@@ -1381,26 +1381,6 @@ static int kvm_get_mp_state(CPUX86State *env) > return 0; > } > >-static int kvm_get_apic(CPUX86State *env) >-{ >- DeviceState *apic = env->apic_state; >- >- if (apic && kvm_irqchip_in_kernel()) { >- return kvm_get_apic_state(apic); >- } >- return 0; >-} >- >-static int kvm_put_apic(CPUX86State *env) >-{ >- DeviceState *apic = env->apic_state; >- >- if (apic && kvm_irqchip_in_kernel()) { >- return kvm_put_apic_state(apic); >- } >- return 0; >-} >- > static int kvm_put_vcpu_events(CPUX86State *env, int level) > { > struct kvm_vcpu_events events; >@@ -1576,7 +1556,7 @@ int kvm_arch_put_registers(CPUX86State *env, int level) > if (ret < 0) { > return ret; > } >- ret = kvm_put_apic(env); >+ ret = cpu_put_apic_state(env->apic_state); > if (ret < 0) { > return ret; > } >@@ -1627,7 +1607,7 @@ int kvm_arch_get_registers(CPUX86State *env) > if (ret < 0) { > return ret; > } >- ret = kvm_get_apic(env); >+ ret = cpu_get_apic_state(env->apic_state); > if (ret < 0) { > return ret; > } >-- >1.7.1 > > >From 7f5adc3533a43446350dd4ccc4c1f4dd6a060d5d Mon Sep 17 00:00:00 2001 >From: Paolo Bonzini <pbonzini@redhat.com> >Date: Tue, 30 Oct 2012 12:29:13 +0100 >Subject: [PATCH 3/3] apic: always update the in-kernel status after loading > >Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> >--- > hw/apic_common.c | 1 + > 1 files changed, 1 insertions(+), 0 deletions(-) > >diff --git a/hw/apic_common.c b/hw/apic_common.c >index f373ba8..1ef52b2 100644 >--- a/hw/apic_common.c >+++ b/hw/apic_common.c >@@ -362,6 +362,7 @@ static int apic_dispatch_post_load(void *opaque, int version_id) > if (info->post_load) { > info->post_load(s); > } >+ cpu_put_apic_state(DEVICE(s)); > return 0; > } > >-- >1.7.1 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 867366
:
629222
|
632023
| 635535