bdevperf: save offset and unmap desc in bdevperf_task
This is preferable to rooting around the bdev_io structure directly - which will no longer work if we want to support modifying bdev_io structures in place for simple bdev transformations like partitions. Signed-off-by: Jim Harris <james.r.harris@intel.com> Change-Id: I0c5007030d8a8b84649397c5ec55351497604fc0
This commit is contained in:
parent
0a573526b6
commit
133c4a70c1
@ -51,9 +51,11 @@
|
|||||||
#include "spdk/io_channel.h"
|
#include "spdk/io_channel.h"
|
||||||
|
|
||||||
struct bdevperf_task {
|
struct bdevperf_task {
|
||||||
struct iovec iov;
|
struct iovec iov;
|
||||||
struct io_target *target;
|
struct io_target *target;
|
||||||
void *buf;
|
void *buf;
|
||||||
|
uint64_t offset;
|
||||||
|
struct spdk_scsi_unmap_bdesc bdesc;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int g_io_size = 0;
|
static int g_io_size = 0;
|
||||||
@ -200,7 +202,7 @@ bdevperf_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status,
|
|||||||
} else if (g_verify || g_reset || g_unmap) {
|
} else if (g_verify || g_reset || g_unmap) {
|
||||||
assert(bdev_io->u.read.iovcnt == 1);
|
assert(bdev_io->u.read.iovcnt == 1);
|
||||||
if (memcmp(task->buf, bdev_io->u.read.iov.iov_base, g_io_size) != 0) {
|
if (memcmp(task->buf, bdev_io->u.read.iov.iov_base, g_io_size) != 0) {
|
||||||
printf("Buffer mismatch! Disk Offset: %lu\n", bdev_io->u.read.offset);
|
printf("Buffer mismatch! Disk Offset: %lu\n", task->offset);
|
||||||
target->is_draining = true;
|
target->is_draining = true;
|
||||||
g_run_failed = true;
|
g_run_failed = true;
|
||||||
}
|
}
|
||||||
@ -240,12 +242,9 @@ bdevperf_unmap_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status s
|
|||||||
memset(task->buf, 0, g_io_size);
|
memset(task->buf, 0, g_io_size);
|
||||||
|
|
||||||
/* Read the data back in */
|
/* Read the data back in */
|
||||||
spdk_bdev_read(target->bdev, target->ch, NULL,
|
spdk_bdev_read(target->bdev, target->ch, NULL, task->offset, g_io_size,
|
||||||
from_be64(&bdev_io->u.unmap.unmap_bdesc->lba) * target->bdev->blocklen,
|
|
||||||
from_be32(&bdev_io->u.unmap.unmap_bdesc->block_count) * target->bdev->blocklen,
|
|
||||||
bdevperf_complete, task);
|
bdevperf_complete, task);
|
||||||
|
|
||||||
free(bdev_io->u.unmap.unmap_bdesc);
|
|
||||||
spdk_bdev_free_io(bdev_io);
|
spdk_bdev_free_io(bdev_io);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -261,22 +260,16 @@ bdevperf_verify_write_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_s
|
|||||||
|
|
||||||
if (g_unmap) {
|
if (g_unmap) {
|
||||||
/* Unmap the data */
|
/* Unmap the data */
|
||||||
struct spdk_scsi_unmap_bdesc *bdesc = calloc(1, sizeof(*bdesc));
|
to_be64(&task->bdesc.lba, task->offset / target->bdev->blocklen);
|
||||||
if (bdesc == NULL) {
|
to_be32(&task->bdesc.block_count, g_io_size / target->bdev->blocklen);
|
||||||
fprintf(stderr, "memory allocation failure\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
to_be64(&bdesc->lba, bdev_io->u.write.offset / target->bdev->blocklen);
|
spdk_bdev_unmap(target->bdev, target->ch, &task->bdesc, 1, bdevperf_unmap_complete,
|
||||||
to_be32(&bdesc->block_count, bdev_io->u.write.len / target->bdev->blocklen);
|
|
||||||
|
|
||||||
spdk_bdev_unmap(target->bdev, target->ch, bdesc, 1, bdevperf_unmap_complete,
|
|
||||||
task);
|
task);
|
||||||
} else {
|
} else {
|
||||||
/* Read the data back in */
|
/* Read the data back in */
|
||||||
spdk_bdev_read(target->bdev, target->ch, NULL,
|
spdk_bdev_read(target->bdev, target->ch, NULL,
|
||||||
bdev_io->u.write.offset,
|
task->offset,
|
||||||
bdev_io->u.write.len,
|
g_io_size,
|
||||||
bdevperf_complete, task);
|
bdevperf_complete, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -321,21 +314,22 @@ bdevperf_submit_single(struct io_target *target)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
task->offset = offset_in_ios * g_io_size;
|
||||||
if (g_verify || g_reset || g_unmap) {
|
if (g_verify || g_reset || g_unmap) {
|
||||||
memset(task->buf, rand_r(&seed) % 256, g_io_size);
|
memset(task->buf, rand_r(&seed) % 256, g_io_size);
|
||||||
task->iov.iov_base = task->buf;
|
task->iov.iov_base = task->buf;
|
||||||
task->iov.iov_len = g_io_size;
|
task->iov.iov_len = g_io_size;
|
||||||
spdk_bdev_writev(bdev, ch, &task->iov, 1, offset_in_ios * g_io_size, g_io_size,
|
spdk_bdev_writev(bdev, ch, &task->iov, 1, task->offset, g_io_size,
|
||||||
bdevperf_verify_write_complete, task);
|
bdevperf_verify_write_complete, task);
|
||||||
} else if ((g_rw_percentage == 100) ||
|
} else if ((g_rw_percentage == 100) ||
|
||||||
(g_rw_percentage != 0 && ((rand_r(&seed) % 100) < g_rw_percentage))) {
|
(g_rw_percentage != 0 && ((rand_r(&seed) % 100) < g_rw_percentage))) {
|
||||||
rbuf = g_zcopy ? NULL : task->buf;
|
rbuf = g_zcopy ? NULL : task->buf;
|
||||||
spdk_bdev_read(bdev, ch, rbuf, offset_in_ios * g_io_size, g_io_size,
|
spdk_bdev_read(bdev, ch, rbuf, task->offset, g_io_size,
|
||||||
bdevperf_complete, task);
|
bdevperf_complete, task);
|
||||||
} else {
|
} else {
|
||||||
task->iov.iov_base = task->buf;
|
task->iov.iov_base = task->buf;
|
||||||
task->iov.iov_len = g_io_size;
|
task->iov.iov_len = g_io_size;
|
||||||
spdk_bdev_writev(bdev, ch, &task->iov, 1, offset_in_ios * g_io_size, g_io_size,
|
spdk_bdev_writev(bdev, ch, &task->iov, 1, task->offset, g_io_size,
|
||||||
bdevperf_complete, task);
|
bdevperf_complete, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user