代码拉取完成,页面将自动刷新
同步操作将从 src-openEuler/libvirt 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From e24914dcbeb169f2608fd03cf6e701697844e065 Mon Sep 17 00:00:00 2001
From: tangbinzy <tangbin_yewu@cmss.chinamobile.com>
Date: Wed, 30 Nov 2022 09:38:41 +0000
Subject: [PATCH 12/24] qemu: Do not require TSC frequency to strictly match
host Some CPUs provide a way to read exact TSC frequency, while measuring it
is required on other CPUs. However, measuring is never exact and the result
may slightly differ across reboots. For this reason both Linux kernel and
QEMU recently started allowing for guests TSC frequency to fall into +/- 250
ppm tolerance interval around the host TSC frequency.
Let's do the same to avoid unnecessary failures (esp. during migration)
in case the host frequency does not exactly match the frequency
configured in a domain XML.
https://bugzilla.redhat.com/show_bug.cgi?id=1839095
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Signed-off-by: tangbin <tangbin_yewu@cmss.chinamobile.com>
(cherry-pick from d8e5b4560006590668d4669f54a46b08ec14c1a2)
---
src/qemu/qemu_process.c | 35 ++++++++++++++++++++++++++---------
1 file changed, 26 insertions(+), 9 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 360c4fcbb1..9cbf34a046 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -5271,12 +5271,18 @@ qemuProcessStartValidateDisks(virDomainObjPtr vm,
}
+/* 250 parts per million (ppm) is a half of NTP threshold */
+#define TSC_TOLERANCE 250
+
static int
qemuProcessStartValidateTSC(virQEMUDriverPtr driver,
virDomainObjPtr vm)
{
size_t i;
unsigned long long freq = 0;
+ unsigned long long tolerance;
+ unsigned long long minFreq;
+ unsigned long long maxFreq;
virHostCPUTscInfoPtr tsc;
g_autoptr(virCPUDef) cpu = NULL;
@@ -5302,23 +5308,34 @@ qemuProcessStartValidateTSC(virQEMUDriverPtr driver,
}
tsc = cpu->tsc;
- VIR_DEBUG("Host TSC frequency %llu Hz, scaling %s",
- tsc->frequency, virTristateBoolTypeToString(tsc->scaling));
+ tolerance = tsc->frequency * TSC_TOLERANCE / 1000000;
+ minFreq = tsc->frequency - tolerance;
+ maxFreq = tsc->frequency + tolerance;
+
+ VIR_DEBUG("Host TSC frequency %llu Hz, scaling %s, tolerance +/- %llu Hz",
+ tsc->frequency, virTristateBoolTypeToString(tsc->scaling),
+ tolerance);
+
+ if (freq > minFreq && freq < maxFreq) {
+ VIR_DEBUG("Requested TSC frequency is within tolerance interval");
+ return 0;
+ }
- if (freq == tsc->frequency || tsc->scaling == VIR_TRISTATE_BOOL_YES)
+ if (tsc->scaling == VIR_TRISTATE_BOOL_YES)
return 0;
if (tsc->scaling == VIR_TRISTATE_BOOL_ABSENT) {
- VIR_DEBUG("TSC frequencies do not match and scaling support is "
- "unknown, QEMU will try and possibly fail later");
+ VIR_DEBUG("Requested TSC frequency falls outside tolerance range and "
+ "scaling support is unknown, QEMU will try and possibly "
+ "fail later");
return 0;
}
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("Requested TSC frequency %llu Hz does not match "
- "host (%llu Hz) and TSC scaling is not supported "
- "by the host CPU"),
- freq, tsc->frequency);
+ _("Requested TSC frequency %llu Hz is outside tolerance "
+ "range ([%llu, %llu] Hz) around host frequency %llu Hz "
+ "and TSC scaling is not supported by the host CPU"),
+ freq, minFreq, maxFreq, tsc->frequency);
return -1;
}
--
2.27.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。