Further timing and nop fixes for the s390 architecture
cover Further timing and nop fixes for the s390 architecture
PATCH 1/1 fio: fix s390 timing for older machines/binutils
From: Christian Ehrhardt <[email protected]>
Older gcc/binutils or one with very low default march will refuse to use stckf. On top of that machines older than a z196 don not even have the store clock fast facility.
To fix all of those issues, check for the facilities in configure step and make the usage of stckf and a matching march dependent to it.
---
[diffstat]
arch/arch-s390.h | 12 ++++++++---- configure | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-)
[diff]
arch/arch-s390.h +8 -4
@@ -22,15 +22,19 @@#define read_barrier () asm volatile("bcr 15,0" : : : "memory")#define write_barrier () asm volatile("bcr 15,0" : : : "memory") -/* -* Fio needs monotonic (never lower), but not strict monotonic (never the same) -* so store clock fast is enough -*/ static inline unsigned long long get_cpu_clock (void ) {unsigned long long clk; +#ifdef CONFIG_S390_Z196_FACILITIES +/* +* Fio needs monotonic (never lower), but not strict monotonic (never +* the same) so store clock fast is enough. +*/ __asm__ __volatile__("stckf %0" :"=Q" (clk) : :"cc" ); +#else + __asm__ __volatile__("stck %0" :"=Q" (clk) : :"cc" ); +#endif return clk>>12 ; }
configure +34 -0
@@ -1181,6 +1181,36 @@ if compile_prog "" "" "setvbuf"; then fi echo "setvbuf $setvbuf" +########################################## +# Check if we support stckf on s390 +s390_z196_facilities="no" +cat > $TMPC << EOF +#define STFLE_BITS_Z196 45 /* various z196 facilities ... */ +int main(int argc, char **argv) +{ + /* We want just 1 double word to be returned. */ + register unsigned long reg0 asm("0") = 0; + unsigned long stfle_bits; + asm volatile(".machine push" "\n\t" + ".machine \"z9-109\"" "\n\t" + "stfle %0" "\n\t" + ".machine pop" "\n" + : "=QS" (stfle_bits), "+d" (reg0) + : : "cc"); + + if ((stfle_bits & (1UL << (63 - STFLE_BITS_Z196))) != 0) + return 0; + else + return -1; +} +EOF +if compile_prog "" "" "s390_z196_facilities"; then + $TMPE + if [[ $? -eq 0 ]]; then + s390_z196_facilities="yes" + fi +fi +echo "s390_z196_facilities $s390_z196_facilities" ############################################################################# if test "$wordsize" = "64" ; then
@@ -1311,6 +1341,10 @@ fi if test "$setvbuf" = "yes" ; then output_sym "CONFIG_SETVBUF" fi +if test "$s390_z196_facilities" = "yes" ; then + output_sym "CONFIG_S390_Z196_FACILITIES" + CFLAGS="$CFLAGS -march=z9-109" +fi echo "LIBS+=$LIBS" >> $config_host_mak echo "CFLAGS+=$CFLAGS" >> $config_host_mak
Jens Axboe
AppliedRe: [patch 1/1] [PATCH] fio: fix s390 timing for older machines/binutils
Quoted 10 lines · On 2014-04-10 07:09, [email protected] wrote:
From: Christian Ehrhardt<[email protected]>
Older gcc/binutils or one with very low default march will refuse to use stckf. On top of that machines older than a z196 don not even have the store clock fast facility.
To fix all of those issues, check for the facilities in configure step and make the usage of stckf and a matching march dependent to it.
Signed-off-by Christian Ehrhardt<[email protected]>
Thanks, applied.
Signature · 1 line
Jens Axboe