Commit 5d8c9453 authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

event: hide struct spdk_poller internals



This leaves more flexibility for future changes to the poller
representation without requiring API changes (after this one).

It also prevents the user from accidentally using poller fields in a
non-thread-safe way, since they can't be accessed directly anymore.

Change-Id: I7677d5b93668665d29ae39c5e0ba74333ad3f878
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 5c9d560b
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -142,8 +142,11 @@ struct spdk_bdev {
	/** Whether the poller is registered with the reactor */
	bool is_running;

	/** Which lcore the poller is running on */
	uint32_t lcore;

	/** Poller to submit IO and check completion */
	struct spdk_poller poller;
	struct spdk_poller *poller;

	/** True if another blockdev or a LUN is using this device */
	bool claimed;
+5 −16
Original line number Diff line number Diff line
@@ -102,14 +102,7 @@ typedef void (*spdk_poller_fn)(void *arg);
/**
 * \brief A poller is a function that is repeatedly called on an lcore.
 */
struct spdk_poller {
	TAILQ_ENTRY(spdk_poller)	tailq;
	uint32_t			lcore;
	uint64_t			period_ticks;
	uint64_t			next_run_tick;
	spdk_poller_fn			fn;
	void				*arg;
};
struct spdk_poller;

typedef void (*spdk_app_shutdown_cb)(void);
typedef void (*spdk_sighandler_t)(int);
@@ -225,7 +218,9 @@ void spdk_event_queue_run_all(uint32_t lcore);
/**
 * \brief Register a poller on the given lcore.
 */
void spdk_poller_register(struct spdk_poller *poller,
void spdk_poller_register(struct spdk_poller **ppoller,
			  spdk_poller_fn fn,
			  void *arg,
			  uint32_t lcore,
			  struct spdk_event *complete,
			  uint64_t period_microseconds);
@@ -233,13 +228,7 @@ void spdk_poller_register(struct spdk_poller *poller,
/**
 * \brief Unregister a poller on the given lcore.
 */
void spdk_poller_unregister(struct spdk_poller *poller,
			    struct spdk_event *complete);

/**
 * \brief Move a poller from its current lcore to a new lcore.
 */
void spdk_poller_migrate(struct spdk_poller *poller, int new_lcore,
void spdk_poller_unregister(struct spdk_poller **ppoller,
			    struct spdk_event *complete);

struct spdk_subsystem {
+3 −4
Original line number Diff line number Diff line
@@ -440,7 +440,7 @@ spdk_bdev_io_submit(struct spdk_bdev_io *bdev_io)
{
	struct spdk_bdev *bdev = bdev_io->bdev;
	struct spdk_event *event, *cb_event = NULL;
	uint32_t lcore = bdev->poller.lcore;
	uint32_t lcore = bdev->lcore;

	/* start the poller when first IO comes */
	if (!bdev->is_running) {
@@ -448,7 +448,8 @@ spdk_bdev_io_submit(struct spdk_bdev_io *bdev_io)
		if (lcore == 0) {
			lcore = rte_lcore_id();
		}
		spdk_poller_register(&bdev->poller, lcore, NULL, 0);
		bdev->lcore = lcore;
		spdk_poller_register(&bdev->poller, spdk_bdev_do_work, bdev, lcore, NULL, 0);
	}

	if (bdev_io->status == SPDK_BDEV_IO_STATUS_PENDING) {
@@ -797,8 +798,6 @@ spdk_bdev_register(struct spdk_bdev *bdev)
	/* initialize the reset generation value to zero */
	bdev->gencnt = 0;
	bdev->is_running = false;
	bdev->poller.fn = spdk_bdev_do_work;
	bdev->poller.arg = bdev;

	SPDK_TRACELOG(SPDK_TRACE_DEBUG, "Inserting bdev %s into list\n", bdev->name);
	TAILQ_INSERT_TAIL(&spdk_bdev_list, bdev, link);
+48 −47
Original line number Diff line number Diff line
@@ -59,6 +59,15 @@

#define SPDK_MAX_SOCKET		64

struct spdk_poller {
	TAILQ_ENTRY(spdk_poller)	tailq;
	uint32_t			lcore;
	uint64_t			period_ticks;
	uint64_t			next_run_tick;
	spdk_poller_fn			fn;
	void				*arg;
};

enum spdk_reactor_state {
	SPDK_REACTOR_STATE_INVALID = 0,
	SPDK_REACTOR_STATE_INITIALIZED = 1,
@@ -569,8 +578,6 @@ _spdk_event_add_poller(spdk_event_t event)
	struct spdk_poller *poller = spdk_event_get_arg2(event);
	struct spdk_event *next = spdk_event_get_next(event);

	poller->lcore = reactor->lcore;

	if (poller->period_ticks) {
		spdk_poller_insert_timer(reactor, poller, rte_get_timer_cycles());
	} else {
@@ -582,36 +589,47 @@ _spdk_event_add_poller(spdk_event_t event)
	}
}

static void
_spdk_poller_register(struct spdk_poller *poller, uint32_t lcore,
		      struct spdk_event *complete)
void
spdk_poller_register(struct spdk_poller **ppoller, spdk_poller_fn fn, void *arg,
		     uint32_t lcore, struct spdk_event *complete, uint64_t period_microseconds)
{
	struct spdk_poller *poller;
	struct spdk_reactor *reactor;
	struct spdk_event *event;

	reactor = spdk_reactor_get(lcore);
	event = spdk_event_allocate(lcore, _spdk_event_add_poller, reactor, poller, complete);
	spdk_event_call(event);
	poller = calloc(1, sizeof(*poller));
	if (poller == NULL) {
		SPDK_ERRLOG("Poller memory allocation failed\n");
		abort();
	}

void
spdk_poller_register(struct spdk_poller *poller,
		     uint32_t lcore, struct spdk_event *complete, uint64_t period_microseconds)
{
	poller->lcore = lcore;
	poller->fn = fn;
	poller->arg = arg;

	if (period_microseconds) {
		poller->period_ticks = (rte_get_timer_hz() * period_microseconds) / 1000000ULL;
	} else {
		poller->period_ticks = 0;
	}

	_spdk_poller_register(poller, lcore, complete);
	if (*ppoller != NULL) {
		SPDK_ERRLOG("Attempted reuse of poller pointer\n");
		abort();
	}

	*ppoller = poller;

	reactor = spdk_reactor_get(lcore);
	event = spdk_event_allocate(lcore, _spdk_event_add_poller, reactor, poller, complete);
	spdk_event_call(event);
}

static void
_spdk_event_remove_poller(spdk_event_t event)
{
	struct spdk_reactor *reactor = spdk_event_get_arg1(event);
	struct spdk_poller *poller = spdk_event_get_arg2(event);
	struct spdk_poller *poller = spdk_event_get_arg1(event);
	struct spdk_reactor *reactor = spdk_reactor_get(poller->lcore);
	struct spdk_event *next = spdk_event_get_next(event);

	if (poller->period_ticks) {
@@ -620,47 +638,30 @@ _spdk_event_remove_poller(spdk_event_t event)
		TAILQ_REMOVE(&reactor->active_pollers, poller, tailq);
	}

	free(poller);

	if (next) {
		spdk_event_call(next);
	}
}

void
spdk_poller_unregister(struct spdk_poller *poller,
spdk_poller_unregister(struct spdk_poller **ppoller,
		       struct spdk_event *complete)
{
	struct spdk_reactor *reactor;
	struct spdk_event *event;
	struct spdk_poller *poller;

	reactor = spdk_reactor_get(poller->lcore);
	event = spdk_event_allocate(poller->lcore, _spdk_event_remove_poller, reactor, poller, complete);
	poller = *ppoller;

	spdk_event_call(event);
}
	*ppoller = NULL;

static void
_spdk_poller_migrate(spdk_event_t event)
{
	struct spdk_poller *poller = spdk_event_get_arg1(event);
	struct spdk_event *next = spdk_event_get_next(event);

	/* Register the poller on the current lcore. This works
	 * because we already set this event up so that it is called
	 * on the new_lcore.
	 */
	_spdk_poller_register(poller, rte_lcore_id(), next);
	if (poller == NULL) {
		if (complete) {
			spdk_event_call(complete);
		}
		return;
	}

void
spdk_poller_migrate(struct spdk_poller *poller, int new_lcore,
		    struct spdk_event *complete)
{
	struct spdk_event *event;

	RTE_VERIFY(spdk_app_get_core_mask() & (1ULL << new_lcore));
	RTE_VERIFY(poller != NULL);

	event = spdk_event_allocate(new_lcore, _spdk_poller_migrate, poller, NULL, complete);

	spdk_poller_unregister(poller, event);
	spdk_event_call(spdk_event_allocate(poller->lcore, _spdk_event_remove_poller, poller, NULL,
					    complete));
}
+3 −4
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@

#define ACCEPT_TIMEOUT_US 1000 /* 1ms */

static struct spdk_poller g_acceptor_poller;
static struct spdk_poller *g_acceptor_poller;

static void
spdk_iscsi_portal_accept(struct spdk_iscsi_portal *portal)
@@ -94,9 +94,8 @@ spdk_acceptor(void *arg)
void
spdk_iscsi_acceptor_start(void)
{
	g_acceptor_poller.fn = spdk_acceptor;
	g_acceptor_poller.arg = &g_spdk_iscsi;
	spdk_poller_register(&g_acceptor_poller, spdk_app_get_current_core(), NULL, ACCEPT_TIMEOUT_US);
	spdk_poller_register(&g_acceptor_poller, spdk_acceptor, &g_spdk_iscsi, spdk_app_get_current_core(),
			     NULL, ACCEPT_TIMEOUT_US);
}

void
Loading