Commit a74b79dc authored by Wojciech Malikowski's avatar Wojciech Malikowski Committed by Darek Stojaczyk
Browse files

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: default avatarWojciech Malikowski <wojciech.malikowski@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/457625


Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent c149f959
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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;
+1 −31
Original line number Diff line number Diff line
@@ -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",