Skip to contentSkip to conversation

KVM: pvclock_clocksource_read while-loop optimization

PATCH In review Arjan Koers 2 participants 2 messages Jan 1, 2011 – Jan 3, 2011

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 KVM: pvclock_clocksource_read while-loop optimization

Reduce the number of while-loop iterations (from two to one in the most common situation)

arch/x86/kernel/pvclock.c +3 -2
index 42eb330..8f52acb 100644
@@ -93,7 +93,7 @@ cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
 	struct pvclock_shadow_time shadow;
 	unsigned version;
 	cycle_t ret, offset;
-	u64 last;
+	u64 last, save;
 
 	do {
 		version = pvclock_get_time_values(&shadow, src);
@@ -125,8 +125,9 @@ cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
 	do {
 		if (ret < last)
 			return last;
+		save = last;
 		last = atomic64_cmpxchg(&last_value, last, ret);
-	} while (unlikely(last != ret));
+	} while (unlikely(last != save));
 
 	return ret;
 }
#1 lore raw
Quoted 19 lines · Arjan Koers

Reduce the number of while-loop iterations (from two to one in the most common situation)

arch/x86/kernel/pvclock.c +1 -1
index 42eb330..8f52acb 100644
@@ -93,7 +93,7 @@ cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
 	struct pvclock_shadow_time shadow;
 	unsigned version;
 	cycle_t ret, offset;
-	u64 last;
+	u64 last, save;
 
 	do {
 		version = pvclock_get_time_values(&shadow, src);

arch/x86/kernel/pvclock.c cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src) · line 133

Quoted 10 lines
arch/x86/kernel/pvclock.c +2 -1
@@ -125,8 +125,9 @@ cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
 	do {
 		if (ret < last)
 			return last;
+		save = last;
 		last = atomic64_cmpxchg(&last_value, last, ret);
-	} while (unlikely(last != ret));
+	} while (unlikely(last != save));
 
 	return ret;
 }

Hey, good catch.