The following changes since commit 20cf5aab85ddfa8f58a1638925ccdfe4d57f3f69: engines/rbd: potential re-use of active fio_rbd_iou (2015-10-13 15:40:47 -0400) are available in the git repository at: git://git.kernel.dk/fio.git master for you to fetch changes up to 4d400e92d60d2c8e02f30c5eba41238567e6e603: strlcat: fix header guard typo (2015-10-19 22:37:39 -0600) ---------------------------------------------------------------- Jens Axboe (2): verify: add faster 'memory is all zeroes' helper strlcat: fix header guard typo lib/strlcat.h | 2 +- verify.c | 67 ++++++++++++++++++++++++++++++++++++++++------------------- 2 files changed, 47 insertions(+), 22 deletions(-) --- Diff of recent changes: diff --git a/lib/strlcat.h b/lib/strlcat.h index 34b668e..baeace4 100644 --- a/lib/strlcat.h +++ b/lib/strlcat.h @@ -1,5 +1,5 @@ #ifndef FIO_STRLCAT_H -#define FIO_STRLCAT_h +#define FIO_STRLCAT_H size_t strlcat(char *dst, const char *src, size_t size); diff --git a/verify.c b/verify.c index ee9160c..19bec75 100644 --- a/verify.c +++ b/verify.c @@ -661,38 +661,63 @@ int verify_io_u_async(struct thread_data *td, struct io_u **io_u_ptr) return 0; } +/* + * Thanks Rusty, for spending the time so I don't have to. + * + * http://rusty.ozlabs.org/?p=560 + */ +static int mem_is_zero(const void *data, size_t length) +{ + const unsigned char *p = data; + size_t len; + + /* Check first 16 bytes manually */ + for (len = 0; len < 16; len++) { + if (!length) + return 1; + if (*p) + return 0; + p++; + length--; + } + + /* Now we know that's zero, memcmp with self. */ + return memcmp(data, p, length) == 0; +} + +static int mem_is_zero_slow(const void *data, size_t length, size_t *offset) +{ + const unsigned char *p = data; + + *offset = 0; + while (length) { + if (*p) + break; + (*offset)++; + length--; + p++; + } + + return !length; +} + static int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u) { - static char zero_buf[1024]; - unsigned int this_len, len; - int ret = 0; - void *p; + size_t offset; if (!td->o.trim_zero) return 0; - len = io_u->buflen; - p = io_u->buf; - do { - this_len = sizeof(zero_buf); - if (this_len > len) - this_len = len; - if (memcmp(p, zero_buf, this_len)) { - ret = EILSEQ; - break; - } - len -= this_len; - p += this_len; - } while (len); - - if (!ret) + if (mem_is_zero(io_u->buf, io_u->buflen)) return 0; + mem_is_zero_slow(io_u->buf, io_u->buflen, &offset); + log_err("trim: verify failed at file %s offset %llu, length %lu" ", block offset %lu\n", io_u->file->file_name, io_u->offset, io_u->buflen, - (unsigned long) (p - io_u->buf)); - return ret; + (unsigned long) offset); + return EILSEQ; } static int verify_header(struct io_u *io_u, struct thread_data *td, -- To unsubscribe from this list: send the line "unsubscribe fio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html