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

rpc: convert rte_timer to spdk_poller



Change-Id: I7bea4382fc8d46579a2b5c5b066dcef881541b02
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 6b566ff1
Loading
Loading
Loading
Loading
+23 −18
Original line number Diff line number Diff line
@@ -45,20 +45,15 @@
#include <errno.h>
#include <string.h>

#include <rte_config.h>
#include <rte_cycles.h>
#include <rte_timer.h>
#include <rte_lcore.h>

#include "spdk/queue.h"
#include "spdk/rpc.h"
#include "spdk/event.h"
#include "spdk/conf.h"
#include "spdk/log.h"

#define RPC_SELECT_INTERVAL	(rte_get_timer_hz() >> 8) /* ~4ms */
#define RPC_SELECT_INTERVAL	4000 /* 4ms */

static struct rte_timer g_rpc_timer;
static struct spdk_poller *g_rpc_poller = NULL;

static struct spdk_jsonrpc_server *g_jsonrpc_server = NULL;

@@ -71,7 +66,7 @@ struct spdk_rpc_method {
static SLIST_HEAD(, spdk_rpc_method) g_rpc_methods = SLIST_HEAD_INITIALIZER(g_rpc_methods);

static void
spdk_rpc_server_do_work(struct rte_timer *timer, void *arg)
spdk_rpc_server_do_work(void *arg)
{
	spdk_jsonrpc_server_poll(g_jsonrpc_server);
}
@@ -138,7 +133,7 @@ spdk_jsonrpc_handler(
}

static void
spdk_rpc_setup(struct rte_timer *timer, void *arg)
spdk_rpc_setup(void *arg)
{
	struct sockaddr_in	serv_addr;
	uint16_t		port;
@@ -161,32 +156,42 @@ spdk_rpc_setup(struct rte_timer *timer, void *arg)
		return;
	}

	rte_timer_reset(&g_rpc_timer, RPC_SELECT_INTERVAL, PERIODICAL,
			rte_lcore_id(), spdk_rpc_server_do_work, NULL);
	/* Unregister the one-shot setup and register the periodic rpc_server_do_work */
	spdk_poller_unregister(&g_rpc_poller, NULL);
	spdk_poller_register(&g_rpc_poller, spdk_rpc_server_do_work, NULL, spdk_app_get_current_core(),
			     NULL, RPC_SELECT_INTERVAL);
}

static int
spdk_rpc_initialize(void)
{
	rte_timer_init(&g_rpc_timer);

	/*
	 * Defer setup of the RPC service until the timer subsystem has started.  This
	 * Defer setup of the RPC service until the reactor has started.  This
	 *  allows us to detect the RPC listen socket as a suitable proxy for determining
	 *  when the SPDK application has finished initialization and ready for logins
	 *  or RPC commands.
	 */
	rte_timer_reset(&g_rpc_timer, 0, SINGLE, rte_lcore_id(), spdk_rpc_setup, NULL);
	spdk_poller_register(&g_rpc_poller, spdk_rpc_setup, NULL, spdk_app_get_current_core(),
			     NULL, 0);
	return 0;
}

static int
spdk_rpc_finish(void)
static void
spdk_rpc_finish_cleanup(struct spdk_event *event)
{
	rte_timer_stop(&g_rpc_timer);
	if (g_jsonrpc_server) {
		spdk_jsonrpc_server_shutdown(g_jsonrpc_server);
	}
}

static int
spdk_rpc_finish(void)
{
	struct spdk_event *complete;

	complete = spdk_event_allocate(spdk_app_get_current_core(), spdk_rpc_finish_cleanup,
				       NULL, NULL, NULL);
	spdk_poller_unregister(&g_rpc_poller, complete);
	return 0;
}