Commit 31e3adba authored by Jim Harris's avatar Jim Harris Committed by Konrad Sztyber
Browse files

spdk_nvme_perf: use rand_r() twice when choosing random I/O offset



Fixes issue #3494.

Signed-off-by: default avatarJim Harris <jim.harris@samsung.com>
Change-Id: I5b86c1ab7e532730e365fccb96b5964051f07b76
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/24622


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Community-CI: Mellanox Build Bot
parent 682732fe
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -1487,7 +1487,7 @@ register_ctrlr(struct spdk_nvme_ctrlr *ctrlr, struct trid_entry *trid_entry)
static inline void
submit_single_io(struct perf_task *task)
{
	uint64_t		offset_in_ios;
	uint64_t		rand_value, offset_in_ios;
	int			rc;
	struct ns_worker_ctx	*ns_ctx = task->ns_ctx;
	struct ns_entry		*entry = ns_ctx->entry;
@@ -1497,7 +1497,14 @@ submit_single_io(struct perf_task *task)
	if (entry->zipf) {
		offset_in_ios = spdk_zipf_generate(entry->zipf);
	} else if (g_is_random) {
		offset_in_ios = rand_r(&entry->seed) % entry->size_in_ios;
		/* rand_r() returns int, so we need to use two calls to ensure
		 * we get a large enough value to cover a very large block
		 * device.
		 */
		rand_value = (uint64_t)rand_r(&entry->seed) *
			     ((uint64_t)RAND_MAX + 1) +
			     rand_r(&entry->seed);
		offset_in_ios = rand_value % entry->size_in_ios;
	} else {
		offset_in_ios = ns_ctx->offset_in_ios++;
		if (ns_ctx->offset_in_ios == entry->size_in_ios) {