powerpc: 64bit optimised __clear_user
authorAnton Blanchard <anton@samba.org>
Sun, 27 May 2012 19:54:03 +0000 (19:54 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 3 Jul 2012 04:14:41 +0000 (14:14 +1000)
commit17968fbbd19f1bb281ee4eb2548764ac5664c4ec
treec6b7a68ea7897e6bf213bffa4795fe209609cba9
parentd136e27326a3bd50d7929a43c018abf13e426b7e
powerpc: 64bit optimised __clear_user

I noticed __clear_user high up in a profile of one of my RAID stress
tests. The testcase was doing a dd from /dev/zero which ends up
calling __clear_user.

__clear_user is basically a loop with a single 4 byte store which
is horribly slow. We can do much better by aligning the desination
and doing 32 bytes of 8 byte stores in a loop.

The following testcase was used to verify the patch:

http://ozlabs.org/~anton/junkcode/stress_clear_user.c

To show the improvement in performance I ran a dd from /dev/zero
to /dev/null on a POWER7 box:

Before:

# dd if=/dev/zero of=/dev/null bs=1M count=10000
10485760000 bytes (10 GB) copied, 3.72379 s, 2.8 GB/s

After:

# time dd if=/dev/zero of=/dev/null bs=1M count=10000
10485760000 bytes (10 GB) copied, 0.728318 s, 14.4 GB/s

Over 5x faster.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/lib/Makefile
arch/powerpc/lib/string.S
arch/powerpc/lib/string_64.S [new file with mode: 0644]