From e4cb3e344e8cfcf4d001f7e250703ab83034fab2 Mon Sep 17 00:00:00 2001 From: Ankit Kumar Date: Wed, 1 Nov 2023 00:15:40 +0530 Subject: [PATCH] crct10: use isa-l for crc if available isa-l provides fast implementation for various polynomials This will be only used for end to end data protection, and has a significant impact on performance. See: https://github.com/intel/isa-l Signed-off-by: Ankit Kumar --- HOWTO.rst | 4 ++++ Makefile | 4 ++++ configure | 22 ++++++++++++++++++++++ crc/crct10dif_common.c | 13 +++++++++++++ fio.1 | 4 ++++ 5 files changed, 47 insertions(+) diff --git a/HOWTO.rst b/HOWTO.rst index 6a8fb3e375..34d6afdf6e 100644 --- a/HOWTO.rst +++ b/HOWTO.rst @@ -2507,6 +2507,10 @@ with the caveat that when used on the command line, they must come after the If this is set to 0, fio generates protection information for write case and verifies for read case. Default: 1. + For 16 bit CRC generation fio will use isa-l if available otherwise + it will use the default slower generator. + (see: https://github.com/intel/isa-l) + .. option:: pi_chk=str[,str][,str] : [io_uring_cmd] Controls the protection information check. This can take one or more diff --git a/Makefile b/Makefile index cc8164b27d..7cf3b826c0 100644 --- a/Makefile +++ b/Makefile @@ -194,6 +194,10 @@ endif ifndef CONFIG_HAVE_STATX SOURCE += oslib/statx.c endif +ifdef CONFIG_LIBISAL + LIBS += $(LIBISAL_LIBS) + FIO_CFLAGS += $(LIBISAL_CFLAGS) +endif ifdef CONFIG_GFAPI SOURCE += engines/glusterfs.c SOURCE += engines/glusterfs_sync.c diff --git a/configure b/configure index 3e3f8132a3..4954bf61db 100755 --- a/configure +++ b/configure @@ -189,6 +189,7 @@ libiscsi="no" libnbd="no" libnfs="" xnvme="" +isal="" libblkio="" libzbc="" dfs="" @@ -262,6 +263,8 @@ for opt do ;; --disable-xnvme) xnvme="no" ;; + --disable-isal) isal="no" + ;; --disable-libblkio) libblkio="no" ;; --disable-tcmalloc) disable_tcmalloc="yes" @@ -322,6 +325,7 @@ if test "$show_help" = "yes" ; then echo "--enable-libiscsi Enable iscsi support" echo "--enable-libnbd Enable libnbd (NBD engine) support" echo "--disable-xnvme Disable xnvme support even if found" + echo "--disable-isal Disable isal support even if found" echo "--disable-libblkio Disable libblkio support even if found" echo "--disable-libzbc Disable libzbc even if found" echo "--disable-tcmalloc Disable tcmalloc support" @@ -2684,6 +2688,19 @@ if test "$xnvme" != "no" ; then fi print_config "xnvme engine" "$xnvme" +########################################## +# Check if we have isa-l +if test "$isal" != "no" ; then + if check_min_lib_version libisal 2.30.0; then + isal="yes" + isal_cflags=$(pkg-config --cflags libisal) + isal_libs=$(pkg-config --libs libisal) + else + isal="no" + fi +fi +print_config "isa-l" "$isal" + ########################################## # Check if we have libblkio if test "$libblkio" != "no" ; then @@ -3334,6 +3351,11 @@ if test "$xnvme" = "yes" ; then echo "LIBXNVME_CFLAGS=$xnvme_cflags" >> $config_host_mak echo "LIBXNVME_LIBS=$xnvme_libs" >> $config_host_mak fi +if test "$isal" = "yes" ; then + output_sym "CONFIG_LIBISAL" + echo "LIBISAL_CFLAGS=$isal_cflags" >> $config_host_mak + echo "LIBISAL_LIBS=$isal_libs" >> $config_host_mak +fi if test "$libblkio" = "yes" ; then output_sym "CONFIG_LIBBLKIO" echo "LIBBLKIO_CFLAGS=$libblkio_cflags" >> $config_host_mak diff --git a/crc/crct10dif_common.c b/crc/crct10dif_common.c index cfb2a1b18d..b163511480 100644 --- a/crc/crct10dif_common.c +++ b/crc/crct10dif_common.c @@ -24,6 +24,17 @@ * */ +#ifdef CONFIG_LIBISAL +#include + +extern unsigned short fio_crc_t10dif(unsigned short crc, + const unsigned char *buffer, + unsigned int len) +{ + return (crc16_t10dif(crc, buffer, len)); +} + +#else #include "crc-t10dif.h" /* Table generated using the following polynomium: @@ -76,3 +87,5 @@ extern unsigned short fio_crc_t10dif(unsigned short crc, return crc; } + +#endif diff --git a/fio.1 b/fio.1 index a8dc8f6c51..c4742aa925 100644 --- a/fio.1 +++ b/fio.1 @@ -2263,6 +2263,10 @@ size greater than protection information size, fio will not generate or verify the protection information portion of metadata for write or read case respectively. If this is set to 0, fio generates protection information for write case and verifies for read case. Default: 1. + +For 16 bit CRC generation fio will use isa-l if available otherwise it will +use the default slower generator. +(see: https://github.com/intel/isa-l) .TP .BI (io_uring_cmd)pi_chk \fR=\fPstr[,str][,str] Controls the protection information check. This can take one or more of these