Use try_cmpxchg64 instead of cmpxchg64 (*ptr, old, new) != old in sched_clock_{local,remote}. x86 cmpxchg returns success in ZF flag, so this change saves a compare after cmpxchg (and related move instruction in front of cmpxchg).
Unified · Split
| @@ -287,7 +287,7 @@ again: · 286 unmodified lines | ||
| 287 | 287 | clock = wrap_max(clock, min_clock); |
| 288 | 288 | clock = wrap_min(clock, max_clock); |
| 289 | 289 | |
| 290 | − if (cmpxchg64(&scd->clock, old_clock, clock) != old_clock) | |
| 290 | + if (!try_cmpxchg64(&scd->clock, &old_clock, clock)) | |
| 291 | 291 | goto again; |
| 292 | 292 | |
| 293 | 293 | return clock; |
| @@ -349,7 +349,7 @@ again: · 55 unmodified lines | ||
| 349 | 349 | val = remote_clock; |
| 350 | 350 | } |
| 351 | 351 | |
| 352 | − if (cmpxchg64(ptr, old_val, val) != old_val) | |
| 352 | + if (!try_cmpxchg64(ptr, &old_val, val)) | |
| 353 | 353 | goto again; |
| 354 | 354 | |
| 355 | 355 | return val; |