ut/dif: Fill test data buffer by cyclic values to find potential issues

Previously, test data buffer was filled by one value, 0xAB, but
this may not be enough to detect future potential issues.

ut_data_pattern_verify() already did per-byte check, but size of
test data buffer is small and completion time of tests is not long.
So, even if we change ut_data_pattern_generate() to set per-byte
data instead of memset(), extra overhead of test completion time
will be negligible.

Change-Id: I35677b238f96a73c0c408f0818f080a92492dac6
Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/c/445430
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: wuzhouhui <wuzhouhui@kingsoft.com>
This commit is contained in:
Shuhei Matsumoto 2019-02-20 07:44:31 +09:00 committed by Ben Walker
parent 8696cd4288
commit 2fefd9f53c

View File

@ -37,16 +37,16 @@
#include "util/dif.c"
#define DATA_PATTERN 0xAB
#define GUARD_SEED 0xCD
#define DATA_PATTERN(offset) ((uint8_t)(0xAB + (offset)))
#define GUARD_SEED 0xCD
static int
ut_data_pattern_generate(struct iovec *iovs, int iovcnt,
uint32_t block_size, uint32_t md_size, uint32_t num_blocks)
{
struct _iov_iter iter;
uint32_t offset_blocks, offset_in_block, buf_len;
void *buf;
uint32_t offset_blocks, offset_in_block, buf_len, data_offset, i;
uint8_t *buf;
if (!_are_iovs_valid(iovs, iovcnt, block_size * num_blocks)) {
return -1;
@ -54,15 +54,19 @@ ut_data_pattern_generate(struct iovec *iovs, int iovcnt,
offset_blocks = 0;
_iov_iter_init(&iter, iovs, iovcnt);
data_offset = 0;
while (offset_blocks < num_blocks) {
offset_in_block = 0;
while (offset_in_block < block_size) {
_iov_iter_get_buf(&iter, &buf, &buf_len);
_iov_iter_get_buf(&iter, (void *)&buf, &buf_len);
if (offset_in_block < block_size - md_size) {
buf_len = spdk_min(buf_len,
block_size - md_size - offset_in_block);
memset(buf, DATA_PATTERN, buf_len);
for (i = 0; i < buf_len; i++) {
buf[i] = DATA_PATTERN(data_offset + i);
}
data_offset += buf_len;
} else {
buf_len = spdk_min(buf_len, block_size - offset_in_block);
memset(buf, 0, buf_len);
@ -81,7 +85,7 @@ ut_data_pattern_verify(struct iovec *iovs, int iovcnt,
uint32_t block_size, uint32_t md_size, uint32_t num_blocks)
{
struct _iov_iter iter;
uint32_t offset_blocks, offset_in_block, buf_len, i;
uint32_t offset_blocks, offset_in_block, buf_len, data_offset, i;
uint8_t *buf;
if (!_are_iovs_valid(iovs, iovcnt, block_size * num_blocks)) {
@ -90,6 +94,7 @@ ut_data_pattern_verify(struct iovec *iovs, int iovcnt,
offset_blocks = 0;
_iov_iter_init(&iter, iovs, iovcnt);
data_offset = 0;
while (offset_blocks < num_blocks) {
offset_in_block = 0;
@ -100,10 +105,11 @@ ut_data_pattern_verify(struct iovec *iovs, int iovcnt,
buf_len = spdk_min(buf_len,
block_size - md_size - offset_in_block);
for (i = 0; i < buf_len; i++) {
if (buf[i] != DATA_PATTERN) {
if (buf[i] != DATA_PATTERN(data_offset + i)) {
return -1;
}
}
data_offset += buf_len;
} else {
buf_len = spdk_min(buf_len, block_size - offset_in_block);
}