Portability to Debian based distros.

Enable SSE4/AVX detection for AMD platforms (Bulldozer has both).
Portable long long int print formatting to silence gcc 4.6 warnings.
This commit is contained in:
Moinak Ghosh 2012-10-21 21:03:07 +05:30
parent 45487469d1
commit c5ebe1f30a
10 changed files with 114 additions and 36 deletions

View file

@ -99,10 +99,12 @@ RM = rm -f
COMMON_CPPFLAGS = -I. -I./lzma -I./lzfx -I./lz4 -I./rabin -I./bsdiff -DNODEFAULT_PROPS \ COMMON_CPPFLAGS = -I. -I./lzma -I./lzfx -I./lz4 -I./rabin -I./bsdiff -DNODEFAULT_PROPS \
-DFILE_OFFSET_BITS=64 -D_REENTRANT -D__USE_SSE_INTRIN__ -D_LZMA_PROB32 \ -DFILE_OFFSET_BITS=64 -D_REENTRANT -D__USE_SSE_INTRIN__ -D_LZMA_PROB32 \
-I./lzp @LIBBSCCPPFLAGS@ -I./crypto/skein -I./utils -I@OPENSSL_INCDIR@ \ -I./lzp @LIBBSCCPPFLAGS@ -I./crypto/skein -I./utils -I@OPENSSL_INCDIR@ \
-I./crypto/sha2 -I./crypto/scrypt -I./crypto/aes -I./crypto @KEYLEN@ -I./crypto/sha2 -I./crypto/scrypt -I./crypto/aes -I./crypto @KEYLEN@ \
@LIBBZ2_INC@ @LIBZ_INC@
COMMON_VEC_FLAGS = -ftree-vectorize COMMON_VEC_FLAGS = -ftree-vectorize
COMMON_LOOP_OPTFLAGS = $(VEC_FLAGS) -floop-interchange -floop-block COMMON_LOOP_OPTFLAGS = $(VEC_FLAGS) -floop-interchange -floop-block
LDLIBS = -ldl -lbz2 $(ZLIB_DIR) -lz -lm @LIBBSCLFLAGS@ -L@OPENSSL_LIBDIR@ -lcrypto -lrt LDLIBS = -ldl -L@LIBBZ2_DIR@ -lbz2 -L@LIBZ_DIR@ -lz -lm @LIBBSCLFLAGS@ \
-L@OPENSSL_LIBDIR@ -lcrypto -lrt
OBJS = $(MAINOBJS) $(LZMAOBJS) $(PPMDOBJS) $(LZFXOBJS) $(LZ4OBJS) $(CRCOBJS) \ OBJS = $(MAINOBJS) $(LZMAOBJS) $(PPMDOBJS) $(LZFXOBJS) $(LZ4OBJS) $(CRCOBJS) \
$(RABINOBJS) $(BSDIFFOBJS) $(LZPOBJS) @LIBBSCWRAPOBJ@ $(SKEINOBJS) $(SKEIN_BLOCK_OBJ) \ $(RABINOBJS) $(BSDIFFOBJS) $(LZPOBJS) @LIBBSCWRAPOBJ@ $(SKEINOBJS) $(SKEIN_BLOCK_OBJ) \
@SHA256ASM_OBJS@ @SHA256_OBJS@ @SHA256ASM_OBJS@ @SHA256_OBJS@

View file

@ -183,7 +183,7 @@ slab_cleanup(int quiet)
while (slab) { while (slab) {
if (slab->avail) { if (slab->avail) {
if (!quiet) { if (!quiet) {
fprintf(stderr, "%21llu %21llu %21llu\n",slab->sz, fprintf(stderr, "%21" PRIu64 " %21" PRIu64 " %21" PRIu64 "\n",slab->sz,
slab->allocs, slab->hits); slab->allocs, slab->hits);
} }
slab->allocs = 0; slab->allocs = 0;
@ -201,10 +201,10 @@ slab_cleanup(int quiet)
if (!quiet) { if (!quiet) {
fprintf(stderr, "==================================================================\n"); fprintf(stderr, "==================================================================\n");
fprintf(stderr, "Oversize Allocations : %llu\n", oversize_allocs); fprintf(stderr, "Oversize Allocations : %" PRIu64 "\n", oversize_allocs);
fprintf(stderr, "Total Requests : %llu\n", total_allocs); fprintf(stderr, "Total Requests : %" PRIu64 "\n", total_allocs);
fprintf(stderr, "Hash collisions : %llu\n", hash_collisions); fprintf(stderr, "Hash collisions : %" PRIu64 "\n", hash_collisions);
fprintf(stderr, "Leaked allocations : %llu\n", hash_entries); fprintf(stderr, "Leaked allocations : %" PRIu64 "\n", hash_entries);
} }
if (hash_entries > 0) { if (hash_entries > 0) {
@ -238,7 +238,7 @@ slab_cleanup(int quiet)
slab = &slabheads[i]; slab = &slabheads[i];
do { do {
if (slab->allocs > 0) if (slab->allocs > 0)
fprintf(stderr, "%21llu %21llu\n", \ fprintf(stderr, "%21" PRIu64 " %21" PRIu64 "\n", \
slab->sz, slab->allocs); slab->sz, slab->allocs);
slab = slab->next; slab = slab->next;
} while (slab); } while (slab);

83
config
View file

@ -37,6 +37,8 @@ libbsccppflags=
openssl_prefix= openssl_prefix=
openssl_libdir= openssl_libdir=
openssl_incdir= openssl_incdir=
libbz2_libdir=
libz_libdir=
sha256asmobjs= sha256asmobjs=
sha256objs= sha256objs=
keylen= keylen=
@ -93,7 +95,7 @@ OS=$(uname)
skeinblock='\$\(SKEIN_BLOCK_C\)' skeinblock='\$\(SKEIN_BLOCK_C\)'
if [ "$OS" = "Linux" ] if [ "$OS" = "Linux" ]
then then
plat=$(uname -r) plat=$(uname -m)
elif [ "$OS" = "SunOS" ] elif [ "$OS" = "SunOS" ]
then then
plat=$(isainfo -v) plat=$(isainfo -v)
@ -138,11 +140,13 @@ fi
# Detect OpenSSL library # Detect OpenSSL library
for lib in "${openssl_prefix}/lib64" "${openssl_prefix}/usr/lib64" \ for lib in "${openssl_prefix}/lib64" "${openssl_prefix}/usr/lib64" \
"${openssl_prefix}/lib" "${openssl_prefix}/usr/lib" \ "${openssl_prefix}/lib" "${openssl_prefix}/usr/lib" \
"${openssl_prefix}/ssl/lib64" "${openssl_prefix}/ssl/lib" "${openssl_prefix}/ssl/lib64" "${openssl_prefix}/ssl/lib" \
"${openssl_prefix}/lib/x86_64-linux-gnu" \
"${openssl_prefix}/usr/lib/x86_64-linux-gnu"
do do
if [ -d ${lib} ] if [ -d ${lib} ]
then then
if [ -f "${lib}/libcrypto.so" ] if [ -f "${lib}/libcrypto.so" -o -h "${lib}/libcrypto.so" ]
then then
openssl_libdir=${lib} openssl_libdir=${lib}
break break
@ -182,12 +186,75 @@ then
echo "ERROR: OpenSSL header files not detected." echo "ERROR: OpenSSL header files not detected."
if [ "x${openssl_prefix}" = "x" ] if [ "x${openssl_prefix}" = "x" ]
then then
echo "Depending on your system you may need to install the openssl-devel package." echo "Depending on your system you may need to install the openssl-devel or openssl-dev package."
fi fi
exit 1 exit 1
fi fi
# Detect other library packages
for libname in "libbz2" "libz"
do
for lib in "/lib64" "/usr/lib64" "/lib" "/usr/lib" "/lib/x86_64-linux-gnu" \
"/usr/lib/x86_64-linux-gnu" \
"${prefix}/lib64" "${prefix}/lib" "${prefix}/lib/x86_64-linux-gnu"
do
if [ -d ${lib} ]
then
if [ -f "${lib}/${libname}.so" -o -h "${lib}/${libname}.so" ]
then
eval "${libname}_libdir=${lib}"
break
else
if [ -f "${lib}/${libname}.a" ]
then
eval "${libname}_libdir=${lib}"
break
fi
fi
fi
done
done
if [ "x${libbz2_libdir}" = "x" ]
then
echo "ERROR: Libbz2 not detected."
echo " You may have to install libbz2-devel or libbz2-dev"
exit 1
fi
if [ "x${libz_libdir}" = "x" ]
then
echo "ERROR: Zlib not detected."
echo " You may have to install libz-devel or libz-dev"
exit 1
fi
libbz2_inc=
libz_inc=
# Detect other library headers
for hdr in "libbz2_inc:bzlib.h" "libz_inc:zlib.h"
do
_OIFS="$IFS"
IFS=":"
set -- ${hdr}
var=$1
hdrf=$2
IFS="$_OIFS"
for inc in "${prefix}/include" "/usr/include"
do
if [ -d ${inc} ]
then
if [ -f "${inc}/${hdrf}" ]
then
eval "${var}=\"-I${inc}\""
break
fi
fi
done
done
linkvar="LINK" linkvar="LINK"
compilevar="COMPILE" compilevar="COMPILE"
compilecppvar="COMPILE_cpp" compilecppvar="COMPILE_cpp"
@ -214,6 +281,10 @@ yasmvar="YASM"
openssllibdirvar="OPENSSL_LIBDIR" openssllibdirvar="OPENSSL_LIBDIR"
opensslincdirvar="OPENSSL_INCDIR" opensslincdirvar="OPENSSL_INCDIR"
libbz2libdirvar="LIBBZ2_DIR"
libzlibdirvar="LIBZ_DIR"
libbz2incvar="LIBBZ2_INC"
libzincvar="LIBZ_INC"
noslabcppflagsval= noslabcppflagsval=
debugstatscppflagsval= debugstatscppflagsval=
@ -246,5 +317,9 @@ s#@${sha256asmobjsvar}@#${sha256asmobjs}#g
s#@${sha256objsvar}@#${sha256objs}#g s#@${sha256objsvar}@#${sha256objs}#g
s#@${yasmvar}@#${yasm}#g s#@${yasmvar}@#${yasm}#g
s#@${keylenvar}@#${keylen}#g s#@${keylenvar}@#${keylen}#g
s#@${libbz2libdirvar}@#${libbz2_libdir}#g
s#@${libzlibdirvar}@#${libz_libdir}#g
s#@${libbz2incvar}@#${libbz2_inc}#g
s#@${libzincvar}@#${libz_inc}#g
" > Makefile " > Makefile

View file

@ -141,7 +141,7 @@ aes_init(aes_ctx_t *ctx, uchar_t *salt, int saltlen, uchar_t *pwd, int pwd_len,
} else { } else {
tv = tp.tv_sec * 1000UL + tp.tv_nsec; tv = tp.tv_sec * 1000UL + tp.tv_nsec;
} }
sprintf(num, "%llu", tv); sprintf(num, "%" PRIu64, tv);
PKCS5_PBKDF2_HMAC(num, strlen(num), salt, saltlen, PBE_ROUNDS, EVP_sha256(), 32, IV); PKCS5_PBKDF2_HMAC(num, strlen(num), salt, saltlen, PBE_ROUNDS, EVP_sha256(), 32, IV);
ctx->nonce = lzma_crc64(IV, 32, 0) & 0xffffffff00000000ULL; ctx->nonce = lzma_crc64(IV, 32, 0) & 0xffffffff00000000ULL;
// Nullify stack components // Nullify stack components

View file

@ -86,7 +86,7 @@ static update_func_ptr sha_update_func;
int int
APS_NAMESPACE(Init_SHA) (processor_info_t *pc) APS_NAMESPACE(Init_SHA) (processor_info_t *pc)
{ {
if (pc->proc_type == PROC_X64_INTEL) { if (pc->proc_type == PROC_X64_INTEL || pc->proc_type == PROC_X64_AMD) {
if (pc->avx_level > 0) { if (pc->avx_level > 0) {
sha_update_func = sha256_avx; sha_update_func = sha256_avx;

View file

@ -65,7 +65,7 @@ lz4_init(void **data, int *level, int nthreads, ssize_t chunksize)
int lev; int lev;
if (chunksize > LZ4_MAX_CHUNK) { if (chunksize > LZ4_MAX_CHUNK) {
fprintf(stderr, "Max allowed chunk size for LZ4 is: %d \n", fprintf(stderr, "Max allowed chunk size for LZ4 is: %ld \n",
LZ4_MAX_CHUNK); LZ4_MAX_CHUNK);
return (1); return (1);
} }

View file

@ -164,7 +164,7 @@ create_dedupe_context(uint64_t chunksize, uint64_t real_chunksize, int rab_blk_s
} }
if (chunksize < RAB_MIN_CHUNK_SIZE) { if (chunksize < RAB_MIN_CHUNK_SIZE) {
fprintf(stderr, "Minimum chunk size for Dedup must be %llu bytes\n", fprintf(stderr, "Minimum chunk size for Dedup must be %" PRIu64 " bytes\n",
RAB_MIN_CHUNK_SIZE); RAB_MIN_CHUNK_SIZE);
return (NULL); return (NULL);
} }
@ -488,7 +488,7 @@ dedupe_compress(dedupe_context_t *ctx, uchar_t *buf, ssize_t *size, ssize_t offs
process_blocks: process_blocks:
// If we found at least a few chunks, perform dedup. // If we found at least a few chunks, perform dedup.
DEBUG_STAT_EN(printf("Original size: %lld, blknum: %u\n", *size, blknum)); DEBUG_STAT_EN(printf("Original size: %" PRId64 ", blknum: %u\n", *size, blknum));
if (blknum > 2) { if (blknum > 2) {
ssize_t pos, matchlen, pos1; ssize_t pos, matchlen, pos1;
int valid = 1; int valid = 1;
@ -700,7 +700,7 @@ cont:
entries[2] = htonll(pos1 - dedupe_index_sz - RABIN_HDR_SIZE); entries[2] = htonll(pos1 - dedupe_index_sz - RABIN_HDR_SIZE);
*size = pos1; *size = pos1;
ctx->valid = 1; ctx->valid = 1;
DEBUG_STAT_EN(printf("Deduped size: %lld, blknum: %u, delta_calls: %u, delta_fails: %u\n", DEBUG_STAT_EN(printf("Deduped size: %" PRId64 ", blknum: %u, delta_calls: %u, delta_fails: %u\n",
*size, blknum, delta_calls, delta_fails)); *size, blknum, delta_calls, delta_fails));
/* /*
* Remaining header entries: size of compressed index and size of * Remaining header entries: size of compressed index and size of

View file

@ -112,23 +112,23 @@ cpuid_basic_identify(processor_info_t *pc)
pc->proc_type = PROC_X64_INTEL; pc->proc_type = PROC_X64_INTEL;
pc->sse_level = 2; pc->sse_level = 2;
if (raw.basic_cpuid[0][0] >= 1) {
// ECX has SSE 4.2 and AVX flags
// Bit 20 is SSE 4.2 and bit 28 indicates AVX
if (raw.basic_cpuid[1][2] & (1 << 20)) {
pc->sse_level = 4;
} else {
pc->sse_level = 3;
}
pc->avx_level = 0;
if (raw.basic_cpuid[1][2] & (1 << 28)) {
pc->avx_level = 1;
}
}
} else if (strcmp(raw.vendor_str, "AuthenticAMD") == 0) { } else if (strcmp(raw.vendor_str, "AuthenticAMD") == 0) {
pc->proc_type = PROC_X64_AMD; pc->proc_type = PROC_X64_AMD;
pc->sse_level = 2; pc->sse_level = 2;
} }
if (raw.basic_cpuid[0][0] >= 1) {
// ECX has SSE 4.2 and AVX flags
// Bit 20 is SSE 4.2 and bit 28 indicates AVX
if (raw.basic_cpuid[1][2] & (1 << 20)) {
pc->sse_level = 4;
} else {
pc->sse_level = 3;
}
pc->avx_level = 0;
if (raw.basic_cpuid[1][2] & (1 << 28)) {
pc->avx_level = 1;
}
}
} }
#endif #endif

View file

@ -155,19 +155,19 @@ bytes_to_size(uint64_t bytes)
uint64_t terabyte = gigabyte * 1024; uint64_t terabyte = gigabyte * 1024;
if (bytes < kilobyte) { if (bytes < kilobyte) {
sprintf(num, "%llu B", bytes); sprintf(num, "%" PRIu64 " B", bytes);
} else if (bytes < megabyte) { } else if (bytes < megabyte) {
sprintf(num, "%llu KB", bytes / kilobyte); sprintf(num, "%" PRIu64 " KB", bytes / kilobyte);
} else if (bytes < gigabyte) { } else if (bytes < gigabyte) {
sprintf(num, "%llu MB", bytes / megabyte); sprintf(num, "%" PRIu64 " MB", bytes / megabyte);
} else if (bytes < terabyte) { } else if (bytes < terabyte) {
sprintf(num, "%llu GB", bytes / gigabyte); sprintf(num, "%" PRIu64 " GB", bytes / gigabyte);
} else { } else {
sprintf(num, "%llu B", bytes); sprintf(num, "%" PRIu64 " B", bytes);
} }
return (num); return (num);
} }

View file

@ -27,6 +27,7 @@
#include <arpa/nameser_compat.h> #include <arpa/nameser_compat.h>
#include <sys/types.h> #include <sys/types.h>
#include <stdint.h> #include <stdint.h>
#include <inttypes.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {