Skip to content

Commit

Permalink
zeroskip: fix crc32 build for hosts not supporting SSE4.2
Browse files Browse the repository at this point in the history
Signed-off-by: Robert Stepanek <rsto@fastmailteam.com>
  • Loading branch information
rsto committed Sep 19, 2023
1 parent aced7ec commit 506feb0
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 53 deletions.
6 changes: 5 additions & 1 deletion zeroskip/benchmark/crc32bench.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ static void usage(const char *progname)

static int run_hardware(void)
{
#ifdef HAVE_SSE42
uint64_t start, finish;
uint32_t bytes = 0;

Expand All @@ -55,6 +56,9 @@ static int run_hardware(void)

fprintf(stderr, "crc32c_hw : %u bytes in %" PRIu64 " μs.\n",
bytes, (finish - start));
#else
fprintf(stderr, "crc32c_hw : not supported\n");
#endif
fprintf(stdout, "------------------------------------------------\n");
return 0;
}
Expand All @@ -66,7 +70,7 @@ static int run_software(void)

start = get_time_now();
for (int i = 0; i < NUM_RUNS; i++) {
bytes += crc32c_hw(0, buf, strlen(buf));
bytes += crc32c_sw(0, buf, strlen(buf));
}
finish = get_time_now();

Expand Down
2 changes: 2 additions & 0 deletions zeroskip/include/libzeroskip/crc32c.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@
extern void crc32c_init(void);

extern uint32_t crc32c_sw(uint32_t crc, const void *buf, size_t len);
#ifdef HAVE_SSE42
extern uint32_t crc32c_hw(uint32_t crc, const void *buf, size_t len);
#endif

extern uint32_t crc32c(uint32_t crc, const void *buf, size_t len);
extern uint32_t crc32c_map(const char *base, unsigned len);
Expand Down
2 changes: 1 addition & 1 deletion zeroskip/src/mfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -535,7 +535,7 @@ uint32_t crc32_end(struct mfile **mfp)
{
if ((*mfp)->compute_crc) {
(*mfp)->crc32_data_len = (*mfp)->offset - (*mfp)->crc32_begin_offset;
(*mfp)->crc32 = crc32c_hw((*mfp)->crc32,
(*mfp)->crc32 = crc32c((*mfp)->crc32,
((*mfp)->ptr + (*mfp)->crc32_begin_offset),
(*mfp)->crc32_data_len);
(*mfp)->compute_crc = 0;
Expand Down
40 changes: 20 additions & 20 deletions zeroskip/src/zeroskip-dotzsdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,17 +103,17 @@ int zs_dotzsdb_create(struct zsdb_priv *priv)
sptr += sizeof(uint32_t);

/* CRC */
priv->dotzsdb.crc = crc32c_hw(0, 0, 0);
priv->dotzsdb.crc = crc32c_hw(priv->dotzsdb.crc,
priv->dotzsdb.crc = crc32c(0, 0, 0);
priv->dotzsdb.crc = crc32c(priv->dotzsdb.crc,
(void *)&priv->dotzsdb.signature,
sizeof(uint64_t));
priv->dotzsdb.crc = crc32c_hw(priv->dotzsdb.crc,
priv->dotzsdb.crc = crc32c(priv->dotzsdb.crc,
(void *)&priv->dotzsdb.offset,
sizeof(uint64_t));
priv->dotzsdb.crc = crc32c_hw(priv->dotzsdb.crc,
priv->dotzsdb.crc = crc32c(priv->dotzsdb.crc,
(void *)&priv->dotzsdb.uuidstr,
UUID_STRLEN);
priv->dotzsdb.crc = crc32c_hw(priv->dotzsdb.crc,
priv->dotzsdb.crc = crc32c(priv->dotzsdb.crc,
(void *)&priv->dotzsdb.curidx,
sizeof(uint32_t));
*((uint32_t *)sptr) = hton32(priv->dotzsdb.crc);
Expand Down Expand Up @@ -202,14 +202,14 @@ int zs_dotzsdb_validate(struct zsdb_priv *priv)
priv->dotzsdb.curidx = ntoh32(dothdr->curidx);

/* Verify CRC */
crc = crc32c_hw(0, 0, 0);
crc = crc32c_hw(crc, (void *)&priv->dotzsdb.signature,
crc = crc32c(0, 0, 0);
crc = crc32c(crc, (void *)&priv->dotzsdb.signature,
sizeof(uint64_t));
crc = crc32c_hw(crc, (void *)&priv->dotzsdb.offset,
crc = crc32c(crc, (void *)&priv->dotzsdb.offset,
sizeof(uint64_t));
crc = crc32c_hw(crc, (void *)&priv->dotzsdb.uuidstr,
crc = crc32c(crc, (void *)&priv->dotzsdb.uuidstr,
UUID_STRLEN);
crc = crc32c_hw(crc, (void *)&priv->dotzsdb.curidx,
crc = crc32c(crc, (void *)&priv->dotzsdb.curidx,
sizeof(uint32_t));

if (crc != ntoh32(dothdr->crc)) {
Expand Down Expand Up @@ -427,14 +427,14 @@ int zs_dotzsdb_update_begin(struct zsdb_priv *priv)
priv->dotzsdb.curidx = ntoh32(dothdr->curidx);

/* Verify CRC */
crc = crc32c_hw(0, 0, 0);
crc = crc32c_hw(crc, (void *)&priv->dotzsdb.signature,
crc = crc32c(0, 0, 0);
crc = crc32c(crc, (void *)&priv->dotzsdb.signature,
sizeof(uint64_t));
crc = crc32c_hw(crc, (void *)&priv->dotzsdb.offset,
crc = crc32c(crc, (void *)&priv->dotzsdb.offset,
sizeof(uint64_t));
crc = crc32c_hw(crc, (void *)&priv->dotzsdb.uuidstr,
crc = crc32c(crc, (void *)&priv->dotzsdb.uuidstr,
UUID_STRLEN);
crc = crc32c_hw(crc, (void *)&priv->dotzsdb.curidx,
crc = crc32c(crc, (void *)&priv->dotzsdb.curidx,
sizeof(uint32_t));

if (crc != ntoh32(dothdr->crc)) {
Expand Down Expand Up @@ -512,17 +512,17 @@ int zs_dotzsdb_update_end(struct zsdb_priv *priv)
sptr += sizeof(uint32_t);

/* CRC */
priv->dotzsdb.crc = crc32c_hw(0, 0, 0);
priv->dotzsdb.crc = crc32c_hw(priv->dotzsdb.crc,
priv->dotzsdb.crc = crc32c(0, 0, 0);
priv->dotzsdb.crc = crc32c(priv->dotzsdb.crc,
(void *)&priv->dotzsdb.signature,
sizeof(uint64_t));
priv->dotzsdb.crc = crc32c_hw(priv->dotzsdb.crc,
priv->dotzsdb.crc = crc32c(priv->dotzsdb.crc,
(void *)&priv->dotzsdb.offset,
sizeof(uint64_t));
priv->dotzsdb.crc = crc32c_hw(priv->dotzsdb.crc,
priv->dotzsdb.crc = crc32c(priv->dotzsdb.crc,
(void *)&priv->dotzsdb.uuidstr,
UUID_STRLEN);
priv->dotzsdb.crc = crc32c_hw(priv->dotzsdb.crc,
priv->dotzsdb.crc = crc32c(priv->dotzsdb.crc,
(void *)&priv->dotzsdb.curidx,
sizeof(uint32_t));

Expand Down
8 changes: 4 additions & 4 deletions zeroskip/src/zeroskip-file.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,18 +280,18 @@ int zs_file_write_commit_record(struct zsdb_file *f, int final)
val = ((uint64_t)lc.type1 << 56); /* type 1 */
write_be64(ptr + pos, val);
pos += sizeof(uint64_t);
lccrc = crc32c_hw(crc, (void *)&val, sizeof(uint64_t));
lccrc = crc32c(crc, (void *)&val, sizeof(uint64_t));

val = lc.length;
write_be64(ptr + pos, val); /* length */
pos += sizeof(uint64_t);
lccrc = crc32c_hw(lccrc, (void *)&val, sizeof(uint64_t));
lccrc = crc32c(lccrc, (void *)&val, sizeof(uint64_t));

val = 0;
val = ((uint64_t)lc.type2 << 56); /* type 2 */

/* The final CRC */
lccrc = crc32c_hw(lccrc, (void *)&val, sizeof(uint64_t));
lccrc = crc32c(lccrc, (void *)&val, sizeof(uint64_t));
lc.crc32 = lccrc;

val |= (uint64_t)lc.crc32; /* crc */
Expand All @@ -315,7 +315,7 @@ int zs_file_write_commit_record(struct zsdb_file *f, int final)
val = ((uint64_t)sc.type << 56); /* type */
val |= ((uint64_t)sc.length << 32); /* length */
/* The final CRC */
sccrc = crc32c_hw(crc, (void *)&val, sizeof(uint64_t));
sccrc = crc32c(crc, (void *)&val, sizeof(uint64_t));

sc.crc32 = sccrc;

Expand Down
26 changes: 13 additions & 13 deletions zeroskip/src/zeroskip-header.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ int zs_header_write(struct zsdb_file *f)
return ZS_ERROR;
}

crc = crc32c_hw(0, 0, 0);
crc = crc32c(0, 0, 0);

/* Signature */
memcpy(sptr, &f->header.signature, sizeof(uint64_t));
Expand All @@ -67,12 +67,12 @@ int zs_header_write(struct zsdb_file *f)
/* compute the crc32 of the the fields of the header minus the
crc32 field */

crc = crc32c_hw(0, 0, 0);
crc = crc32c_hw(crc, (void *)&f->header.signature, sizeof(uint64_t));
crc = crc32c_hw(crc, (void *)&f->header.version, sizeof(uint32_t));
crc = crc32c_hw(crc, (void *)&f->header.uuid, sizeof(uuid_t));
crc = crc32c_hw(crc, (void *)&f->header.startidx, sizeof(uint32_t));
crc = crc32c_hw(crc, (void *)&f->header.endidx, sizeof(uint32_t));
crc = crc32c(0, 0, 0);
crc = crc32c(crc, (void *)&f->header.signature, sizeof(uint64_t));
crc = crc32c(crc, (void *)&f->header.version, sizeof(uint32_t));
crc = crc32c(crc, (void *)&f->header.uuid, sizeof(uuid_t));
crc = crc32c(crc, (void *)&f->header.startidx, sizeof(uint32_t));
crc = crc32c(crc, (void *)&f->header.endidx, sizeof(uint32_t));
*((uint32_t *)sptr) = hton32(crc);
sptr += sizeof(uint32_t);

Expand Down Expand Up @@ -153,12 +153,12 @@ int zs_header_validate(struct zsdb_file *f)
f->header.crc32 = ntoh32(phdr->crc32);

/* Check CRC32 */
crc = crc32c_hw(0, 0, 0);
crc = crc32c_hw(crc, (void *)&f->header.signature, sizeof(uint64_t));
crc = crc32c_hw(crc, (void *)&f->header.version, sizeof(uint32_t));
crc = crc32c_hw(crc, (void *)&f->header.uuid, sizeof(uuid_t));
crc = crc32c_hw(crc, (void *)&f->header.startidx, sizeof(uint32_t));
crc = crc32c_hw(crc, (void *)&f->header.endidx, sizeof(uint32_t));
crc = crc32c(0, 0, 0);
crc = crc32c(crc, (void *)&f->header.signature, sizeof(uint64_t));
crc = crc32c(crc, (void *)&f->header.version, sizeof(uint32_t));
crc = crc32c(crc, (void *)&f->header.uuid, sizeof(uuid_t));
crc = crc32c(crc, (void *)&f->header.startidx, sizeof(uint32_t));
crc = crc32c(crc, (void *)&f->header.endidx, sizeof(uint32_t));

if (crc != f->header.crc32) {
zslog(LOGDEBUG, "Checksum failed for zeroskip header: %u, expected: %u.\n",
Expand Down
12 changes: 6 additions & 6 deletions zeroskip/src/zeroskip-packed.c
Original file line number Diff line number Diff line change
Expand Up @@ -295,21 +295,21 @@ int zs_packed_file_open(const char *path,

/* compute the crc */
/* data */
crc = crc32c_hw(0, (void *)(f->mf->ptr + offset), (end_offset - offset));
crc = crc32c(0, (void *)(f->mf->ptr + offset), (end_offset - offset));

/* type1 */
t_data = read_be64(dataptr);
crc = crc32c_hw(crc, (void *)&t_data, sizeof(uint64_t));
crc = crc32c(crc, (void *)&t_data, sizeof(uint64_t));
dataptr = dataptr + sizeof(uint64_t);

/* len */
t_data = read_be64(dataptr);
crc = crc32c_hw(crc, (void *)&t_data, sizeof(uint64_t));
crc = crc32c(crc, (void *)&t_data, sizeof(uint64_t));
dataptr = dataptr + sizeof(uint64_t);

/* type 2 */
t_data = read_be64(dataptr) & 0xFF00000000000000;
crc = crc32c_hw(crc, (void *)&t_data, sizeof(uint64_t));
crc = crc32c(crc, (void *)&t_data, sizeof(uint64_t));

} else if (commit_rec_type == REC_TYPE_FINAL) {
unsigned char *dataptr;
Expand All @@ -320,11 +320,11 @@ int zs_packed_file_open(const char *path,

/* compute the crc */
/* data */
crc = crc32c_hw(0, (void *)(f->mf->ptr + offset), (end_offset - offset));
crc = crc32c(0, (void *)(f->mf->ptr + offset), (end_offset - offset));

/* type & len */
t_data = read_be64(dataptr) & 0xFFFFFFFF00000000;
crc = crc32c_hw(crc, (void *)&t_data, sizeof(uint64_t));
crc = crc32c(crc, (void *)&t_data, sizeof(uint64_t));
} else {
/* Should not reach here */
abort();
Expand Down
16 changes: 8 additions & 8 deletions zeroskip/src/zeroskip-record.c
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ static int zs_read_and_verify_commit_record(struct zsdb_file *f,
/* offset is the end of the short commit record */
*offset = *offset + ZS_SHORT_COMMIT_REC_SIZE;

crc = crc32c_hw(0, 0, 0);
crc = crc32c(0, 0, 0);

sc.type = rectype;
sc.length = (data >> 32) & 0xFFFFFF;
Expand All @@ -221,8 +221,8 @@ static int zs_read_and_verify_commit_record(struct zsdb_file *f,
/* The commit record without the CRC */
val = data & 0xFFFFFFFF00000000;

crc = crc32c_hw(crc, (void *)rptr, sc.length);
crc = crc32c_hw(crc, (void *)&val, sizeof(uint64_t));
crc = crc32c(crc, (void *)rptr, sc.length);
crc = crc32c(crc, (void *)&val, sizeof(uint64_t));

if (sc.crc32 != crc) {
zslog(LOGWARNING, "Checksum failed for record at offset: %zu\n",
Expand All @@ -240,7 +240,7 @@ static int zs_read_and_verify_commit_record(struct zsdb_file *f,
*offset = *offset + ZS_LONG_COMMIT_REC_SIZE;

/* Begin computing */
crc = crc32c_hw(0, 0, 0);
crc = crc32c(0, 0, 0);

lc.type1 = rectype;
lc.length = read_be64(fptr + sizeof(uint64_t));
Expand All @@ -253,10 +253,10 @@ static int zs_read_and_verify_commit_record(struct zsdb_file *f,
rptr = fptr - lc.length;

val = 0; /* 0 used to compute CRC */
crc = crc32c_hw(crc, (void *)rptr, lc.length);
crc = crc32c_hw(crc, (void *)&data, sizeof(uint64_t));
crc = crc32c_hw(crc, (void *)lc.length, sizeof(uint64_t));
crc = crc32c_hw(crc, (void *)&val, sizeof(uint64_t));
crc = crc32c(crc, (void *)rptr, lc.length);
crc = crc32c(crc, (void *)&data, sizeof(uint64_t));
crc = crc32c(crc, (void *)lc.length, sizeof(uint64_t));
crc = crc32c(crc, (void *)&val, sizeof(uint64_t));

if (lc.crc32 != crc) {
zslog(LOGWARNING, "Checksum failed for record at offset: %zu\n",
Expand Down

0 comments on commit 506feb0

Please sign in to comment.