[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86/vpt: update last_guest_time with cmpxchg and drop pl_time_lock
Similarly to PV vTSC emulation, optimize HVM side for consistency and scalability by dropping a spinlock protecting a single variable. Signed-off-by: Igor Druzhinin <igor.druzhinin@xxxxxxxxxx> --- xen/arch/x86/hvm/vpt.c | 19 ++++++++----------- xen/include/asm-x86/hvm/vpt.h | 5 ++--- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/xen/arch/x86/hvm/vpt.c b/xen/arch/x86/hvm/vpt.c index ecd25d7..bf4c432 100644 --- a/xen/arch/x86/hvm/vpt.c +++ b/xen/arch/x86/hvm/vpt.c @@ -30,7 +30,6 @@ void hvm_init_guest_time(struct domain *d) { struct pl_time *pl = d->arch.hvm.pl_time; - spin_lock_init(&pl->pl_time_lock); pl->stime_offset = -(u64)get_s_time(); pl->last_guest_time = 0; } @@ -38,24 +37,22 @@ void hvm_init_guest_time(struct domain *d) uint64_t hvm_get_guest_time_fixed(const struct vcpu *v, uint64_t at_tsc) { struct pl_time *pl = v->domain->arch.hvm.pl_time; - u64 now; + s_time_t old, new, now = get_s_time_fixed(at_tsc) + pl->stime_offset; /* Called from device models shared with PV guests. Be careful. */ ASSERT(is_hvm_vcpu(v)); - spin_lock(&pl->pl_time_lock); - now = get_s_time_fixed(at_tsc) + pl->stime_offset; - if ( !at_tsc ) { - if ( (int64_t)(now - pl->last_guest_time) > 0 ) - pl->last_guest_time = now; - else - now = ++pl->last_guest_time; + do { + old = pl->last_guest_time; + new = now > pl->last_guest_time ? now : old + 1; + } while ( cmpxchg(&pl->last_guest_time, old, new) != old ); } - spin_unlock(&pl->pl_time_lock); + else + new = now; - return now + v->arch.hvm.stime_offset; + return new + v->arch.hvm.stime_offset; } void hvm_set_guest_time(struct vcpu *v, u64 guest_time) diff --git a/xen/include/asm-x86/hvm/vpt.h b/xen/include/asm-x86/hvm/vpt.h index 99169dd..f5ccb49 100644 --- a/xen/include/asm-x86/hvm/vpt.h +++ b/xen/include/asm-x86/hvm/vpt.h @@ -135,10 +135,9 @@ struct pl_time { /* platform time */ struct HPETState vhpet; struct PMTState vpmt; /* guest_time = Xen sys time + stime_offset */ - int64_t stime_offset; + s_time_t stime_offset; /* Ensures monotonicity in appropriate timer modes. */ - uint64_t last_guest_time; - spinlock_t pl_time_lock; + s_time_t last_guest_time; struct domain *domain; }; -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |