[sheepdog] [PATCH] check ssse3 instructions before using isa-l library
Hitoshi Mitake
mitake.hitoshi at lab.ntt.co.jp
Tue Sep 30 09:37:35 CEST 2014
At Fri, 26 Sep 2014 11:51:23 +0800,
Robin Dong wrote:
>
> From: Robin Dong <sanbai at taobao.com>
>
> Add new macro 'HAVE_SSSE3', so we could choose zfec or isa-l
> by checking it.
>
> Signed-off-by: Robin Dong <sanbai at taobao.com>
> ---
> configure.ac | 10 ++++++++++
> include/fec.h | 18 ++++++++++--------
> lib/Makefile.am | 10 +++++++---
> lib/fec.c | 8 +++++---
> 4 files changed, 32 insertions(+), 14 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index f78aa3b..81cdf24 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -198,6 +198,16 @@ LINT_FLAGS="-weak -unrecog +posixlib +ignoresigns -fcnuse \
>
> AM_CONDITIONAL(BUILD_SHA1_HW, [[[[ $host = *x86_64* ]]]])
>
> +AC_TRY_COMPILE([],
> + [ __asm__ __volatile__ ("addsubpd" " %" "xmm0" ", %" "xmm1");],
> + CPU_SSSE3=true)
> +
> +if test $CPU_SSSE3 = true; then
> + AC_DEFINE_UNQUOTED([HAVE_SSSE3], [1], [have ssse3])
> +fi
It wouldn't comfortable that detecting SSSE3 based on testing a
compiler used for building. Because we can't build a binary for
machines which doesn't support the extension with a compiler which
supports the extension. Passing a parameter like --enable-isal and
switching libraries would be suitable.
Thanks,
Hitoshi
> +
> +AM_CONDITIONAL(BUILD_ISAL_HW, test $CPU_SSSE3 = true)
> +
> AC_ARG_ENABLE([fatal-warnings],
> [ --enable-fatal-warnings : enable fatal warnings. ],
> [ default="no" ])
> diff --git a/include/fec.h b/include/fec.h
> index 1ae32e4..b339c8d 100644
> --- a/include/fec.h
> +++ b/include/fec.h
> @@ -172,17 +172,18 @@ static inline void ec_encode(struct fec *ctx, const uint8_t *ds[],
> uint8_t *ps[])
> {
> int p = ctx->dp - ctx->d;
> - int pidx[p];
>
> - for (int i = 0; i < p; i++)
> - pidx[i] = ctx->d + i;
> -
> - if (cpu_has_ssse3)
> + for (int i = 0; i < p; i++) {
> + #ifdef HAVE_SSSE3
> ec_encode_data_sse(SD_EC_DATA_STRIPE_SIZE / ctx->d, ctx->d, p,
> ctx->ec_tbl, (unsigned char **)ds, ps);
> - else
> + #else
> + int pidx[p];
> + pidx[i] = ctx->d + i;
> fec_encode(ctx, ds, ps, pidx, p, SD_EC_DATA_STRIPE_SIZE /
> ctx->d);
> + #endif
> + }
> }
>
> /*
> @@ -207,9 +208,10 @@ static inline void ec_destroy(struct fec *ctx)
> static inline void ec_decode_buffer(struct fec *ctx, uint8_t *input[],
> const int in_idx[], char *buf, int idx)
> {
> - if (cpu_has_ssse3)
> + #ifdef HAVE_SSSE3
> isa_decode_buffer(ctx, input, in_idx, buf, idx);
> - else
> + #else
> fec_decode_buffer(ctx, input, in_idx, buf, idx);
> + #endif
> }
> #endif
> diff --git a/lib/Makefile.am b/lib/Makefile.am
> index a43076e..56ba504 100644
> --- a/lib/Makefile.am
> +++ b/lib/Makefile.am
> @@ -4,6 +4,10 @@ AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
>
> libsheepdog_a_DEPENDENCIES =
>
> +libsheepdog_a_SOURCES = event.c logger.c net.c util.c rbtree.c strbuf.c \
> + sha1.c option.c work.c sockfd_cache.c fec.c sd_inode.c
> +
> +if BUILD_ISAL_HW
> noinst_LIBRARIES = libisa.a libsheepdog.a
>
> libisa_a_SOURCES = $(shell find isa-l/ -type f -regex ".*\.\(c\|h\|asm\)") \
> @@ -12,9 +16,6 @@ libisa_a_SOURCES = $(shell find isa-l/ -type f -regex ".*\.\(c\|h\|asm\)") \
> isa-l/Makefile.nmake \
> isa-l/make.inc
>
> -libsheepdog_a_SOURCES = event.c logger.c net.c util.c rbtree.c strbuf.c \
> - sha1.c option.c work.c sockfd_cache.c fec.c sd_inode.c
> -
> libsheepdog_a_LIBADD = isa-l/bin/ec_base.o \
> isa-l/bin/ec_highlevel_func.o \
> isa-l/bin/ec_multibinary.o \
> @@ -26,6 +27,9 @@ libsheepdog_a_LIBADD = isa-l/bin/ec_base.o \
> isa-l/bin/gf_vect_dot_prod_sse.o \
> isa-l/bin/gf_vect_mul_avx.o \
> isa-l/bin/gf_vect_mul_sse.o
> +else
> +noinst_LIBRARIES = libsheepdog.a
> +endif
>
> if BUILD_SHA1_HW
> libsheepdog_a_SOURCES += sha1_ssse3.S
> diff --git a/lib/fec.c b/lib/fec.c
> index c4e7a6f..6de716a 100644
> --- a/lib/fec.c
> +++ b/lib/fec.c
> @@ -454,8 +454,9 @@ void fec_free(struct fec *p)
> assert(p != NULL && p->magic == (((FEC_MAGIC ^ p->d) ^ p->dp) ^
> (unsigned long) (p->enc_matrix)));
> free(p->enc_matrix);
> - if (cpu_has_ssse3)
> + #ifdef HAVE_SSSE3
> free(p->ec_tbl);
> + #endif
> free(p);
> }
>
> @@ -496,12 +497,13 @@ struct fec *fec_new(unsigned short d, unsigned short dp)
> *p = 1;
> free(tmp_m);
>
> - if (cpu_has_ssse3) {
> + #ifdef HAVE_SSSE3
> retval->ec_tbl = xmalloc(dp * d * 32);
> ec_init_tables(d, dp - d, retval->enc_matrix + (d * d),
> retval->ec_tbl);
> - } else
> + #else
> retval->ec_tbl = NULL;
> + #endif
> return retval;
> }
>
> --
> 1.9.1
>
> --
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog
More information about the sheepdog
mailing list