Commit f45c0075 authored by Artur Paszkiewicz's avatar Artur Paszkiewicz Committed by Jim Harris
Browse files

ftl: superblock in shared memory



Signed-off-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Signed-off-by: default avatarKozlowski Mateusz <mateusz.kozlowski@intel.com>
Change-Id: I86e2cbf364ae3075aad2e09429754027df33eadf
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13342


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 818b9c05
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -47,6 +47,10 @@ struct spdk_ftl_dev {
	/* FTL superblock */
	struct ftl_superblock		*sb;

	/* FTL shm superblock */
	struct ftl_superblock_shm	*sb_shm;
	struct ftl_md			*sb_shm_md;

	/* Queue of registered IO channels */
	TAILQ_HEAD(, ftl_io_channel)	ioch_queue;

@@ -145,6 +149,9 @@ struct spdk_ftl_dev {

	/* Writer for GC IOs */
	struct ftl_writer		writer_gc;

	/* Retry init sequence */
	bool				init_retry;
};

void ftl_apply_limits(struct spdk_ftl_dev *dev);
+12 −0
Original line number Diff line number Diff line
@@ -132,8 +132,20 @@ static void
dev_init_cb(struct spdk_ftl_dev *dev, void *_ctx, int status)
{
	struct ftl_dev_init_ctx *ctx = _ctx;
	int rc;

	if (status) {
		if (dev->init_retry) {
			FTL_NOTICELOG(dev, "Startup retry\n");
			rc = spdk_ftl_dev_init(&dev->conf, ctx->cb_fn, ctx->cb_arg);
			if (!rc) {
				free_dev(dev);
				free(ctx);
				return;
			}
			FTL_NOTICELOG(dev, "Startup retry failed: %d\n", rc);
		}

		free_dev(dev);
		dev = NULL;
	}
+17 −0
Original line number Diff line number Diff line
@@ -47,4 +47,21 @@ struct ftl_superblock_md_region {
	uint64_t		blk_sz;
};

struct ftl_superblock_shm {
	/* SHM initialization completed */
	bool				shm_ready;

	/* SHM status - fast restart */
	bool				shm_clean;

	/* Used to continue trim after SHM recovery */
	struct {
		bool			in_progress;
		uint64_t		start_lba;
		uint64_t		num_blocks;
	} trim;

	struct ftl_superblock_gc_info	gc_info;
};

#endif /* FTL_SB_COMMON_H */
+18 −0
Original line number Diff line number Diff line
@@ -170,6 +170,7 @@ ftl_mngt_init_default_sb(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt
	sb->header.version = FTL_METADATA_VERSION_CURRENT;
	sb->uuid = dev->conf.uuid;
	sb->clean = 0;
	dev->sb_shm->shm_clean = false;

	/* Max 16 IO depth per band relocate */
	sb->max_reloc_qdepth = 16;
@@ -191,6 +192,7 @@ ftl_mngt_set_dirty(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
	struct ftl_superblock *sb = dev->sb;

	sb->clean = 0;
	dev->sb_shm->shm_clean = false;
	sb->header.crc = get_sb_crc(sb);
	persist(dev, mngt, FTL_LAYOUT_REGION_TYPE_SB);
}
@@ -258,6 +260,18 @@ ftl_mngt_superblock_init(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt
		FTL_NOTICELOG(dev, "Create new FTL, UUID %s\n", uuid);
	}

	/* Allocate md buf */
	dev->sb_shm = NULL;
	dev->sb_shm_md = ftl_md_create(dev, spdk_divide_round_up(sizeof(*dev->sb_shm), FTL_BLOCK_SIZE),
				       0, "sb_shm",
				       md_create_flags, NULL);
	if (dev->sb_shm_md == NULL) {
		ftl_mngt_fail_step(mngt);
		return;
	}

	dev->sb_shm = ftl_md_get_buffer(dev->sb_shm_md);

	/* Setup the layout of a superblock */
	if (ftl_layout_setup_superblock(dev)) {
		ftl_mngt_fail_step(mngt);
@@ -308,5 +322,9 @@ ftl_mngt_superblock_deinit(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mn
		layout->md[FTL_LAYOUT_REGION_TYPE_SB_BASE] = NULL;
	}

	ftl_md_destroy(dev->sb_shm_md);
	dev->sb_shm_md = NULL;
	dev->sb_shm = NULL;

	ftl_mngt_next_step(mngt);
}
+1 −0
Original line number Diff line number Diff line
@@ -139,6 +139,7 @@ void
ftl_mngt_finalize_startup(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
	dev->initialized = 1;
	dev->sb_shm->shm_ready = true;

	ftl_writer_resume(&dev->writer_user);
	ftl_writer_resume(&dev->writer_gc);
Loading