* [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