lib/ftl: Drop relocation for empty bands immediately

Added check if band that is added to reloc
have any valid blocks. Return immediately
if there is no valid blocks.

Change-Id: I2bce088e0ad71479c6899fff96845397d12e2e92
Signed-off-by: Wojciech Malikowski <wojciech.malikowski@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/457625
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Wojciech Malikowski 2019-06-11 10:58:18 -04:00 committed by Darek Stojaczyk
parent c149f9597f
commit a74b79dc74
2 changed files with 8 additions and 31 deletions

View File

@ -772,6 +772,13 @@ ftl_reloc_add(struct ftl_reloc *reloc, struct ftl_band *band, size_t offset,
struct ftl_band_reloc *breloc = &reloc->brelocs[band->id];
size_t i, prev_lbks = breloc->num_lbks;
pthread_spin_lock(&band->lba_map.lock);
if (band->lba_map.num_vld == 0) {
pthread_spin_unlock(&band->lba_map.lock);
return;
}
pthread_spin_unlock(&band->lba_map.lock);
for (i = offset; i < offset + num_lbks; ++i) {
if (spdk_bit_array_get(breloc->reloc_map, i)) {
continue;

View File

@ -301,13 +301,12 @@ test_reloc_iter_full(void)
}
static void
test_reloc_iter_empty(void)
test_reloc_empty_band(void)
{
struct spdk_ftl_dev *dev;
struct ftl_reloc *reloc;
struct ftl_band_reloc *breloc;
struct ftl_band *band;
struct ftl_ppa ppa;
setup_reloc(&dev, &reloc, &g_geo, &g_range);
@ -316,8 +315,6 @@ test_reloc_iter_empty(void)
ftl_reloc_add(reloc, band, 0, ftl_num_band_lbks(dev), 0);
CU_ASSERT_EQUAL(breloc->num_lbks, ftl_num_band_lbks(dev));
CU_ASSERT_EQUAL(0, ftl_reloc_next_lbks(breloc, &ppa));
CU_ASSERT_EQUAL(breloc->num_lbks, 0);
cleanup_reloc(dev, reloc);
@ -481,31 +478,6 @@ test_reloc_single_lbk(void)
cleanup_reloc(dev, reloc);
}
static void
test_reloc_empty_band(void)
{
struct spdk_ftl_dev *dev;
struct ftl_reloc *reloc;
struct ftl_band_reloc *breloc;
struct ftl_band *band;
setup_reloc(&dev, &reloc, &g_geo, &g_range);
breloc = &reloc->brelocs[0];
band = breloc->band;
ftl_reloc_add(reloc, band, 0, ftl_num_band_lbks(dev), 0);
CU_ASSERT_EQUAL(breloc->num_lbks, ftl_num_band_lbks(dev));
ftl_reloc(reloc);
CU_ASSERT_EQUAL(breloc->num_lbks, 0);
SPDK_CU_ASSERT_FATAL(breloc->moves != NULL);
cleanup_reloc(dev, reloc);
}
int
main(int argc, char **argv)
{
@ -525,8 +497,6 @@ main(int argc, char **argv)
if (
CU_add_test(suite, "test_reloc_iter_full",
test_reloc_iter_full) == NULL
|| CU_add_test(suite, "test_reloc_iter_empty",
test_reloc_iter_empty) == NULL
|| CU_add_test(suite, "test_reloc_empty_band",
test_reloc_empty_band) == NULL
|| CU_add_test(suite, "test_reloc_full_band",