Message ID | 20210913083908.48408-3-nsaenzju@redhat.com |
---|---|
State | New |
Headers | show |
Series | None | expand |
On Mon, 13 Sep 2021, Nicolas Saenz Julienne wrote: > Some architectures have special purpose registers to query the system > counter's frequency. Let's use that when available. > > Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com> > -- > > Changes since v1: > - Use cleaner method to have generic and arch functions to measure > couter's freq > > src/oslat/oslat.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/src/oslat/oslat.c b/src/oslat/oslat.c > index c90ec1a..5fce223 100644 > --- a/src/oslat/oslat.c > +++ b/src/oslat/oslat.c > @@ -74,6 +74,16 @@ static inline void frc(uint64_t *pval) > # elif defined(__aarch64__) > # define relax() __asm__ __volatile("yield" : : : "memory") > > +#define arch_measure_counter_mhz > +static unsigned int measure_counter_mhz(void) > +{ > + unsigned int val; > + > + __asm__ __volatile__("mrs %0, cntfrq_el0" : "=r" (val)); > + > + return val / 1e6; > +} > + > static inline void frc(uint64_t *pval) > { > /* > @@ -241,6 +251,7 @@ static int move_to_core(int core_i) > return sched_setaffinity(0, sizeof(cpus), &cpus); > } > > +#ifndef arch_measure_counter_mhz > static cycles_t __measure_counter_hz(void) > { > struct timeval tvs, tve; > @@ -273,6 +284,7 @@ static unsigned int measure_counter_mhz(void) > > return (unsigned int) (m / 1000000); > } > +#endif > > static void thread_init(struct thread *t) > { > -- > 2.31.1 > > Reviewed-by: Peter Xu <peterx@redhat.com> Signed-off-by: John Kacur <jkacur@redhat.com>
diff --git a/src/oslat/oslat.c b/src/oslat/oslat.c index c90ec1a..5fce223 100644 --- a/src/oslat/oslat.c +++ b/src/oslat/oslat.c @@ -74,6 +74,16 @@ static inline void frc(uint64_t *pval) # elif defined(__aarch64__) # define relax() __asm__ __volatile("yield" : : : "memory") +#define arch_measure_counter_mhz +static unsigned int measure_counter_mhz(void) +{ + unsigned int val; + + __asm__ __volatile__("mrs %0, cntfrq_el0" : "=r" (val)); + + return val / 1e6; +} + static inline void frc(uint64_t *pval) { /* @@ -241,6 +251,7 @@ static int move_to_core(int core_i) return sched_setaffinity(0, sizeof(cpus), &cpus); } +#ifndef arch_measure_counter_mhz static cycles_t __measure_counter_hz(void) { struct timeval tvs, tve; @@ -273,6 +284,7 @@ static unsigned int measure_counter_mhz(void) return (unsigned int) (m / 1000000); } +#endif static void thread_init(struct thread *t) {
Some architectures have special purpose registers to query the system counter's frequency. Let's use that when available. Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com> -- Changes since v1: - Use cleaner method to have generic and arch functions to measure couter's freq src/oslat/oslat.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)