Dong, Eddie wrote: > [EMAIL PROTECTED] wrote: > >> Add back pending irqs for apic timer to get precise guest APIC >> timer interrupt. >> >> Signed-off-by: Yaozu (Eddie) Dong <[EMAIL PROTECTED]> >> >> >> > a typo, please use this one. > > With above patches, now guest timer is much accurate! sleep 60 > get exactly 60 seconds in host per my rough test. > > BTW, AMD platform is not tested. > > thx,eddie > > > diff --git a/drivers/kvm/irq.h b/drivers/kvm/irq.h > index ed6d20a..8867c82 100644 > --- a/drivers/kvm/irq.h > +++ b/drivers/kvm/irq.h > @@ -110,7 +110,7 @@ struct kvm_lapic { > unsigned long base_address; > struct kvm_io_device dev; > struct { > - unsigned long pending; > + atomic_t pending; > s64 period; /* unit: ns */ > u32 divide_count; > ktime_t last_update; > @@ -153,5 +153,7 @@ int kvm_apic_set_irq(struct kvm_lapic *apic, u8 vec, > u8 trig); > void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu); > int kvm_ioapic_init(struct kvm *kvm); > void kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level); > +void kvm_pt_intr_post(struct kvm_vcpu *vcpu, int vec); > +void kvm_pt_update_irq(struct kvm_vcpu *vcpu); >
What does "pt" mean in this context? "pending timer"? Suggested descriptive names below. > *---------------------------------------------------------------------- > */ > + > +/* TODO: make sure __apic_timer_fn runs in current pCPU */ > static int __apic_timer_fn(struct kvm_lapic *apic) > { > - u32 vector; > int result = 0; > > - if (unlikely(!apic_enabled(apic) || > - !apic_lvt_enabled(apic, APIC_LVTT))) { > - apic_debug("%s: time interrupt although apic is down\n", > - __FUNCTION__); > - return 0; > - } > - > - vector = apic_lvt_vector(apic, APIC_LVTT); > - apic->timer.last_update = apic->timer.dev.expires; > - apic->timer.pending++; > - __apic_accept_irq(apic, APIC_DM_FIXED, vector, 1, 0); > - > + atomic_inc (&apic->timer.pending); > Extra space. > if (apic_lvtt_period(apic)) { > - u32 offset; > - u32 tmict = apic_get_reg(apic, APIC_TMICT); > - > - offset = APIC_BUS_CYCLE_NS * apic->timer.divide_count * > tmict; > - > result = 1; > apic->timer.dev.expires = ktime_add_ns( > apic->timer.dev.expires, > apic->timer.period); > } > - > return result; > } > While this improves throughput, doesn't it decrease responsiveness? Suppose the guest is sleeping and there is no activity except for lapic interrupts. Won't the wakeup get deferred indefinitely? > > +void kvm_pt_update_irq(struct kvm_vcpu *vcpu) > +{ > + struct kvm_lapic *apic = vcpu->apic; > + > + if (apic && atomic_read(&apic->timer.pending) > 0) { > Extra braces. Also this smells like a race. What if timer.pending is updated just after this? > + if (inject_apic_timer_irq(apic)) > + atomic_dec(&apic->timer.pending); > + } > +} > +EXPORT_SYMBOL_GPL(kvm_pt_update_irq); > How about "kvm_inject_pending_timer_irqs" > + > +void kvm_pt_intr_post(struct kvm_vcpu *vcpu, int vec) > +{ > + struct kvm_lapic *apic = vcpu->apic; > + > + if (apic && apic_lvt_vector(apic, APIC_LVTT) == vec) > + apic->timer.last_update = ktime_add_ns( > + apic->timer.last_update, > + apic->timer.period); > +} > +EXPORT_SYMBOL_GPL(kvm_pt_intr_post); > kvm_update_pending_timer_irq? -- error compiling committee.c: too many arguments to function ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel