lib/ftl: Return SPDK_POLLER_BUSY flag only when writes were submitted
FTL core poller should return SPDK_POLLER_BUSY flag only when some writes operations were processed. Signed-off-by: Wojciech Malikowski <wojciech.malikowski@intel.com> Change-Id: I50e2b536fbec819887148cc045d76c5c5d78beb2 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3619 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
parent
d156d2f771
commit
1a91a68fae
@ -1942,15 +1942,15 @@ error:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static bool
|
||||||
ftl_process_writes(struct spdk_ftl_dev *dev)
|
ftl_process_writes(struct spdk_ftl_dev *dev)
|
||||||
{
|
{
|
||||||
struct ftl_wptr *wptr, *twptr;
|
struct ftl_wptr *wptr, *twptr;
|
||||||
size_t num_active = 0;
|
size_t num_active = 0, num_writes = 0;
|
||||||
enum ftl_band_state state;
|
enum ftl_band_state state;
|
||||||
|
|
||||||
LIST_FOREACH_SAFE(wptr, &dev->wptr_list, list_entry, twptr) {
|
LIST_FOREACH_SAFE(wptr, &dev->wptr_list, list_entry, twptr) {
|
||||||
ftl_wptr_process_writes(wptr);
|
num_writes += ftl_wptr_process_writes(wptr);
|
||||||
state = wptr->band->state;
|
state = wptr->band->state;
|
||||||
|
|
||||||
if (state != FTL_BAND_STATE_FULL &&
|
if (state != FTL_BAND_STATE_FULL &&
|
||||||
@ -1964,7 +1964,7 @@ ftl_process_writes(struct spdk_ftl_dev *dev)
|
|||||||
ftl_add_wptr(dev);
|
ftl_add_wptr(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return num_writes != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -2104,7 +2104,7 @@ ftl_select_defrag_band(struct spdk_ftl_dev *dev)
|
|||||||
return mband;
|
return mband;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static bool
|
||||||
ftl_process_relocs(struct spdk_ftl_dev *dev)
|
ftl_process_relocs(struct spdk_ftl_dev *dev)
|
||||||
{
|
{
|
||||||
struct ftl_band *band;
|
struct ftl_band *band;
|
||||||
@ -2117,7 +2117,7 @@ ftl_process_relocs(struct spdk_ftl_dev *dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ftl_reloc(dev->reloc);
|
return ftl_reloc(dev->reloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -2443,6 +2443,7 @@ int
|
|||||||
ftl_task_core(void *ctx)
|
ftl_task_core(void *ctx)
|
||||||
{
|
{
|
||||||
struct spdk_ftl_dev *dev = ctx;
|
struct spdk_ftl_dev *dev = ctx;
|
||||||
|
bool busy;
|
||||||
|
|
||||||
if (dev->halt) {
|
if (dev->halt) {
|
||||||
if (ftl_shutdown_complete(dev)) {
|
if (ftl_shutdown_complete(dev)) {
|
||||||
@ -2451,10 +2452,9 @@ ftl_task_core(void *ctx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ftl_process_writes(dev);
|
busy = ftl_process_writes(dev) || ftl_process_relocs(dev);
|
||||||
ftl_process_relocs(dev);
|
|
||||||
|
|
||||||
return SPDK_POLLER_BUSY;
|
return busy ? SPDK_POLLER_BUSY : SPDK_POLLER_IDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
SPDK_LOG_REGISTER_COMPONENT("ftl_core", SPDK_LOG_FTL_CORE)
|
SPDK_LOG_REGISTER_COMPONENT("ftl_core", SPDK_LOG_FTL_CORE)
|
||||||
|
@ -747,20 +747,20 @@ ftl_reloc_resume(struct ftl_reloc *reloc)
|
|||||||
reloc->halt = false;
|
reloc->halt = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
bool
|
||||||
ftl_reloc(struct ftl_reloc *reloc)
|
ftl_reloc(struct ftl_reloc *reloc)
|
||||||
{
|
{
|
||||||
struct ftl_band_reloc *breloc, *tbreloc;
|
struct ftl_band_reloc *breloc, *tbreloc;
|
||||||
|
|
||||||
if (ftl_reloc_is_halted(reloc)) {
|
if (ftl_reloc_is_halted(reloc)) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Process first band from priority queue and return */
|
/* Process first band from priority queue and return */
|
||||||
breloc = TAILQ_FIRST(&reloc->prio_queue);
|
breloc = TAILQ_FIRST(&reloc->prio_queue);
|
||||||
if (breloc) {
|
if (breloc) {
|
||||||
ftl_process_reloc(breloc);
|
ftl_process_reloc(breloc);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAILQ_FOREACH_SAFE(breloc, &reloc->pending_queue, entry, tbreloc) {
|
TAILQ_FOREACH_SAFE(breloc, &reloc->pending_queue, entry, tbreloc) {
|
||||||
@ -784,6 +784,8 @@ ftl_reloc(struct ftl_reloc *reloc)
|
|||||||
assert(breloc->state == FTL_BAND_RELOC_STATE_ACTIVE);
|
assert(breloc->state == FTL_BAND_RELOC_STATE_ACTIVE);
|
||||||
ftl_process_reloc(breloc);
|
ftl_process_reloc(breloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return reloc->num_active != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -44,7 +44,7 @@ struct ftl_reloc *ftl_reloc_init(struct spdk_ftl_dev *dev);
|
|||||||
void ftl_reloc_free(struct ftl_reloc *reloc);
|
void ftl_reloc_free(struct ftl_reloc *reloc);
|
||||||
void ftl_reloc_add(struct ftl_reloc *reloc, struct ftl_band *band,
|
void ftl_reloc_add(struct ftl_reloc *reloc, struct ftl_band *band,
|
||||||
size_t offset, size_t num_blocks, int prio, bool is_defrag);
|
size_t offset, size_t num_blocks, int prio, bool is_defrag);
|
||||||
void ftl_reloc(struct ftl_reloc *reloc);
|
bool ftl_reloc(struct ftl_reloc *reloc);
|
||||||
void ftl_reloc_halt(struct ftl_reloc *reloc);
|
void ftl_reloc_halt(struct ftl_reloc *reloc);
|
||||||
void ftl_reloc_resume(struct ftl_reloc *reloc);
|
void ftl_reloc_resume(struct ftl_reloc *reloc);
|
||||||
bool ftl_reloc_is_halted(const struct ftl_reloc *reloc);
|
bool ftl_reloc_is_halted(const struct ftl_reloc *reloc);
|
||||||
|
Loading…
Reference in New Issue
Block a user