Commit 133c4a70 authored by Jim Harris's avatar Jim Harris Committed by Daniel Verkamp
Browse files

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: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: I0c5007030d8a8b84649397c5ec55351497604fc0
parent 0a573526
Loading
Loading
Loading
Loading
+16 −22
Original line number Diff line number Diff line
@@ -54,6 +54,8 @@ struct bdevperf_task {
	struct iovec			iov;
	struct io_target		*target;
	void				*buf;
	uint64_t			offset;
	struct spdk_scsi_unmap_bdesc	bdesc;
};

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) {
		assert(bdev_io->u.read.iovcnt == 1);
		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;
			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);

	/* Read the data back in */
	spdk_bdev_read(target->bdev, target->ch, NULL,
		       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,
	spdk_bdev_read(target->bdev, target->ch, NULL, task->offset, g_io_size,
		       bdevperf_complete, task);

	free(bdev_io->u.unmap.unmap_bdesc);
	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) {
		/* Unmap the data */
		struct spdk_scsi_unmap_bdesc *bdesc = calloc(1, sizeof(*bdesc));
		if (bdesc == NULL) {
			fprintf(stderr, "memory allocation failure\n");
			exit(1);
		}

		to_be64(&bdesc->lba, bdev_io->u.write.offset / target->bdev->blocklen);
		to_be32(&bdesc->block_count, bdev_io->u.write.len / target->bdev->blocklen);
		to_be64(&task->bdesc.lba, task->offset / target->bdev->blocklen);
		to_be32(&task->bdesc.block_count, g_io_size / target->bdev->blocklen);

		spdk_bdev_unmap(target->bdev, target->ch, bdesc, 1, bdevperf_unmap_complete,
		spdk_bdev_unmap(target->bdev, target->ch, &task->bdesc, 1, bdevperf_unmap_complete,
				task);
	} else {
		/* Read the data back in */
		spdk_bdev_read(target->bdev, target->ch, NULL,
			       bdev_io->u.write.offset,
			       bdev_io->u.write.len,
			       task->offset,
			       g_io_size,
			       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) {
		memset(task->buf, rand_r(&seed) % 256, g_io_size);
		task->iov.iov_base = task->buf;
		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);
	} else if ((g_rw_percentage == 100) ||
		   (g_rw_percentage != 0 && ((rand_r(&seed) % 100) < g_rw_percentage))) {
		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);
	} else {
		task->iov.iov_base = task->buf;
		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);
	}