Flexible I/O Tester development
 help / color / mirror / Atom feed
* [PATCH] arch-ppc.h: Add ilog2 implementation for ppc64
@ 2015-08-11  9:41 Chandan Rajendra
  2015-08-13 18:45 ` Jens Axboe
  0 siblings, 1 reply; 2+ messages in thread
From: Chandan Rajendra @ 2015-08-11  9:41 UTC (permalink / raw)
  To: fio; +Cc: Chandan Rajendra, david, chandan

On a ppc64 machine, when fio is invoked with the following configuration file
(generated by fstests' generic/300 test), it loops indefinitely.

[global]
directory=/mnt/btrfs-xfstest-scratch
filesize=536870912
size=999G
continue_on_error=write
ignore_error=,ENOSPC
error_dump=0

create_on_open=1
fallocate=none
exitall=1

[direct_aio_raicer]
ioengine=libaio
iodepth=128*1
bs=128k
direct=1
numjobs=4
rw=randwrite
runtime=100*1
time_based
filename=racer

[falloc_raicer]
ioengine=falloc
runtime=100*1
iodepth=1
bssplit=128k/80:512k/10:32k/10
rw=randwrite
numjobs=1
filename=racer

[punch_hole_raicer]
ioengine=falloc
runtime=100*1
bs=4k
time_based=10
rw=randtrim
numjobs=2
filename=racer
time_based

[aio-dio-verifier]
ioengine=libaio
iodepth=128*1
numjobs=1
verify=crc32c-intel
verify_fatal=1
verify_dump=1
verify_backlog=1024
verify_async=4
verifysort=1
direct=1
bs=4k
rw=randwrite
filename=aio-dio-verifier

This is because arch_ffz() ends up invoking the 32-bit version of __ilog2()
which always returns a bit number in the range 0 - 31. This can cause
"overlap" variable in axmap_set_fn() to never becomes zero.

To fix this the commit adds a 64-bit version of __ilog2() (obtained from the
Linux kernel's arch/powerpc/include/asm/bitops.h).

Signed-off-by: Chandan Rajendra <chandan@linux.vnet.ibm.com>
---
 arch/arch-ppc.h | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/arch/arch-ppc.h b/arch/arch-ppc.h
index d4a080c..aed41f9 100644
--- a/arch/arch-ppc.h
+++ b/arch/arch-ppc.h
@@ -33,18 +33,24 @@
 
 #define write_barrier()	__asm__ __volatile__ ("sync" : : : "memory")
 
+#ifdef __powerpc64__
+#define PPC_CNTLZL "cntlzd"
+#else
+#define PPC_CNTLZL "cntlzw"
+#endif
+
 static inline int __ilog2(unsigned long bitmask)
 {
 	int lz;
 
-	asm ("cntlzw %0,%1" : "=r" (lz) : "r" (bitmask));
-	return 31 - lz;
+	asm (PPC_CNTLZL " %0,%1" : "=r" (lz) : "r" (bitmask));
+	return BITS_PER_LONG - 1 - lz;
 }
 
 static inline int arch_ffz(unsigned long bitmask)
 {
 	if ((bitmask = ~bitmask) == 0)
-		return 32;
+		return BITS_PER_LONG;
 	return  __ilog2(bitmask & -bitmask);
 }
 
-- 
2.1.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] arch-ppc.h: Add ilog2 implementation for ppc64
  2015-08-11  9:41 [PATCH] arch-ppc.h: Add ilog2 implementation for ppc64 Chandan Rajendra
@ 2015-08-13 18:45 ` Jens Axboe
  0 siblings, 0 replies; 2+ messages in thread
From: Jens Axboe @ 2015-08-13 18:45 UTC (permalink / raw)
  To: Chandan Rajendra; +Cc: fio, david, chandan

On Tue, Aug 11 2015, Chandan Rajendra wrote:
> On a ppc64 machine, when fio is invoked with the following configuration file
> (generated by fstests' generic/300 test), it loops indefinitely.
> 
> [global]
> directory=/mnt/btrfs-xfstest-scratch
> filesize=536870912
> size=999G
> continue_on_error=write
> ignore_error=,ENOSPC
> error_dump=0
> 
> create_on_open=1
> fallocate=none
> exitall=1
> 
> [direct_aio_raicer]
> ioengine=libaio
> iodepth=128*1
> bs=128k
> direct=1
> numjobs=4
> rw=randwrite
> runtime=100*1
> time_based
> filename=racer
> 
> [falloc_raicer]
> ioengine=falloc
> runtime=100*1
> iodepth=1
> bssplit=128k/80:512k/10:32k/10
> rw=randwrite
> numjobs=1
> filename=racer
> 
> [punch_hole_raicer]
> ioengine=falloc
> runtime=100*1
> bs=4k
> time_based=10
> rw=randtrim
> numjobs=2
> filename=racer
> time_based
> 
> [aio-dio-verifier]
> ioengine=libaio
> iodepth=128*1
> numjobs=1
> verify=crc32c-intel
> verify_fatal=1
> verify_dump=1
> verify_backlog=1024
> verify_async=4
> verifysort=1
> direct=1
> bs=4k
> rw=randwrite
> filename=aio-dio-verifier
> 
> This is because arch_ffz() ends up invoking the 32-bit version of __ilog2()
> which always returns a bit number in the range 0 - 31. This can cause
> "overlap" variable in axmap_set_fn() to never becomes zero.
> 
> To fix this the commit adds a 64-bit version of __ilog2() (obtained from the
> Linux kernel's arch/powerpc/include/asm/bitops.h).

Awesome, thanks! This resolves an issue that someone reported a while
back that only happened on ppc, and this explains it.

-- 
Jens Axboe



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-08-13 18:45 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-11  9:41 [PATCH] arch-ppc.h: Add ilog2 implementation for ppc64 Chandan Rajendra
2015-08-13 18:45 ` Jens Axboe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox