Skip to content

Commit

Permalink
x86: prefer RDTSCP in rdtsc_ordered()
Browse files Browse the repository at this point in the history
If available, its use is supposed to be cheaper than LFENCE+RDTSC, and
is virtually guaranteed to be cheaper than MFENCE+RDTSC.

Update commentary (and indentation) while there.

Suggested-by: Andrew Cooper <[email protected]>
Signed-off-by: Jan Beulich <[email protected]>
Reviewed-by: Andrew Cooper <[email protected]>
  • Loading branch information
jbeulich committed Oct 2, 2024
1 parent f9ce66e commit 3a38cc2
Showing 1 changed file with 18 additions and 12 deletions.
30 changes: 18 additions & 12 deletions xen/arch/x86/include/asm/msr.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,18 +108,24 @@ static inline uint64_t rdtsc(void)

static inline uint64_t rdtsc_ordered(void)
{
/*
* The RDTSC instruction is not ordered relative to memory access.
* The Intel SDM and the AMD APM are both vague on this point, but
* empirically an RDTSC instruction can be speculatively executed
* before prior loads. An RDTSC immediately after an appropriate
* barrier appears to be ordered as a normal load, that is, it
* provides the same ordering guarantees as reading from a global
* memory location that some other imaginary CPU is updating
* continuously with a time stamp.
*/
alternative("lfence", "mfence", X86_FEATURE_MFENCE_RDTSC);
return rdtsc();
uint64_t low, high, aux;

/*
* The RDTSC instruction is not serializing. Make it dispatch serializing
* for the purposes here by issuing LFENCE (or MFENCE if necessary) ahead
* of it.
*
* RDTSCP, otoh, "does wait until all previous instructions have executed
* and all previous loads are globally visible" (SDM) / "forces all older
* instructions to retire before reading the timestamp counter" (APM).
*/
alternative_io_2("lfence; rdtsc",
"mfence; rdtsc", X86_FEATURE_MFENCE_RDTSC,
"rdtscp", X86_FEATURE_RDTSCP,
ASM_OUTPUT2("=a" (low), "=d" (high), "=c" (aux)),
/* no inputs */);

return (high << 32) | low;
}

#define __write_tsc(val) wrmsrl(MSR_IA32_TSC, val)
Expand Down

0 comments on commit 3a38cc2

Please sign in to comment.