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 "ftl_internal.h"
|
||||||
#include "mngt/ftl_mngt.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
|
void
|
||||||
spdk_ftl_dev_get_attrs(const struct spdk_ftl_dev *dev, struct spdk_ftl_attrs *attrs)
|
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;
|
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)
|
SPDK_LOG_REGISTER_COMPONENT(ftl_core)
|
||||||
|
@ -86,6 +86,9 @@ struct spdk_ftl_dev {
|
|||||||
/* Cache IO channel */
|
/* Cache IO channel */
|
||||||
struct spdk_io_channel *cache_ioch;
|
struct spdk_io_channel *cache_ioch;
|
||||||
|
|
||||||
|
/* Poller */
|
||||||
|
struct spdk_poller *core_poller;
|
||||||
|
|
||||||
/* Read submission queue */
|
/* Read submission queue */
|
||||||
TAILQ_HEAD(, ftl_io) rd_sq;
|
TAILQ_HEAD(, ftl_io) rd_sq;
|
||||||
|
|
||||||
@ -93,6 +96,8 @@ struct spdk_ftl_dev {
|
|||||||
TAILQ_HEAD(, ftl_io) wr_sq;
|
TAILQ_HEAD(, ftl_io) wr_sq;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int ftl_core_poller(void *ctx);
|
||||||
|
|
||||||
static inline uint64_t
|
static inline uint64_t
|
||||||
ftl_get_num_blocks_in_band(const struct spdk_ftl_dev *dev)
|
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);
|
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
|
void
|
||||||
ftl_mngt_dump_stats(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
|
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",
|
.name = "FTL shutdown",
|
||||||
.error_handler = ftl_mngt_rollback_device,
|
.error_handler = ftl_mngt_rollback_device,
|
||||||
.steps = {
|
.steps = {
|
||||||
|
{
|
||||||
|
.name = "Stop core poller",
|
||||||
|
.action = ftl_mngt_stop_core_poller
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.name = "Dump statistics",
|
.name = "Dump statistics",
|
||||||
.action = ftl_mngt_dump_stats
|
.action = ftl_mngt_dump_stats
|
||||||
|
@ -71,6 +71,11 @@ static const struct ftl_mngt_process_desc desc_first_start = {
|
|||||||
.name = "Scrub NV cache",
|
.name = "Scrub NV cache",
|
||||||
.action = ftl_mngt_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",
|
.name = "Finalize initialization",
|
||||||
.action = ftl_mngt_finalize_startup,
|
.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_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_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);
|
void ftl_mngt_init_md(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt);
|
||||||
|
Loading…
Reference in New Issue
Block a user