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:
parent
03bb015cda
commit
fcb4776fe7
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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 */
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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++) {
|
||||
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user