On 12/10/2017 03:38 AM, Peter Xu wrote: > Let's leverage the i8259 common code for kvm-i8259 too. > > I think it's still possible that stats can lost when i8259 is in kernel > and meanwhile when irqfd is used, e.g., by vfio or vhost devices. > However that should be rare IMHO since they should be using MSIs mostly > if they really want performance (that's why people use vhost and device > assignment), and no old INTx should be used. As long as the INTx users > are emulated in QEMU the stats will be correct. > > For "info pic", it should be always accurate since we fetch kvm regs > before dump. > > More importantly, it's just too simple to do this now - it's only 10+ > LOC to gain this feature. > > Signed-off-by: Peter Xu <pet...@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org> > --- > hw/i386/kvm/i8259.c | 8 ++++++++ > hw/intc/i8259_common.c | 1 + > 2 files changed, 9 insertions(+) > > diff --git a/hw/i386/kvm/i8259.c b/hw/i386/kvm/i8259.c > index 11d1b726b6..57abe091b0 100644 > --- a/hw/i386/kvm/i8259.c > +++ b/hw/i386/kvm/i8259.c > @@ -111,6 +111,7 @@ static void kvm_pic_set_irq(void *opaque, int irq, int > level) > { > int delivered; > > + pic_stat_update_irq(irq, level); > delivered = kvm_set_irq(kvm_state, irq, level); > apic_report_irq_delivered(delivered); > } > @@ -139,12 +140,15 @@ static void kvm_i8259_class_init(ObjectClass *klass, > void *data) > KVMPICClass *kpc = KVM_PIC_CLASS(klass); > PICCommonClass *k = PIC_COMMON_CLASS(klass); > DeviceClass *dc = DEVICE_CLASS(klass); > + InterruptStatsProviderClass *ic = INTERRUPT_STATS_PROVIDER_CLASS(klass); > > dc->reset = kvm_pic_reset; > kpc->parent_realize = dc->realize; > dc->realize = kvm_pic_realize; > k->pre_save = kvm_pic_get; > k->post_load = kvm_pic_put; > + ic->get_statistics = pic_get_statistics; > + ic->print_info = pic_print_info; > } > > static const TypeInfo kvm_i8259_info = { > @@ -153,6 +157,10 @@ static const TypeInfo kvm_i8259_info = { > .instance_size = sizeof(PICCommonState), > .class_init = kvm_i8259_class_init, > .class_size = sizeof(KVMPICClass), > + .interfaces = (InterfaceInfo[]) { > + { TYPE_INTERRUPT_STATS_PROVIDER }, > + { } > + }, > }; > > static void kvm_pic_register_types(void) > diff --git a/hw/intc/i8259_common.c b/hw/intc/i8259_common.c > index a3caddeefb..7efd2e8012 100644 > --- a/hw/intc/i8259_common.c > +++ b/hw/intc/i8259_common.c > @@ -132,6 +132,7 @@ void pic_print_info(InterruptStatsProvider *obj, Monitor > *mon) > { > PICCommonState *s = PIC_COMMON(obj); > > + pic_dispatch_pre_save(s); > monitor_printf(mon, "pic%d: irr=%02x imr=%02x isr=%02x hprio=%d " > "irq_base=%02x rr_sel=%d elcr=%02x fnm=%d\n", > s->master ? 0 : 1, s->irr, s->imr, s->isr, > s->priority_add, >