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:
Wojciech Malikowski 2020-07-31 11:15:57 +02:00 committed by Tomasz Zawadzki
parent d156d2f771
commit 1a91a68fae
3 changed files with 15 additions and 13 deletions

View File

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

View File

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

View File

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