FTL: Add core thread poller

Signed-off-by: Kozlowski Mateusz <mateusz.kozlowski@intel.com>
Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Change-Id: I70158123d7b503c909b121d418abe31a8d441152
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13298
Community-CI: Mellanox Build Bot
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Artur Paszkiewicz 2022-06-21 13:04:41 +02:00 committed by Konrad Sztyber
parent 2460515509
commit 17147949cf
6 changed files with 71 additions and 0 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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