diff --git a/lib/ftl/ftl_core.c b/lib/ftl/ftl_core.c index 81f885d19..7e8bd0e92 100644 --- a/lib/ftl/ftl_core.c +++ b/lib/ftl/ftl_core.c @@ -17,6 +17,16 @@ #include "ftl_internal.h" #include "mngt/ftl_mngt.h" +static int +ftl_shutdown_complete(struct spdk_ftl_dev *dev) +{ + if (dev->num_inflight) { + return 0; + } + + return 1; +} + void spdk_ftl_dev_get_attrs(const struct spdk_ftl_dev *dev, struct spdk_ftl_attrs *attrs) { @@ -27,4 +37,22 @@ spdk_ftl_dev_get_attrs(const struct spdk_ftl_dev *dev, struct spdk_ftl_attrs *at attrs->optimum_io_size = dev->xfer_size; } +int +ftl_core_poller(void *ctx) +{ + struct spdk_ftl_dev *dev = ctx; + uint64_t io_activity_total_old = dev->io_activity_total; + + if (dev->halt && ftl_shutdown_complete(dev)) { + spdk_poller_unregister(&dev->core_poller); + return SPDK_POLLER_IDLE; + } + + if (io_activity_total_old != dev->io_activity_total) { + return SPDK_POLLER_BUSY; + } + + return SPDK_POLLER_IDLE; +} + SPDK_LOG_REGISTER_COMPONENT(ftl_core) diff --git a/lib/ftl/ftl_core.h b/lib/ftl/ftl_core.h index 734a86a65..934005516 100644 --- a/lib/ftl/ftl_core.h +++ b/lib/ftl/ftl_core.h @@ -86,6 +86,9 @@ struct spdk_ftl_dev { /* Cache IO channel */ struct spdk_io_channel *cache_ioch; + /* Poller */ + struct spdk_poller *core_poller; + /* Read submission queue */ TAILQ_HEAD(, ftl_io) rd_sq; @@ -93,6 +96,8 @@ struct spdk_ftl_dev { TAILQ_HEAD(, ftl_io) wr_sq; }; +int ftl_core_poller(void *ctx); + static inline uint64_t ftl_get_num_blocks_in_band(const struct spdk_ftl_dev *dev) { diff --git a/lib/ftl/mngt/ftl_mngt_misc.c b/lib/ftl/mngt/ftl_mngt_misc.c index e4371098f..19df9d302 100644 --- a/lib/ftl/mngt/ftl_mngt_misc.c +++ b/lib/ftl/mngt/ftl_mngt_misc.c @@ -62,6 +62,31 @@ ftl_mngt_finalize_startup(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mng ftl_mngt_next_step(mngt); } +void +ftl_mngt_start_core_poller(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) +{ + dev->core_poller = SPDK_POLLER_REGISTER(ftl_core_poller, dev, 0); + if (!dev->core_poller) { + FTL_ERRLOG(dev, "Unable to register core poller\n"); + ftl_mngt_fail_step(mngt); + return; + } + + ftl_mngt_next_step(mngt); +} + +void +ftl_mngt_stop_core_poller(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) +{ + dev->halt = true; + + if (dev->core_poller) { + ftl_mngt_continue_step(mngt); + } else { + ftl_mngt_next_step(mngt); + } +} + void ftl_mngt_dump_stats(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) { diff --git a/lib/ftl/mngt/ftl_mngt_shutdown.c b/lib/ftl/mngt/ftl_mngt_shutdown.c index a72cbb138..5f1e3bdf5 100644 --- a/lib/ftl/mngt/ftl_mngt_shutdown.c +++ b/lib/ftl/mngt/ftl_mngt_shutdown.c @@ -15,6 +15,10 @@ static const struct ftl_mngt_process_desc desc_shutdown = { .name = "FTL shutdown", .error_handler = ftl_mngt_rollback_device, .steps = { + { + .name = "Stop core poller", + .action = ftl_mngt_stop_core_poller + }, { .name = "Dump statistics", .action = ftl_mngt_dump_stats diff --git a/lib/ftl/mngt/ftl_mngt_startup.c b/lib/ftl/mngt/ftl_mngt_startup.c index 2f36f3385..9e483a1fe 100644 --- a/lib/ftl/mngt/ftl_mngt_startup.c +++ b/lib/ftl/mngt/ftl_mngt_startup.c @@ -71,6 +71,11 @@ static const struct ftl_mngt_process_desc desc_first_start = { .name = "Scrub NV cache", .action = ftl_mngt_scrub_nv_cache, }, + { + .name = "Start core poller", + .action = ftl_mngt_start_core_poller, + .cleanup = ftl_mngt_stop_core_poller + }, { .name = "Finalize initialization", .action = ftl_mngt_finalize_startup, diff --git a/lib/ftl/mngt/ftl_mngt_steps.h b/lib/ftl/mngt/ftl_mngt_steps.h index a91366938..e41879ed5 100644 --- a/lib/ftl/mngt/ftl_mngt_steps.h +++ b/lib/ftl/mngt/ftl_mngt_steps.h @@ -22,6 +22,10 @@ void ftl_mngt_scrub_nv_cache(struct spdk_ftl_dev *dev, struct ftl_mngt_process * void ftl_mngt_finalize_startup(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt); +void ftl_mngt_start_core_poller(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt); + +void ftl_mngt_stop_core_poller(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt); + void ftl_mngt_init_layout(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt); void ftl_mngt_init_md(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt);