2017-06-29 16:17 GMT+08:00 Wanpeng Li <kernellwp@xxxxxxxxx>: > 2017-06-29 15:55 GMT+08:00 Paolo Bonzini <pbonzini@xxxxxxxxxx>: >>> + >>> + /* In case the sw timer triggered in the window */ >>> + if (atomic_read(&apic->lapic_timer.pending) && >>> + !apic_lvtt_period(apic)) >>> + need_cancel = true; >>> + else if (r && (apic_lvtt_oneshot(apic) || >>> apic_lvtt_tscdeadline(apic))) >>> + apic_timer_expired(apic); >>> + } >>> + } > > [...] > >> >> You still need to enable the preemption timer even if you return 1, so >> in lapic.c it becomes >> >> if (!apic_lvtt_period(apic)) { >> if (r) >> apic_timer_expired(apic); >> if (atomic_read(&apic->lapic_timer.pending)) >> need_cancel = true; >> } > > I think the codes are more clear but the same as above. We didn't > program preemption timer vmcs field if delta == 0, so how to > understand "need to enable the preemption timer even if return 1"? I guess you mean start_hv_timer() should return true, right? Regards, Wanpeng Li