Commit 00b02039 authored by Ben Walker's avatar Ben Walker
Browse files

event: Pollers must now be unregistered from the thread they run on.



Change-Id: I8ea8c59a0c67176c0c0c39abf807afad61ff3828
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/387689


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent fcb4776f
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -82,7 +82,7 @@ subsystem_unregister_poller(void *arg1, void *arg2)
	struct nvmf_tgt_subsystem *app_subsys = arg1;
	struct spdk_event *event = arg2;

	spdk_poller_unregister(&app_subsys->poller, NULL);
	spdk_poller_unregister(&app_subsys->poller);

	spdk_event_call(event);
}
@@ -235,7 +235,7 @@ nvmf_tgt_destroy_poll_group(void *arg1, void *arg2)
	pg = &g_poll_groups[g_tgt.core];
	assert(pg != NULL);

	spdk_poller_unregister(&pg->poller, NULL);
	spdk_poller_unregister(&pg->poller);

	spdk_nvmf_poll_group_destroy(pg->group);
	pg->group = NULL;
@@ -354,7 +354,7 @@ nvmf_tgt_advance_state(void *arg1, void *arg2)
			}
			break;
		case NVMF_TGT_FINI_STOP_ACCEPTOR: {
			spdk_poller_unregister(&g_acceptor_poller, NULL);
			spdk_poller_unregister(&g_acceptor_poller);
			g_tgt.core = spdk_env_get_first_core();
			g_tgt.state = NVMF_TGT_FINI_DESTROY_POLL_GROUP;
			break;
+1 −2
Original line number Diff line number Diff line
@@ -196,8 +196,7 @@ void spdk_poller_register(struct spdk_poller **ppoller,
/**
 * \brief Unregister a poller on the given lcore.
 */
void spdk_poller_unregister(struct spdk_poller **ppoller,
			    struct spdk_event *complete);
void spdk_poller_unregister(struct spdk_poller **ppoller);

/**
 * \brief Enable or disable monitoring of context switches.
+1 −1
Original line number Diff line number Diff line
@@ -213,7 +213,7 @@ ioat_destroy_cb(void *io_device, void *ctx_buf)
	struct ioat_io_channel *ch = ctx_buf;

	ioat_free_device(ch->ioat_dev);
	spdk_poller_unregister(&ch->poller, NULL);
	spdk_poller_unregister(&ch->poller);
}

static struct spdk_io_channel *
+18 −64
Original line number Diff line number Diff line
@@ -225,16 +225,6 @@ spdk_poller_insert_timer(struct spdk_reactor *reactor, struct spdk_poller *polle
	TAILQ_INSERT_HEAD(&reactor->timer_pollers, poller, tailq);
}

static void
_spdk_poller_unregister_complete(struct spdk_poller *poller)
{
	if (poller->unregister_complete_event) {
		spdk_event_call(poller->unregister_complete_event);
	}

	free(poller);
}

static void
_spdk_reactor_msg_passed(void *arg1, void *arg2)
{
@@ -292,7 +282,7 @@ _spdk_reactor_context_switch_monitor_stop(void *arg1, void *arg2)
	struct spdk_reactor *reactor = arg1;

	if (reactor->rusage_poller != NULL) {
		spdk_poller_unregister(&reactor->rusage_poller, NULL);
		spdk_poller_unregister(&reactor->rusage_poller);
	}
}

@@ -384,7 +374,7 @@ _spdk_reactor_run(void *arg)
			poller->state = SPDK_POLLER_STATE_RUNNING;
			poller->fn(poller->arg);
			if (poller->state == SPDK_POLLER_STATE_UNREGISTERED) {
				_spdk_poller_unregister_complete(poller);
				free(poller);
			} else {
				poller->state = SPDK_POLLER_STATE_WAITING;
				TAILQ_INSERT_TAIL(&reactor->active_pollers, poller, tailq);
@@ -402,7 +392,7 @@ _spdk_reactor_run(void *arg)
					poller->state = SPDK_POLLER_STATE_RUNNING;
					poller->fn(poller->arg);
					if (poller->state == SPDK_POLLER_STATE_UNREGISTERED) {
						_spdk_poller_unregister_complete(poller);
						free(poller);
					} else {
						poller->state = SPDK_POLLER_STATE_WAITING;
						spdk_poller_insert_timer(reactor, poller, now);
@@ -729,14 +719,23 @@ spdk_poller_register(struct spdk_poller **ppoller, spdk_poller_fn fn, void *arg,
	}
}

static void
_spdk_poller_unregister(struct spdk_reactor *reactor, struct spdk_poller *poller,
			struct spdk_event *next)
void
spdk_poller_unregister(struct spdk_poller **ppoller)
{
	assert(poller->lcore == reactor->lcore);
	struct spdk_poller *poller;
	struct spdk_reactor *reactor;

	poller = *ppoller;

	*ppoller = NULL;

	if (poller == NULL) {
		return;
	}

	assert(poller->lcore == spdk_env_get_current_core());

	poller->unregister_complete_event = next;
	reactor = spdk_reactor_get(poller->lcore);

	if (poller->state == SPDK_POLLER_STATE_RUNNING) {
		/*
@@ -752,52 +751,7 @@ _spdk_poller_unregister(struct spdk_reactor *reactor, struct spdk_poller *poller
			TAILQ_REMOVE(&reactor->active_pollers, poller, tailq);
		}

		_spdk_poller_unregister_complete(poller);
	}
}

static void
_spdk_event_remove_poller(void *arg1, void *arg2)
{
	struct spdk_poller *poller = arg1;
	struct spdk_reactor *reactor = spdk_reactor_get(poller->lcore);
	struct spdk_event *next = arg2;

	_spdk_poller_unregister(reactor, poller, next);
}

void
spdk_poller_unregister(struct spdk_poller **ppoller,
		       struct spdk_event *complete)
{
	struct spdk_poller *poller;
	uint32_t lcore;

	poller = *ppoller;

	*ppoller = NULL;

	if (poller == NULL) {
		if (complete) {
			spdk_event_call(complete);
		}
		return;
	}

	lcore = poller->lcore;

	if (lcore == spdk_env_get_current_core()) {
		/*
		 * The poller is registered on the current core, so call the remove function
		 * directly.
		 */
		_spdk_poller_unregister(spdk_reactor_get(lcore), poller, complete);
	} else {
		/*
		 * The poller is registered on a different core.
		 * Schedule an event to run on the poller's core that will remove the poller.
		 */
		spdk_event_call(spdk_event_allocate(lcore, _spdk_event_remove_poller, poller, complete));
		free(poller);
	}
}

+1 −1
Original line number Diff line number Diff line
@@ -92,7 +92,7 @@ void
spdk_rpc_finish(void)
{
	spdk_rpc_close();
	spdk_poller_unregister(&g_rpc_poller, NULL);
	spdk_poller_unregister(&g_rpc_poller);
}

void
Loading