vmm: vlapic resume can eat 100% CPU by vlapic_callout_handler

Suspend/Resume of Win10 leads that CPU0 is busy on handling interrupts.

Win10 does not use LAPIC timer to often and in most cases, and I see it
is disabled by writing 0 to Initial Count Register (for Timer).

During resume, restart timer only for enabled LAPIC and enabled timer
for that LAPIC.

Reviewed by:	markj

(cherry picked from commit c72e914cf1)
This commit is contained in:
Vitaliy Gusev 2022-01-11 09:24:41 -05:00 committed by Mark Johnston
parent 82acfc0d78
commit b1ced97e75

View file

@ -1740,10 +1740,13 @@ vlapic_snapshot(struct vm *vm, struct vm_snapshot_meta *meta)
SNAPSHOT_VAR_OR_LEAVE(ccr, meta, ret, done);
if (meta->op == VM_SNAPSHOT_RESTORE) {
if (meta->op == VM_SNAPSHOT_RESTORE &&
vlapic_enabled(vlapic) && lapic->icr_timer != 0) {
/* Reset the value of the 'timer_fire_bt' and the vlapic
* callout based on the value of the current count
* register saved when the VM snapshot was created
* register saved when the VM snapshot was created.
* If initial count register is 0, timer is not used.
* Look at "10.5.4 APIC Timer" in Software Developer Manual.
*/
vlapic_reset_callout(vlapic, ccr);
}