From 1a91a68fae1e759a684b7dea4cf7be18800fe8c3 Mon Sep 17 00:00:00 2001 From: Wojciech Malikowski Date: Fri, 31 Jul 2020 11:15:57 +0200 Subject: [PATCH] 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 Change-Id: I50e2b536fbec819887148cc045d76c5c5d78beb2 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3619 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Konrad Sztyber Reviewed-by: Tomasz Zawadzki --- lib/ftl/ftl_core.c | 18 +++++++++--------- lib/ftl/ftl_reloc.c | 8 +++++--- lib/ftl/ftl_reloc.h | 2 +- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/lib/ftl/ftl_core.c b/lib/ftl/ftl_core.c index b0b448806..a356486d0 100644 --- a/lib/ftl/ftl_core.c +++ b/lib/ftl/ftl_core.c @@ -1942,15 +1942,15 @@ error: return 0; } -static int +static bool ftl_process_writes(struct spdk_ftl_dev *dev) { struct ftl_wptr *wptr, *twptr; - size_t num_active = 0; + size_t num_active = 0, num_writes = 0; enum ftl_band_state state; 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; if (state != FTL_BAND_STATE_FULL && @@ -1964,7 +1964,7 @@ ftl_process_writes(struct spdk_ftl_dev *dev) ftl_add_wptr(dev); } - return 0; + return num_writes != 0; } static void @@ -2104,7 +2104,7 @@ ftl_select_defrag_band(struct spdk_ftl_dev *dev) return mband; } -static void +static bool ftl_process_relocs(struct spdk_ftl_dev *dev) { 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 @@ -2443,6 +2443,7 @@ int ftl_task_core(void *ctx) { struct spdk_ftl_dev *dev = ctx; + bool busy; if (dev->halt) { if (ftl_shutdown_complete(dev)) { @@ -2451,10 +2452,9 @@ ftl_task_core(void *ctx) } } - ftl_process_writes(dev); - ftl_process_relocs(dev); + busy = ftl_process_writes(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) diff --git a/lib/ftl/ftl_reloc.c b/lib/ftl/ftl_reloc.c index e59bf4d81..66b7bd64d 100644 --- a/lib/ftl/ftl_reloc.c +++ b/lib/ftl/ftl_reloc.c @@ -747,20 +747,20 @@ ftl_reloc_resume(struct ftl_reloc *reloc) reloc->halt = false; } -void +bool ftl_reloc(struct ftl_reloc *reloc) { struct ftl_band_reloc *breloc, *tbreloc; if (ftl_reloc_is_halted(reloc)) { - return; + return false; } /* Process first band from priority queue and return */ breloc = TAILQ_FIRST(&reloc->prio_queue); if (breloc) { ftl_process_reloc(breloc); - return; + return true; } 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); ftl_process_reloc(breloc); } + + return reloc->num_active != 0; } void diff --git a/lib/ftl/ftl_reloc.h b/lib/ftl/ftl_reloc.h index 21f49a47d..96e2ea736 100644 --- a/lib/ftl/ftl_reloc.h +++ b/lib/ftl/ftl_reloc.h @@ -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_add(struct ftl_reloc *reloc, struct ftl_band *band, 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_resume(struct ftl_reloc *reloc); bool ftl_reloc_is_halted(const struct ftl_reloc *reloc);