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).
Showing the changes to kernel (1 of 1 file). Show all
Unified · Split
| @@ -287,7 +287,7 @@ again: · 286 unmodified lines | |||
| 287 | clock = wrap_max(clock, min_clock); | 287 | clock = wrap_max(clock, min_clock); |
| 288 | clock = wrap_min(clock, max_clock); | 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 | goto again; | 291 | goto again; |
| 292 | 292 | ||
| 293 | return clock; | 293 | return clock; |
| @@ -349,7 +349,7 @@ again: · 55 unmodified lines | |||
| 349 | val = remote_clock; | 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 | goto again; | 353 | goto again; |
| 354 | 354 | ||
| 355 | return val; | 355 | return val; |