Commit fcb4776f authored by Ben Walker's avatar Ben Walker
Browse files

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



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


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 03bb015c
Loading
Loading
Loading
Loading
+2 −6
Original line number Diff line number Diff line
@@ -123,11 +123,10 @@ _nvmf_tgt_start_subsystem(void *arg1, void *arg2)
{
	struct nvmf_tgt_subsystem *app_subsys = arg1;
	struct spdk_nvmf_subsystem *subsystem = app_subsys->subsystem;
	int lcore = spdk_env_get_current_core();

	spdk_nvmf_subsystem_start(subsystem);

	spdk_poller_register(&app_subsys->poller, subsystem_poll, app_subsys, lcore, 0);
	spdk_poller_register(&app_subsys->poller, subsystem_poll, app_subsys, 0);
}

void
@@ -276,9 +275,7 @@ nvmf_tgt_create_poll_group(void *arg1, void *arg2)
		SPDK_ERRLOG("Failed to create poll group for core %u\n", g_tgt.core);
	}

	spdk_poller_register(&pg->poller,
			     nvmf_tgt_poll_group_poll, pg,
			     spdk_env_get_current_core(), 0);
	spdk_poller_register(&pg->poller, nvmf_tgt_poll_group_poll, pg, 0);
	g_active_poll_groups++;

	spdk_event_call(event);
@@ -346,7 +343,6 @@ nvmf_tgt_advance_state(void *arg1, void *arg2)
		}
		case NVMF_TGT_INIT_START_ACCEPTOR:
			spdk_poller_register(&g_acceptor_poller, acceptor_poll, g_tgt.tgt,
					     spdk_env_get_current_core(),
					     g_spdk_nvmf_tgt_conf.acceptor_poll_rate);
			SPDK_NOTICELOG("Acceptor running\n");
			g_tgt.state = NVMF_TGT_RUNNING;
+1 −2
Original line number Diff line number Diff line
@@ -186,12 +186,11 @@ struct spdk_event *spdk_event_allocate(uint32_t lcore, spdk_event_fn fn,
void spdk_event_call(struct spdk_event *event);

/**
 * \brief Register a poller on the given lcore.
 * \brief Register a poller on the current lcore.
 */
void spdk_poller_register(struct spdk_poller **ppoller,
			  spdk_poller_fn fn,
			  void *arg,
			  uint32_t lcore,
			  uint64_t period_microseconds);

/**
+1 −2
Original line number Diff line number Diff line
@@ -203,8 +203,7 @@ ioat_create_cb(void *io_device, void *ctx_buf)

	ch->ioat_dev = ioat_dev;
	ch->ioat_ch = ioat_dev->ioat;
	spdk_poller_register(&ch->poller, ioat_poll, ch->ioat_ch,
			     spdk_env_get_current_core(), 0);
	spdk_poller_register(&ch->poller, ioat_poll, ch->ioat_ch, 0);
	return 0;
}

+9 −36
Original line number Diff line number Diff line
@@ -282,7 +282,7 @@ _spdk_reactor_context_switch_monitor_start(void *arg1, void *arg2)

	if (reactor->rusage_poller == NULL) {
		getrusage(RUSAGE_THREAD, &reactor->rusage);
		spdk_poller_register(&reactor->rusage_poller, get_rusage, reactor, reactor->lcore, 1000000);
		spdk_poller_register(&reactor->rusage_poller, get_rusage, reactor, 1000000);
	}
}

@@ -684,28 +684,9 @@ spdk_reactors_fini(void)
	}
}

static void
_spdk_poller_register(struct spdk_reactor *reactor, struct spdk_poller *poller)
{
	if (poller->period_ticks) {
		spdk_poller_insert_timer(reactor, poller, spdk_get_ticks());
	} else {
		TAILQ_INSERT_TAIL(&reactor->active_pollers, poller, tailq);
	}
}

static void
_spdk_event_add_poller(void *arg1, void *arg2)
{
	struct spdk_reactor *reactor = arg1;
	struct spdk_poller *poller = arg2;

	_spdk_poller_register(reactor, poller);
}

void
spdk_poller_register(struct spdk_poller **ppoller, spdk_poller_fn fn, void *arg,
		     uint32_t lcore, uint64_t period_microseconds)
		     uint64_t period_microseconds)
{
	struct spdk_poller *poller;
	struct spdk_reactor *reactor;
@@ -716,7 +697,7 @@ spdk_poller_register(struct spdk_poller **ppoller, spdk_poller_fn fn, void *arg,
		abort();
	}

	poller->lcore = lcore;
	poller->lcore = spdk_env_get_current_core();
	poller->state = SPDK_POLLER_STATE_WAITING;
	poller->fn = fn;
	poller->arg = arg;
@@ -732,27 +713,19 @@ spdk_poller_register(struct spdk_poller **ppoller, spdk_poller_fn fn, void *arg,
		abort();
	}

	if (lcore >= SPDK_MAX_REACTORS) {
	if (poller->lcore >= SPDK_MAX_REACTORS) {
		SPDK_ERRLOG("Attempted to use lcore %u which is larger than max lcore %u\n",
			    lcore, SPDK_MAX_REACTORS - 1);
			    poller->lcore, SPDK_MAX_REACTORS - 1);
		abort();
	}

	*ppoller = poller;
	reactor = spdk_reactor_get(lcore);
	reactor = spdk_reactor_get(poller->lcore);

	if (lcore == spdk_env_get_current_core()) {
		/*
		 * The poller is registered to run on the current core, so call the add function
		 * directly.
		 */
		_spdk_poller_register(reactor, poller);
	if (poller->period_ticks) {
		spdk_poller_insert_timer(reactor, poller, spdk_get_ticks());
	} else {
		/*
		 * The poller is registered to run on a different core.
		 * Schedule an event to run on the poller's core that will add the poller.
		 */
		spdk_event_call(spdk_event_allocate(lcore, _spdk_event_add_poller, reactor, poller));
		TAILQ_INSERT_TAIL(&reactor->active_pollers, poller, tailq);
	}
}

+1 −1
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ spdk_rpc_initialize(const char *listen_addr)
	}

	/* Register a poller to periodically check for RPCs */
	spdk_poller_register(&g_rpc_poller, spdk_rpc_subsystem_poll, NULL, spdk_env_get_current_core(),
	spdk_poller_register(&g_rpc_poller, spdk_rpc_subsystem_poll, NULL,
			     RPC_SELECT_INTERVAL);
}

Loading