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

Change-Id: I8ea8c59a0c67176c0c0c39abf807afad61ff3828
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/387689
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 15:09:40 -07:00
parent fcb4776fe7
commit 00b02039c5
19 changed files with 54 additions and 102 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -60,7 +60,7 @@ spdk_bdev_subsystem_start_poller(struct spdk_bdev_poller **ppoller,
static void
spdk_bdev_subsystem_stop_poller(struct spdk_bdev_poller **ppoller)
{
spdk_poller_unregister((struct spdk_poller **)ppoller, NULL);
spdk_poller_unregister((struct spdk_poller **)ppoller);
}
static void

View File

@ -86,5 +86,5 @@ spdk_iscsi_acceptor_start(struct spdk_iscsi_portal *p)
void
spdk_iscsi_acceptor_stop(struct spdk_iscsi_portal *p)
{
spdk_poller_unregister(&p->acceptor_poller, NULL);
spdk_poller_unregister(&p->acceptor_poller);
}

View File

@ -689,7 +689,7 @@ _spdk_iscsi_conn_check_shutdown(void *arg)
return;
}
spdk_poller_unregister(&conn->shutdown_timer, NULL);
spdk_poller_unregister(&conn->shutdown_timer);
spdk_iscsi_conn_stop_poller(conn, _spdk_iscsi_conn_free, spdk_env_get_current_core());
}
@ -710,7 +710,7 @@ void spdk_iscsi_conn_destruct(struct spdk_iscsi_conn *conn)
spdk_clear_all_transfer_task(conn, NULL);
spdk_sock_close(conn->sock);
spdk_poller_unregister(&conn->logout_timer, NULL);
spdk_poller_unregister(&conn->logout_timer);
rc = spdk_iscsi_conn_free_tasks(conn);
if (rc < 0) {
@ -761,7 +761,7 @@ spdk_iscsi_conn_check_shutdown(void *arg)
struct spdk_event *event;
if (spdk_iscsi_get_active_conns() == 0) {
spdk_poller_unregister(&g_shutdown_timer, NULL);
spdk_poller_unregister(&g_shutdown_timer);
event = spdk_event_allocate(spdk_env_get_current_core(), spdk_iscsi_conn_check_shutdown_cb, NULL,
NULL);
spdk_event_call(event);
@ -829,7 +829,7 @@ spdk_iscsi_conn_stop_poller(struct spdk_iscsi_conn *conn, spdk_event_fn fn_after
}
__sync_fetch_and_sub(&g_num_connections[spdk_env_get_current_core()], 1);
spdk_net_framework_clear_socket_association(conn->sock);
spdk_poller_unregister(&conn->poller, NULL);
spdk_poller_unregister(&conn->poller);
event = spdk_event_allocate(lcore, fn_after_stop, conn, NULL);
spdk_event_call(event);
}
@ -1448,7 +1448,7 @@ spdk_iscsi_conn_login_do_work(void *arg)
__sync_fetch_and_sub(&g_num_connections[spdk_env_get_current_core()], 1);
__sync_fetch_and_add(&g_num_connections[lcore], 1);
spdk_net_framework_clear_socket_association(conn->sock);
spdk_poller_unregister(&conn->poller, NULL);
spdk_poller_unregister(&conn->poller);
spdk_event_call(event);
}
}

View File

@ -328,7 +328,7 @@ int
spdk_scsi_lun_destruct(struct spdk_scsi_lun *lun)
{
spdk_bdev_close(lun->bdev_desc);
spdk_poller_unregister(&lun->hotplug_poller, NULL);
spdk_poller_unregister(&lun->hotplug_poller);
spdk_scsi_lun_db_delete(lun);
free(lun);

View File

@ -396,7 +396,7 @@ _bdev_remove_cb(struct spdk_vhost_dev *vdev, void *arg)
SPDK_WARNLOG("Controller %s: Hot-removing bdev - all further requests will fail.\n",
bvdev->vdev.name);
if (bvdev->requestq_poller) {
spdk_poller_unregister(&bvdev->requestq_poller, NULL);
spdk_poller_unregister(&bvdev->requestq_poller);
spdk_poller_register(&bvdev->requestq_poller, no_bdev_vdev_worker, bvdev, 0);
}
@ -547,7 +547,7 @@ destroy_device_poller_cb(void *arg)
free_task_pool(bvdev);
spdk_vhost_dev_mem_unregister(&bvdev->vdev);
spdk_poller_unregister(&ctx->poller, NULL);
spdk_poller_unregister(&ctx->poller);
spdk_vhost_dev_backend_event_done(ctx->event_ctx, 0);
}
@ -572,7 +572,7 @@ spdk_vhost_blk_stop(struct spdk_vhost_dev *vdev, void *event_ctx)
destroy_ctx->bvdev = bvdev;
destroy_ctx->event_ctx = event_ctx;
spdk_poller_unregister(&bvdev->requestq_poller, NULL);
spdk_poller_unregister(&bvdev->requestq_poller);
spdk_poller_register(&destroy_ctx->poller, destroy_device_poller_cb, destroy_ctx,
1000);
return 0;

View File

@ -1093,7 +1093,7 @@ destroy_device_poller_cb(void *arg)
free_task_pool(svdev);
spdk_poller_unregister(&ctx->poller, NULL);
spdk_poller_unregister(&ctx->poller);
spdk_vhost_dev_backend_event_done(ctx->event_ctx, 0);
}
@ -1118,8 +1118,8 @@ spdk_vhost_scsi_stop(struct spdk_vhost_dev *vdev, void *event_ctx)
destroy_ctx->svdev = svdev;
destroy_ctx->event_ctx = event_ctx;
spdk_poller_unregister(&svdev->requestq_poller, NULL);
spdk_poller_unregister(&svdev->mgmt_poller, NULL);
spdk_poller_unregister(&svdev->requestq_poller);
spdk_poller_unregister(&svdev->mgmt_poller);
spdk_poller_register(&destroy_ctx->poller, destroy_device_poller_cb, destroy_ctx,
1000);

View File

@ -212,7 +212,7 @@ end_run(void *arg1, void *arg2)
spdk_bdev_close(target->bdev_desc);
if (--g_target_count == 0) {
if (g_show_performance_real_time) {
spdk_poller_unregister(&g_perf_timer, NULL);
spdk_poller_unregister(&g_perf_timer);
}
if (g_run_failed) {
spdk_app_stop(1);
@ -424,9 +424,9 @@ end_target(void *arg)
{
struct io_target *target = arg;
spdk_poller_unregister(&target->run_timer, NULL);
spdk_poller_unregister(&target->run_timer);
if (g_reset) {
spdk_poller_unregister(&target->reset_timer, NULL);
spdk_poller_unregister(&target->reset_timer);
}
target->is_draining = true;
@ -460,7 +460,7 @@ reset_target(void *arg)
struct bdevperf_task *task = NULL;
int rc;
spdk_poller_unregister(&target->reset_timer, NULL);
spdk_poller_unregister(&target->reset_timer);
/* Do reset. */
rte_mempool_get(task_pool, (void **)&task);

View File

@ -52,7 +52,7 @@ static char *g_nbd_name = "/dev/nbd0";
static void
nbd_shutdown(void)
{
spdk_poller_unregister(&g_nbd_poller, NULL);
spdk_poller_unregister(&g_nbd_poller);
spdk_nbd_stop(g_nbd_disk);
spdk_app_stop(0);

View File

@ -62,7 +62,7 @@ static void
oneshot(void *arg)
{
printf("oneshot\n");
spdk_poller_unregister(&poller_oneshot, NULL);
spdk_poller_unregister(&poller_oneshot);
}
static void
@ -84,7 +84,7 @@ test_start(void *arg1, void *arg2)
spdk_poller_register(&poller_oneshot, oneshot, NULL, 0);
spdk_poller_register(&poller_unregister, nop, NULL, 0);
spdk_poller_unregister(&poller_unregister, NULL);
spdk_poller_unregister(&poller_unregister);
}
static void
@ -92,10 +92,10 @@ test_cleanup(void)
{
printf("test_cleanup\n");
spdk_poller_unregister(&test_end_poller, NULL);
spdk_poller_unregister(&poller_100ms, NULL);
spdk_poller_unregister(&poller_250ms, NULL);
spdk_poller_unregister(&poller_500ms, NULL);
spdk_poller_unregister(&test_end_poller);
spdk_poller_unregister(&poller_100ms);
spdk_poller_unregister(&poller_250ms);
spdk_poller_unregister(&poller_500ms);
/* poller_oneshot unregisters itself */
}

View File

@ -81,7 +81,7 @@ test_cleanup(void)
{
printf("test_abort\n");
spdk_poller_unregister(&test_end_poller, NULL);
spdk_poller_unregister(&test_end_poller);
spdk_app_stop(0);
}

View File

@ -61,8 +61,7 @@ spdk_poller_register(struct spdk_poller **ppoller, spdk_poller_fn fn, void *arg,
}
void
spdk_poller_unregister(struct spdk_poller **ppoller,
struct spdk_event *complete)
spdk_poller_unregister(struct spdk_poller **ppoller)
{
}

View File

@ -50,7 +50,7 @@ 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,
uint64_t period_microseconds));
DEFINE_STUB_V(spdk_poller_unregister, (struct spdk_poller **ppoller, struct spdk_event *complete));
DEFINE_STUB_V(spdk_poller_unregister, (struct spdk_poller **ppoller));
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);
DEFINE_STUB(rte_vhost_get_negotiated_features, int, (int vid, uint64_t *features), 0);

View File

@ -94,7 +94,7 @@ 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,
void *arg, unsigned timeout_sec, const char *errmsg), 0);
DEFINE_STUB_V(spdk_poller_unregister, (struct spdk_poller **ppoller, struct spdk_event *complete));
DEFINE_STUB_V(spdk_poller_unregister, (struct spdk_poller **ppoller));
DEFINE_STUB_V(spdk_ring_free, (struct spdk_ring *ring));
DEFINE_STUB(spdk_env_get_socket_id, uint32_t, (uint32_t core), 0);
DEFINE_STUB_P(spdk_bdev_get_name, const char, (const struct spdk_bdev *bdev), {0});

View File

@ -111,7 +111,7 @@ DEFINE_STUB_P(spdk_conf_section_get_name, const char, (const struct spdk_conf_se
DEFINE_STUB(spdk_env_get_socket_id, uint32_t, (uint32_t core), 0);
DEFINE_STUB(spdk_vhost_event_send, int, (struct spdk_vhost_dev *vdev, spdk_vhost_event_fn cb_fn,
void *arg, unsigned timeout_sec, const char *errmsg), 0);
DEFINE_STUB_V(spdk_poller_unregister, (struct spdk_poller **ppoller, struct spdk_event *complete));
DEFINE_STUB_V(spdk_poller_unregister, (struct spdk_poller **ppoller));
DEFINE_STUB(spdk_json_write_name, int, (struct spdk_json_write_ctx *w, const char *name), 0);
DEFINE_STUB(spdk_json_write_object_begin, int, (struct spdk_json_write_ctx *w), 0);
DEFINE_STUB(spdk_json_write_uint32, int, (struct spdk_json_write_ctx *w, uint32_t val), 0);