git: c72e914cf108 - main - vmm: vlapic resume can eat 100% CPU by vlapic_callout_handler
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 11 Jan 2022 14:28:05 UTC
The branch main has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=c72e914cf108d3904eb5070b0999b3b5b6a4f384
commit c72e914cf108d3904eb5070b0999b3b5b6a4f384
Author: Vitaliy Gusev <gusev.vitaliy@gmail.com>
AuthorDate: 2022-01-11 14:24:41 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2022-01-11 14:27:45 +0000
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
MFC after: 2 weeks
Differential Revision: https://reviews.freebsd.org/D33448
---
sys/amd64/vmm/io/vlapic.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/sys/amd64/vmm/io/vlapic.c b/sys/amd64/vmm/io/vlapic.c
index 940e45cce458..c0ca167ef11f 100644
--- a/sys/amd64/vmm/io/vlapic.c
+++ b/sys/amd64/vmm/io/vlapic.c
@@ -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);
}