Recent changes (master)
Subsystems (2)
The following changes since commit 1684f7fd9047c7405264f462f76e1135c563ec33:
Add missing .help string for io_size option (2017-01-03 10:10:58 -0700)
are available in the git repository at:
git://git.kernel.dk/fio.git master
for you to fetch changes up to 847d544cce05157ec36f50b8214b26aff83aef01:
Style cleanups for arm crc32c hw support (2017-01-04 19:44:35 -0700)
----------------------------------------------------------------
Jens Axboe (1):
Style cleanups for arm crc32c hw support
wei xiao (1):
Add arm64 hardware assisted crc32c support
HOWTO | 5 +++ Makefile | 4 +- arch/arch-aarch64.h | 4 ++ configure | 23 +++++++++++ crc/crc32c-arm64.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++ crc/crc32c.h | 14 +++++++ crc/test.c | 1 + lib/bloom.c | 1 + options.c | 4 ++ verify.c | 2 + verify.h | 1 + 11 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 crc/crc32c-arm64.c
---
Diff of recent changes:
HOWTO +5 -0
@@ -1514,6 +1514,11 @@ verify=str If writing to a file, fio can verify the file contents back to regular software crc32c, if not supported by the system. + crc32c-arm64 Use hardware assisted crc32c calculation + provided on CRC enabled ARM 64-bits processors. + Falls back to regular software crc32c, if not + supported by the system. + crc32 Use a crc32 sum of the data area and store it in the header of each block.
Makefile +2 -2
@@ -234,10 +234,10 @@ endif T_DEDUPE_OBJS = t/dedupe.o T_DEDUPE_OBJS += lib/rbtree.o t/log.o mutex.o smalloc.o gettime.o crc/md5.o \ lib/memalign.o lib/bloom.o t/debug.o crc/xxhash.o t/arch.o \ - crc/murmur3.o crc/crc32c.o crc/crc32c-intel.o crc/fnv.o + crc/murmur3.o crc/crc32c.o crc/crc32c-intel.o crc/crc32c-arm64.o crc/fnv.o T_DEDUPE_PROGS = t/fio-dedupe -T_VS_OBJS = t/verify-state.o t/log.o crc/crc32c.o crc/crc32c-intel.o t/debug.o +T_VS_OBJS = t/verify-state.o t/log.o crc/crc32c.o crc/crc32c-intel.o crc/crc32c-arm64.o t/debug.o T_VS_PROGS = t/fio-verify-state T_PIPE_ASYNC_OBJS = t/read-to-pipe-async.o
arch/arch-aarch64.h +4 -0
@@ -27,4 +27,8 @@ static inline int arch_ffz(unsigned long bitmask)#define ARCH_HAVE_FFZ +#ifdef ARCH_HAVE_CRC_CRYPTO +#define ARCH_HAVE_ARM64_CRC_CRYPTO +#endif +#endif
configure +23 -0
@@ -342,6 +342,8 @@ elif check_define __s390__ ; then fi elif check_define __arm__ ; then cpu="arm" +elif check_define __aarch64__ ; then + cpu="aarch64" elif check_define __hppa__ ; then cpu="hppa" else
@@ -362,6 +364,9 @@ case "$cpu" in armv*b|armv*l|arm) cpu="arm" ;; + aarch64) + cpu="arm64" + ;; hppa|parisc|parisc64) cpu="hppa" ;;
@@ -1780,6 +1785,24 @@ if compile_prog "" "" "bool"; then fi echo "bool $have_bool" +########################################## +# check march=armv8-a+crc+crypto +march_armv8_a_crc_crypto="no" +if test "$cpu" = "arm64" ; then + cat > $TMPC <<EOF +int main(void) +{ + return 0; +} +EOF + if compile_prog "-march=armv8-a+crc+crypto" "" ""; then + march_armv8_a_crc_crypto="yes" + CFLAGS="$CFLAGS -march=armv8-a+crc+crypto -DARCH_HAVE_CRC_CRYPTO" + fi +fi +echo "march_armv8_a_crc_crypto $march_armv8_a_crc_crypto" + + ############################################################################# if test "$wordsize" = "64" ; then
crc/crc32c-arm64.c new file +115 -0
115 lines not on this page · raw message
crc/crc32c.h +14 -0
@@ -21,8 +21,19 @@#include "../arch/arch.h" extern uint32_t crc32c_sw (unsigned char const *,unsigned long ); +extern int crc32c_arm64_available;extern int crc32c_intel_available; +#ifdef ARCH_HAVE_ARM64_CRC_CRYPTO +extern uint32_t crc32c_arm64 (unsigned char const *,unsigned long ); +extern void crc32c_arm64_probe (void ); +#else +#define crc32c_arm64 crc32c_sw +static inline void crc32c_arm64_probe (void ) +{ +} +#endif +#ifdef ARCH_HAVE_SSE4_2 extern uint32_t crc32c_intel (unsigned char const *,unsigned long );extern void crc32c_intel_probe (void );
@@ -35,6 +46,9 @@ static inline void crc32c_intel_probe(void)static inline uint32_t fio_crc32c (unsigned char const *buf,unsigned long len) { +if (crc32c_arm64_available) +return crc32c_arm64 (buf, len); +if (crc32c_intel_available)return crc32c_intel (buf, len);
crc/test.c +1 -0
@@ -291,6 +291,7 @@ int fio_crctest(const char *type)int i, first =1 ;void *buf; +crc32c_arm64_probe ();crc32c_intel_probe ();if (!type)
lib/bloom.c +1 -0
@@ -65,6 +65,7 @@ struct bloom *bloom_new(uint64_t entries)struct bloom *b;size_t no_uints; +crc32c_arm64_probe ();crc32c_intel_probe (); b =malloc (sizeof (*b));
options.c +4 -0
@@ -2647,6 +2647,10 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .oval = VERIFY_CRC32C, .help = "Use crc32c checksums for verification (hw assisted, if available)", }, + { .ival = "crc32c-arm64", + .oval = VERIFY_CRC32C, + .help = "Use crc32c checksums for verification (hw assisted, if available)", + }, { .ival = "crc32c", .oval = VERIFY_CRC32C, .help = "Use crc32c checksums for verification (hw assisted, if available)",
verify.c +2 -0
@@ -1210,7 +1210,9 @@ nothing:void fio_verify_init (struct thread_data *td) {if (td->o.verify ==VERIFY_CRC32C_INTEL || + td->o.verify ==VERIFY_CRC32C_ARM64 || td->o.verify ==VERIFY_CRC32C ) { +crc32c_arm64_probe ();crc32c_intel_probe (); } }
verify.h +1 -0
@@ -15,6 +15,7 @@ enum {VERIFY_CRC64 ,/* crc64 sum data blocks */ VERIFY_CRC32 ,/* crc32 sum data blocks */ VERIFY_CRC32C ,/* crc32c sum data blocks */ +VERIFY_CRC32C_ARM64 ,/* crc32c sum data blocks with hw */ VERIFY_CRC32C_INTEL ,/* crc32c sum data blocks with hw */ VERIFY_CRC16 ,/* crc16 sum data blocks */ VERIFY_CRC7, /* crc7 sum data blocks */