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

Change-Id: I864cd8a6c206dfbe62fcb3f72275c1ae51aa4ed7
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/387688
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Ben Walker 2017-11-15 10:33:04 -07:00
parent 03bb015cda
commit fcb4776fe7
19 changed files with 43 additions and 80 deletions

View File

@ -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;

View File

@ -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);
/**

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -54,7 +54,6 @@ spdk_bdev_subsystem_start_poller(struct spdk_bdev_poller **ppoller,
spdk_poller_register((struct spdk_poller **)ppoller,
fn,
arg,
spdk_env_get_current_core(),
period_microseconds);
}

View File

@ -79,7 +79,7 @@ spdk_iscsi_portal_accept(void *arg)
void
spdk_iscsi_acceptor_start(struct spdk_iscsi_portal *p)
{
spdk_poller_register(&p->acceptor_poller, spdk_iscsi_portal_accept, p, spdk_env_get_current_core(),
spdk_poller_register(&p->acceptor_poller, spdk_iscsi_portal_accept, p,
ACCEPT_TIMEOUT_US);
}

View File

@ -391,8 +391,7 @@ int spdk_initialize_iscsi_conns(void)
return -1;
}
spdk_poller_register(&g_idle_conn_poller, spdk_iscsi_conn_idle_do_work, NULL,
spdk_env_get_current_core(), 0);
spdk_poller_register(&g_idle_conn_poller, spdk_iscsi_conn_idle_do_work, NULL, 0);
return 0;
}
@ -515,8 +514,7 @@ error_return:
conn->lcore = spdk_env_get_current_core();
spdk_net_framework_clear_socket_association(conn->sock);
__sync_fetch_and_add(&g_num_connections[conn->lcore], 1);
spdk_poller_register(&conn->poller, spdk_iscsi_conn_login_do_work, conn,
conn->lcore, 0);
spdk_poller_register(&conn->poller, spdk_iscsi_conn_login_do_work, conn, 0);
return 0;
}
@ -718,7 +716,7 @@ void spdk_iscsi_conn_destruct(struct spdk_iscsi_conn *conn)
if (rc < 0) {
/* The connection cannot be freed yet. Check back later. */
spdk_poller_register(&conn->shutdown_timer, _spdk_iscsi_conn_check_shutdown, conn,
spdk_env_get_current_core(), 1000);
1000);
} else {
spdk_iscsi_conn_stop_poller(conn, _spdk_iscsi_conn_free, spdk_env_get_current_core());
}
@ -862,7 +860,7 @@ void spdk_shutdown_iscsi_conns(void)
pthread_mutex_unlock(&g_conns_mutex);
spdk_poller_register(&g_shutdown_timer, spdk_iscsi_conn_check_shutdown, NULL,
spdk_env_get_current_core(), 1000);
1000);
}
int
@ -1426,7 +1424,7 @@ spdk_iscsi_conn_full_feature_migrate(void *arg1, void *arg2)
/* The poller has been unregistered, so now we can re-register it on the new core. */
conn->lcore = spdk_env_get_current_core();
spdk_poller_register(&conn->poller, spdk_iscsi_conn_full_feature_do_work, conn,
conn->lcore, 0);
0);
}
void
@ -1643,7 +1641,7 @@ void
spdk_iscsi_conn_logout(struct spdk_iscsi_conn *conn)
{
conn->state = ISCSI_CONN_STATE_LOGGED_OUT;
spdk_poller_register(&conn->logout_timer, logout_timeout, conn, spdk_env_get_current_core(),
spdk_poller_register(&conn->logout_timer, logout_timeout, conn,
ISCSI_LOGOUT_TIMEOUT * 1000000);
}

View File

@ -246,7 +246,7 @@ _spdk_scsi_lun_hot_remove(void *arg1, void *arg2)
lun->hotremove_cb(lun, lun->hotremove_ctx);
}
spdk_poller_register(&lun->hotplug_poller, spdk_scsi_lun_hotplug, lun, lun->lcore, 0);
spdk_poller_register(&lun->hotplug_poller, spdk_scsi_lun_hotplug, lun, 0);
}
static void

View File

@ -397,7 +397,7 @@ _bdev_remove_cb(struct spdk_vhost_dev *vdev, void *arg)
bvdev->vdev.name);
if (bvdev->requestq_poller) {
spdk_poller_unregister(&bvdev->requestq_poller, NULL);
spdk_poller_register(&bvdev->requestq_poller, no_bdev_vdev_worker, bvdev, bvdev->vdev.lcore, 0);
spdk_poller_register(&bvdev->requestq_poller, no_bdev_vdev_worker, bvdev, 0);
}
bvdev->bdev = NULL;
@ -508,7 +508,7 @@ spdk_vhost_blk_start(struct spdk_vhost_dev *vdev, void *event_ctx)
}
spdk_poller_register(&bvdev->requestq_poller, bvdev->bdev ? vdev_worker : no_bdev_vdev_worker,
bvdev, vdev->lcore, 0);
bvdev, 0);
SPDK_NOTICELOG("Started poller for vhost controller %s on lcore %d\n", vdev->name, vdev->lcore);
out:
spdk_vhost_dev_backend_event_done(event_ctx, rc);
@ -573,7 +573,7 @@ spdk_vhost_blk_stop(struct spdk_vhost_dev *vdev, void *event_ctx)
destroy_ctx->event_ctx = event_ctx;
spdk_poller_unregister(&bvdev->requestq_poller, NULL);
spdk_poller_register(&destroy_ctx->poller, destroy_device_poller_cb, destroy_ctx, vdev->lcore,
spdk_poller_register(&destroy_ctx->poller, destroy_device_poller_cb, destroy_ctx,
1000);
return 0;

View File

@ -1051,8 +1051,8 @@ spdk_vhost_scsi_start(struct spdk_vhost_dev *vdev, void *event_ctx)
spdk_vhost_dev_mem_register(vdev);
spdk_poller_register(&svdev->requestq_poller, vdev_worker, svdev, vdev->lcore, 0);
spdk_poller_register(&svdev->mgmt_poller, vdev_mgmt_worker, svdev, vdev->lcore,
spdk_poller_register(&svdev->requestq_poller, vdev_worker, svdev, 0);
spdk_poller_register(&svdev->mgmt_poller, vdev_mgmt_worker, svdev,
MGMT_POLL_PERIOD_US);
out:
spdk_vhost_dev_backend_event_done(event_ctx, rc);
@ -1120,7 +1120,7 @@ spdk_vhost_scsi_stop(struct spdk_vhost_dev *vdev, void *event_ctx)
spdk_poller_unregister(&svdev->requestq_poller, NULL);
spdk_poller_unregister(&svdev->mgmt_poller, NULL);
spdk_poller_register(&destroy_ctx->poller, destroy_device_poller_cb, destroy_ctx, vdev->lcore,
spdk_poller_register(&destroy_ctx->poller, destroy_device_poller_cb, destroy_ctx,
1000);
return 0;

View File

@ -449,7 +449,7 @@ reset_cb(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg)
rte_mempool_put(task_pool, task);
spdk_bdev_free_io(bdev_io);
spdk_poller_register(&target->reset_timer, reset_target, target, target->lcore,
spdk_poller_register(&target->reset_timer, reset_target, target,
10 * 1000000);
}
@ -485,11 +485,11 @@ bdevperf_submit_on_core(void *arg1, void *arg2)
target->ch = spdk_bdev_get_io_channel(target->bdev_desc);
/* Start a timer to stop this I/O chain when the run is over */
spdk_poller_register(&target->run_timer, end_target, target, target->lcore,
spdk_poller_register(&target->run_timer, end_target, target,
g_time_in_sec * 1000000);
if (g_reset) {
spdk_poller_register(&target->reset_timer, reset_target, target,
target->lcore, 10 * 1000000);
10 * 1000000);
}
bdevperf_submit_io(target, g_queue_depth);
target = target->next;
@ -585,7 +585,7 @@ bdevperf_run(void *arg1, void *arg2)
/* Start a timer to dump performance numbers */
if (g_show_performance_real_time) {
spdk_poller_register(&g_perf_timer, performance_statistics_thread, NULL,
spdk_env_get_current_core(), 1000000);
1000000);
}
/* Send events to start all I/O */

View File

@ -88,7 +88,7 @@ nbd_start(void *arg1, void *arg2)
return;
}
spdk_poller_register(&g_nbd_poller, nbd_poll, NULL, spdk_env_get_current_core(), 0);
spdk_poller_register(&g_nbd_poller, nbd_poll, NULL, 0);
}
static void usage(char *program_name)

View File

@ -76,14 +76,14 @@ test_start(void *arg1, void *arg2)
printf("test_start\n");
/* Register a poller that will stop the test after the time has elapsed. */
spdk_poller_register(&test_end_poller, test_end, NULL, 0, g_time_in_sec * 1000000ULL);
spdk_poller_register(&test_end_poller, test_end, NULL, g_time_in_sec * 1000000ULL);
spdk_poller_register(&poller_100ms, tick, (void *)100, 0, 100000);
spdk_poller_register(&poller_250ms, tick, (void *)250, 0, 250000);
spdk_poller_register(&poller_500ms, tick, (void *)500, 0, 500000);
spdk_poller_register(&poller_oneshot, oneshot, NULL, 0, 0);
spdk_poller_register(&poller_100ms, tick, (void *)100, 100000);
spdk_poller_register(&poller_250ms, tick, (void *)250, 250000);
spdk_poller_register(&poller_500ms, tick, (void *)500, 500000);
spdk_poller_register(&poller_oneshot, oneshot, NULL, 0);
spdk_poller_register(&poller_unregister, nop, NULL, 0, 0);
spdk_poller_register(&poller_unregister, nop, NULL, 0);
spdk_poller_unregister(&poller_unregister, NULL);
}

View File

@ -69,7 +69,6 @@ test_start(void *arg1, void *arg2)
/* Register a poller that will stop the test after the time has elapsed. */
spdk_poller_register(&test_end_poller, __test_end, NULL,
spdk_env_get_current_core(),
g_time_in_sec * 1000000ULL);
for (i = 0; i < g_queue_depth; i++) {

View File

@ -56,7 +56,7 @@ static uint32_t g_task_count = 0;
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)
{
}

View File

@ -49,7 +49,7 @@ DEFINE_STUB(spdk_app_get_core_mask, uint64_t, (void), 0);
DEFINE_STUB_V(spdk_app_stop, (int rc));
DEFINE_STUB_V(spdk_event_call, (struct spdk_event *event));
DEFINE_STUB_V(spdk_poller_register, (struct spdk_poller **ppoller, spdk_poller_fn fn, void *arg,
uint32_t lcore, uint64_t period_microseconds));
uint64_t period_microseconds));
DEFINE_STUB_V(spdk_poller_unregister, (struct spdk_poller **ppoller, struct spdk_event *complete));
DEFINE_STUB(spdk_iommu_mem_unregister, int, (uint64_t addr, uint64_t len), 0);
DEFINE_STUB(rte_vhost_get_mem_table, int, (int vid, struct rte_vhost_memory **mem), 0);

View File

@ -89,7 +89,7 @@ DEFINE_STUB(spdk_vhost_vq_avail_ring_get, uint16_t, (struct spdk_vhost_virtqueue
uint16_t reqs_len), 0);
DEFINE_STUB_V(spdk_vhost_dev_mem_register, (struct spdk_vhost_dev *vdev));
DEFINE_STUB_V(spdk_poller_register, (struct spdk_poller **ppoller, spdk_poller_fn fn, void *arg,
uint32_t lcore, uint64_t period_microseconds));
uint64_t period_microseconds));
DEFINE_STUB_V(spdk_vhost_dev_mem_unregister, (struct spdk_vhost_dev *vdev));
DEFINE_STUB(spdk_env_get_current_core, uint32_t, (void), 0);
DEFINE_STUB(spdk_vhost_event_send, int, (struct spdk_vhost_dev *vdev, spdk_vhost_event_fn cb_fn,

View File

@ -88,7 +88,7 @@ DEFINE_STUB(spdk_vhost_vring_desc_to_iov, int, (struct spdk_vhost_dev *vdev, str
DEFINE_STUB_V(spdk_scsi_task_process_null_lun, (struct spdk_scsi_task *task));
DEFINE_STUB_V(spdk_vhost_dev_mem_register, (struct spdk_vhost_dev *vdev));
DEFINE_STUB_V(spdk_poller_register, (struct spdk_poller **ppoller, spdk_poller_fn fn, void *arg,
uint32_t lcore, uint64_t period_microseconds));
uint64_t period_microseconds));
DEFINE_STUB_V(spdk_ring_free, (struct spdk_ring *ring));
DEFINE_STUB(spdk_vhost_dev_has_feature, bool, (struct spdk_vhost_dev *vdev, unsigned feature_id),
false);