Commit c7e0de8d authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

bdevperf: replace rte_timers with SPDK pollers



Change-Id: I718cf58e528b0debdfa1db00a522074795890654
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent b71e579d
Loading
Loading
Loading
Loading
+23 −21
Original line number Diff line number Diff line
@@ -45,11 +45,11 @@
#include <rte_malloc.h>
#include <rte_ring.h>
#include <rte_lcore.h>
#include <rte_timer.h>

#include "spdk/bdev.h"
#include "spdk/copy_engine.h"
#include "spdk/endian.h"
#include "spdk/event.h"
#include "spdk/log.h"
#include "spdk/io_channel.h"

@@ -72,7 +72,7 @@ static int g_show_performance_real_time = 0;
static bool g_run_failed = false;
static bool g_zcopy = true;

static struct rte_timer g_perf_timer;
static struct spdk_poller *g_perf_timer = NULL;

static void bdevperf_submit_single(struct io_target *target);

@@ -88,8 +88,8 @@ struct io_target {
	uint64_t		size_in_ios;
	uint64_t		offset_in_ios;
	bool			is_draining;
	struct rte_timer	run_timer;
	struct rte_timer	reset_timer;
	struct spdk_poller	*run_timer;
	struct spdk_poller	*reset_timer;
};

struct io_target *head[RTE_MAX_LCORE];
@@ -155,8 +155,8 @@ bdevperf_construct_targets(void)
		}

		target->is_draining = false;
		rte_timer_init(&target->run_timer);
		rte_timer_init(&target->reset_timer);
		target->run_timer = NULL;
		target->reset_timer = NULL;

		head[index] = target;
		g_target_count++;
@@ -170,7 +170,7 @@ end_run(spdk_event_t event)
{
	if (--g_target_count == 0) {
		if (g_show_performance_real_time) {
			rte_timer_stop_sync(&g_perf_timer);
			spdk_poller_unregister(&g_perf_timer, NULL);
		}
		spdk_app_stop(0);
	}
@@ -343,18 +343,19 @@ bdevperf_submit_io(struct io_target *target, int queue_depth)
}

static void
end_target(struct rte_timer *timer, void *arg)
end_target(void *arg)
{
	struct io_target *target = arg;

	spdk_poller_unregister(&target->run_timer, NULL);
	if (g_reset) {
		rte_timer_stop_sync(&target->reset_timer);
		spdk_poller_unregister(&target->reset_timer, NULL);
	}

	target->is_draining = true;
}

static void reset_target(struct rte_timer *timer, void *arg);
static void reset_target(void *arg);

static void
reset_cb(spdk_event_t event)
@@ -371,16 +372,18 @@ reset_cb(spdk_event_t event)

	rte_mempool_put(task_pool, task);

	rte_timer_reset(&target->reset_timer, rte_get_timer_hz() * 10, SINGLE,
			target->lcore, reset_target, target);
	spdk_poller_register(&target->reset_timer, reset_target, target, target->lcore,
			     NULL, 10 * 1000000);
}

static void
reset_target(struct rte_timer *timer, void *arg)
reset_target(void *arg)
{
	struct io_target *target = arg;
	struct bdevperf_task	*task = NULL;

	spdk_poller_unregister(&target->reset_timer, NULL);

	/* Do reset. */
	rte_mempool_get(task_pool, (void **)&task);
	task->target = target;
@@ -399,11 +402,11 @@ bdevperf_submit_on_core(spdk_event_t event)
		target->ch = spdk_bdev_get_io_channel(target->bdev, SPDK_IO_PRIORITY_DEFAULT);

		/* Start a timer to stop this I/O chain when the run is over */
		rte_timer_reset(&target->run_timer, rte_get_timer_hz() * g_time_in_sec, SINGLE,
				target->lcore, end_target, target);
		spdk_poller_register(&target->run_timer, end_target, target, target->lcore, NULL,
				     g_time_in_sec * 1000000);
		if (g_reset) {
			rte_timer_reset(&target->reset_timer, rte_get_timer_hz() * 10, SINGLE,
					target->lcore, reset_target, target);
			spdk_poller_register(&target->reset_timer, reset_target, target,
					     target->lcore, NULL, 10 * 1000000);
		}
		bdevperf_submit_io(target, g_queue_depth);
		target = target->next;
@@ -464,7 +467,7 @@ performance_dump(int io_time)
}

static void
performance_statistics_thread(struct rte_timer *timer, void *arg)
performance_statistics_thread(void *arg)
{
	performance_dump(1);
}
@@ -481,9 +484,8 @@ bdevperf_run(spdk_event_t evt)

	/* Start a timer to dump performance numbers */
	if (g_show_performance_real_time) {
		rte_timer_init(&g_perf_timer);
		rte_timer_reset(&g_perf_timer, rte_get_timer_hz(), PERIODICAL,
				rte_get_master_lcore(), performance_statistics_thread, NULL);
		spdk_poller_register(&g_perf_timer, performance_statistics_thread, NULL,
				     spdk_app_get_current_core(), NULL, 1000000);
	}

	/* Send events to start all I/O */