Commit d4a2d28d authored by Mateusz Kozlowski's avatar Mateusz Kozlowski Committed by Ben Walker
Browse files

lib/ftl: Shutdown upgrade procedure for bands



When preparing the FTL for upgrade it is require to:
1. Keep at least one free band, this allows to rerun GC after Shutdown
2. Close all opened bands to simplify the upgrade in a new version

Change-Id: I6420de160ef32106ee331e74cbb9f7becff75081
Signed-off-by: default avatarMariusz Barczak <Mariusz.Barczak@solidigmtechnology.com>
Signed-off-by: default avatarMateusz Kozlowski <mateusz.kozlowski@solidigm.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/19224


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
parent 972201d7
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -173,6 +173,17 @@ ftl_reloc_free(struct ftl_reloc *reloc)
void
ftl_reloc_halt(struct ftl_reloc *reloc)
{
	struct spdk_ftl_dev *dev = reloc->dev;

	if (dev->conf.prep_upgrade_on_shutdown && 0 == dev->num_free) {
		/*
		 * In shutdown upgrade procedure, it is required to have
		 * at least one free band. Keep reloc running to reclaim
		 * the band.
		 */
		return;
	}

	reloc->halt = true;
}

+4 −1
Original line number Diff line number Diff line
@@ -32,8 +32,11 @@ struct ftl_superblock {
	/* Maximum IO depth per band relocate */
	uint64_t			max_reloc_qdepth;

	/* Flag indicates that the FTL is ready for upgrade */
	uint8_t				upgrade_ready;

	/* Reserved field */
	uint8_t				reserved3[16];
	uint8_t				reserved3[15];

	/* Last L2P checkpoint +1 (i.e. min_seq_id, 0:no ckpt) */
	uint64_t			ckpt_seq_id;
+49 −0
Original line number Diff line number Diff line
@@ -162,6 +162,43 @@ ftl_writer_run(struct ftl_writer *writer)
	}
}

static void
ftl_writer_pad_band_cb(struct ftl_rq *rq)
{
	assert(1 == rq->iter.qd);
	rq->iter.qd = 0;
}

static void
ftl_writer_pad_band(struct ftl_writer *writer)
{
	struct spdk_ftl_dev *dev = writer->dev;

	assert(dev->conf.prep_upgrade_on_shutdown);
	assert(writer->band);
	assert(0 == writer->band->queue_depth);

	/* First allocate the padding FTL request */
	if (!writer->pad) {
		writer->pad = ftl_rq_new(dev, dev->md_size);
		if (!writer->pad) {
			FTL_ERRLOG(dev, "Cannot allocate FTL request to pad the band");
			return;
		}
		writer->pad->owner.cb = ftl_writer_pad_band_cb;
	}

	if (writer->pad->iter.qd) {
		/* The band is handling the pad request already */
		return;
	}

	if (writer->band->md->state == FTL_BAND_STATE_OPEN) {
		ftl_band_rq_write(writer->band, writer->pad);
		writer->pad->iter.qd++;
	}
}

bool
ftl_writer_is_halted(struct ftl_writer *writer)
{
@@ -179,6 +216,18 @@ ftl_writer_is_halted(struct ftl_writer *writer)
		}
	}

	if (writer->dev->conf.prep_upgrade_on_shutdown) {
		if (writer->band) {
			ftl_writer_pad_band(writer);
		} else if (writer->num_bands) {
			return false;
		} else {
			/* All bands closed, free padding request */
			ftl_rq_del(writer->pad);
			writer->pad = NULL;
		}
	}

	return writer->halt;
}

+3 −0
Original line number Diff line number Diff line
@@ -38,6 +38,9 @@ struct ftl_writer {
	enum ftl_band_type writer_type;

	uint64_t last_seq_id;

	/* FTL request to pad the current band */
	struct ftl_rq *pad;
};

bool ftl_writer_is_halted(struct ftl_writer *writer);
+2 −0
Original line number Diff line number Diff line
@@ -373,6 +373,7 @@ ftl_mngt_set_dirty(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
	struct ftl_superblock *sb = dev->sb;

	sb->clean = 0;
	sb->upgrade_ready = false;
	dev->sb_shm->shm_clean = false;
	sb->header.crc = get_sb_crc(sb);
	persist(dev, mngt, FTL_LAYOUT_REGION_TYPE_SB);
@@ -384,6 +385,7 @@ ftl_mngt_set_clean(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
	struct ftl_superblock *sb = dev->sb;

	sb->clean = 1;
	sb->upgrade_ready = dev->conf.prep_upgrade_on_shutdown;
	dev->sb_shm->shm_clean = false;
	sb->header.crc = get_sb_crc(sb);
	persist(dev, mngt, FTL_LAYOUT_REGION_TYPE_SB);