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:
parent
2460515509
commit
17147949cf
@ -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)
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user