diff mbox series

[kvm-unit-tests,v2,1/2] lib/s390x: time: add wrapper for stckf

Message ID 20220901150956.1075828-2-nrb@linux.ibm.com (mailing list archive)
State New, archived
Headers show
Series s390x: Add exit time test | expand

Commit Message

Nico Boehr Sept. 1, 2022, 3:09 p.m. UTC
Upcoming changes will do performance measurements of instructions. Since
stck is designed to return unique values even on concurrent calls, it is
unsuited for performance measurements. stckf should be used in this
case.

While touching that code, also add a missing cc clobber in
get_clock_us() and avoid the memory clobber by moving the clock value to
the output operands.

Hence, add a nice wrapper for stckf to the time library.

Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
 lib/s390x/asm/time.h | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

Comments

Claudio Imbrenda Oct. 6, 2022, 11:16 a.m. UTC | #1
On Thu,  1 Sep 2022 17:09:55 +0200
Nico Boehr <nrb@linux.ibm.com> wrote:

> Upcoming changes will do performance measurements of instructions. Since
> stck is designed to return unique values even on concurrent calls, it is
> unsuited for performance measurements. stckf should be used in this
> case.
> 
> While touching that code, also add a missing cc clobber in
> get_clock_us() and avoid the memory clobber by moving the clock value to
> the output operands.
> 
> Hence, add a nice wrapper for stckf to the time library.
> 
> Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
> ---
>  lib/s390x/asm/time.h | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/s390x/asm/time.h b/lib/s390x/asm/time.h
> index 7652a151e87a..8d2327a40541 100644
> --- a/lib/s390x/asm/time.h
> +++ b/lib/s390x/asm/time.h
> @@ -14,11 +14,20 @@
>  #define STCK_SHIFT_US	(63 - 51)
>  #define STCK_MAX	((1UL << 52) - 1)
>  
> +static inline uint64_t get_clock_fast(void)
> +{
> +	uint64_t clk;
> +
> +	asm volatile(" stckf %0 " : "=Q"(clk) : : "cc");
> +
> +	return clk;
> +}
> +
>  static inline uint64_t get_clock_us(void)
>  {
>  	uint64_t clk;
>  
> -	asm volatile(" stck %0 " : : "Q"(clk) : "memory");
> +	asm volatile(" stck %0 " : "=Q"(clk) : : "cc");

this fix is not needed if you use the wrapper for stck from your
other patch series

>  
>  	return clk >> STCK_SHIFT_US;
>  }
diff mbox series

Patch

diff --git a/lib/s390x/asm/time.h b/lib/s390x/asm/time.h
index 7652a151e87a..8d2327a40541 100644
--- a/lib/s390x/asm/time.h
+++ b/lib/s390x/asm/time.h
@@ -14,11 +14,20 @@ 
 #define STCK_SHIFT_US	(63 - 51)
 #define STCK_MAX	((1UL << 52) - 1)
 
+static inline uint64_t get_clock_fast(void)
+{
+	uint64_t clk;
+
+	asm volatile(" stckf %0 " : "=Q"(clk) : : "cc");
+
+	return clk;
+}
+
 static inline uint64_t get_clock_us(void)
 {
 	uint64_t clk;
 
-	asm volatile(" stck %0 " : : "Q"(clk) : "memory");
+	asm volatile(" stck %0 " : "=Q"(clk) : : "cc");
 
 	return clk >> STCK_SHIFT_US;
 }