|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen staging] x86/time: Alter tsc_set_info() to return an error value
commit 0cef19b9c8ba5c38f29aa8b72864e0829e21c0e6
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Tue Nov 20 11:37:19 2018 +0000
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Tue Dec 18 17:13:51 2018 +0000
x86/time: Alter tsc_set_info() to return an error value
Currently, tsc_set_info() performs no parameter checking, and an invalid
tsc_mode goes largely unnoticed. Fix it to reject invalid tsc_modes with
-EINVAL, and update the callers to check the return value.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
xen/arch/x86/domain.c | 7 +++++--
xen/arch/x86/domctl.c | 8 ++++----
xen/arch/x86/time.c | 18 +++++++++++++-----
xen/include/asm-x86/time.h | 6 +++---
4 files changed, 25 insertions(+), 14 deletions(-)
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index f0e0cdbb0e..ae9f24e457 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -599,8 +599,11 @@ int arch_domain_create(struct domain *d,
else
ASSERT_UNREACHABLE(); /* Not HVM and not PV? */
- /* initialize default tsc behavior in case tools don't */
- tsc_set_info(d, TSC_MODE_DEFAULT, 0UL, 0, 0);
+ if ( (rc = tsc_set_info(d, TSC_MODE_DEFAULT, 0, 0, 0)) != 0 )
+ {
+ ASSERT_UNREACHABLE();
+ goto fail;
+ }
/* PV/PVH guests get an emulated PIT too for video BIOSes to use. */
pit_init(d, cpu_khz);
diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
index aa8ad19479..ed46df8c5d 100644
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -975,10 +975,10 @@ long arch_do_domctl(
else
{
domain_pause(d);
- tsc_set_info(d, domctl->u.tsc_info.tsc_mode,
- domctl->u.tsc_info.elapsed_nsec,
- domctl->u.tsc_info.gtsc_khz,
- domctl->u.tsc_info.incarnation);
+ ret = tsc_set_info(d, domctl->u.tsc_info.tsc_mode,
+ domctl->u.tsc_info.elapsed_nsec,
+ domctl->u.tsc_info.gtsc_khz,
+ domctl->u.tsc_info.incarnation);
domain_unpause(d);
}
break;
diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
index 24d4c2794b..d80a5868a0 100644
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -2194,19 +2194,19 @@ void tsc_get_info(struct domain *d, uint32_t *tsc_mode,
* only the last "sticks" and all are completed before the guest executes
* an rdtsc instruction
*/
-void tsc_set_info(struct domain *d,
- uint32_t tsc_mode, uint64_t elapsed_nsec,
- uint32_t gtsc_khz, uint32_t incarnation)
+int tsc_set_info(struct domain *d,
+ uint32_t tsc_mode, uint64_t elapsed_nsec,
+ uint32_t gtsc_khz, uint32_t incarnation)
{
ASSERT(!is_system_domain(d));
if ( is_pv_domain(d) && is_hardware_domain(d) )
{
d->arch.vtsc = 0;
- return;
+ return 0;
}
- switch ( d->arch.tsc_mode = tsc_mode )
+ switch ( tsc_mode )
{
bool enable_tsc_scaling;
@@ -2253,7 +2253,13 @@ void tsc_set_info(struct domain *d,
elapsed_nsec;
}
break;
+
+ default:
+ return -EINVAL;
}
+
+ d->arch.tsc_mode = tsc_mode;
+
d->arch.incarnation = incarnation + 1;
if ( is_hvm_domain(d) )
{
@@ -2280,6 +2286,8 @@ void tsc_set_info(struct domain *d,
}
recalculate_cpuid_policy(d);
+
+ return 0;
}
/* vtsc may incur measurable performance degradation, diagnose with this */
diff --git a/xen/include/asm-x86/time.h b/xen/include/asm-x86/time.h
index ce96ec9778..b85688dcfb 100644
--- a/xen/include/asm-x86/time.h
+++ b/xen/include/asm-x86/time.h
@@ -60,9 +60,9 @@ uint64_t pv_soft_rdtsc(const struct vcpu *v, const struct
cpu_user_regs *regs);
u64 gtime_to_gtsc(struct domain *d, u64 time);
u64 gtsc_to_gtime(struct domain *d, u64 tsc);
-void tsc_set_info(struct domain *d, uint32_t tsc_mode, uint64_t elapsed_nsec,
- uint32_t gtsc_khz, uint32_t incarnation);
-
+int tsc_set_info(struct domain *d, uint32_t tsc_mode, uint64_t elapsed_nsec,
+ uint32_t gtsc_khz, uint32_t incarnation);
+
void tsc_get_info(struct domain *d, uint32_t *tsc_mode, uint64_t *elapsed_nsec,
uint32_t *gtsc_khz, uint32_t *incarnation);
--
generated by git-patchbot for /home/xen/git/xen.git#staging
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |