* [patch 1/1] [PATCH] fio: fix s390 timing for older machines/binutils
2014-04-10 13:09 [patch 0/1] Further timing and nop fixes for the s390 architecture ehrhardt
@ 2014-04-10 13:09 ` ehrhardt
2014-04-10 14:04 ` Jens Axboe
0 siblings, 1 reply; 3+ messages in thread
From: ehrhardt @ 2014-04-10 13:09 UTC (permalink / raw)
To: fio; +Cc: Christian Ehrhardt
[-- Attachment #1: fix-s390stck-for-older-systems.patch --]
[-- Type: text/plain, Size: 2838 bytes --]
From: Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
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 <ehrhardt@linux.vnet.ibm.com>
---
[diffstat]
arch/arch-s390.h | 12 ++++++++----
configure | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 4 deletions(-)
[diff]
--- a/arch/arch-s390.h
+++ b/arch/arch-s390.h
@@ -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;
}
--- a/configure
+++ b/configure
@@ -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
^ permalink raw reply [flat|nested] 3+ messages in thread