Commit 1f11e145 authored by Mateusz Kozlowski's avatar Mateusz Kozlowski Committed by Tomasz Zawadzki
Browse files

lib/ftl: Add ftl_md_persist_entries function



Allows multiple metadata entries to be persisted at once, expanding the
previous ftl_md_persist_entry functionality which could only do it one
entry at a time.

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


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
parent a0fb555b
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright (C) 2022 Intel Corporation.
 *   Copyright 2023 Solidigm All Rights Reserved
 *   All rights reserved.
 */

@@ -307,7 +308,7 @@ ftl_band_open(struct ftl_band *band, enum ftl_band_type type)
		ftl_abort();
	}

	ftl_md_persist_entry(md, band->id, p2l_map->band_dma_md, NULL,
	ftl_md_persist_entries(md, band->id, 1, p2l_map->band_dma_md, NULL,
			       band_open_cb, band, &band->md_persist_entry_ctx);
}

@@ -347,7 +348,7 @@ band_map_write_cb(struct ftl_basic_rq *brq)
		p2l_map->band_dma_md->state = FTL_BAND_STATE_CLOSED;
		p2l_map->band_dma_md->p2l_map_checksum = band_map_crc;

		ftl_md_persist_entry(md, band->id, p2l_map->band_dma_md, NULL,
		ftl_md_persist_entries(md, band->id, 1, p2l_map->band_dma_md, NULL,
				       band_close_cb, band, &band->md_persist_entry_ctx);
	} else {
#ifdef SPDK_FTL_RETRY_ON_ERROR
@@ -409,7 +410,7 @@ ftl_band_free(struct ftl_band *band)
	p2l_map->band_dma_md->close_seq_id = 0;
	p2l_map->band_dma_md->p2l_map_checksum = 0;

	ftl_md_persist_entry(md, band->id, p2l_map->band_dma_md, NULL,
	ftl_md_persist_entries(md, band->id, 1, p2l_map->band_dma_md, NULL,
			       band_free_cb, band, &band->md_persist_entry_ctx);

	/* TODO: The whole band erase code should probably be done here instead */
+10 −10
Original line number Diff line number Diff line
@@ -601,7 +601,7 @@ ftl_chunk_persist_free_state(struct ftl_nv_cache *nv_cache)
		p2l_map->chunk_dma_md->close_seq_id = 0;
		p2l_map->chunk_dma_md->p2l_map_checksum = 0;

		ftl_md_persist_entry(md, get_chunk_idx(chunk), p2l_map->chunk_dma_md, NULL,
		ftl_md_persist_entries(md, get_chunk_idx(chunk), 1, p2l_map->chunk_dma_md, NULL,
				       chunk_free_cb, chunk, &chunk->md_persist_entry_ctx);
	}
}
@@ -1892,7 +1892,7 @@ ftl_chunk_open(struct ftl_nv_cache_chunk *chunk)
	p2l_map->chunk_dma_md->state = FTL_CHUNK_STATE_OPEN;
	p2l_map->chunk_dma_md->p2l_map_checksum = 0;

	ftl_md_persist_entry(md, get_chunk_idx(chunk), p2l_map->chunk_dma_md,
	ftl_md_persist_entries(md, get_chunk_idx(chunk), 1, p2l_map->chunk_dma_md,
			       NULL, chunk_open_cb, chunk,
			       &chunk->md_persist_entry_ctx);
}
@@ -1943,7 +1943,7 @@ chunk_map_write_cb(struct ftl_basic_rq *brq)
		memcpy(p2l_map->chunk_dma_md, chunk->md, region->entry_size * FTL_BLOCK_SIZE);
		p2l_map->chunk_dma_md->state = FTL_CHUNK_STATE_CLOSED;
		p2l_map->chunk_dma_md->p2l_map_checksum = chunk_map_crc;
		ftl_md_persist_entry(md, get_chunk_idx(chunk), chunk->p2l_map.chunk_dma_md,
		ftl_md_persist_entries(md, get_chunk_idx(chunk), 1, chunk->p2l_map.chunk_dma_md,
				       NULL, chunk_close_cb, chunk,
				       &chunk->md_persist_entry_ctx);
	} else {
@@ -2022,7 +2022,7 @@ restore_fill_p2l_map_cb(struct ftl_basic_rq *parent)
	p2l_map->chunk_dma_md->blocks_written = chunk->nv_cache->chunk_blocks;
	p2l_map->chunk_dma_md->p2l_map_checksum = chunk_map_crc;

	ftl_md_persist_entry(md, get_chunk_idx(chunk), p2l_map->chunk_dma_md, NULL,
	ftl_md_persist_entries(md, get_chunk_idx(chunk), 1, p2l_map->chunk_dma_md, NULL,
			       restore_chunk_close_cb, parent, &chunk->md_persist_entry_ctx);
}

+5 −4
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright (C) 2022 Intel Corporation.
 *   Copyright 2023 Solidigm All Rights Reserved
 *   All rights reserved.
 */

@@ -204,7 +205,7 @@ ftl_p2l_ckpt_issue(struct ftl_rq *rq)
	md_page->p2l_ckpt.p2l_checksum = spdk_crc32c_update(map_page,
					 rq->num_blocks * sizeof(struct ftl_p2l_map_entry), 0);
	/* Save the P2L map entry */
	ftl_md_persist_entry(ckpt->md, p2l_map_page_no, map_page, md_page, ftl_p2l_ckpt_issue_end,
	ftl_md_persist_entries(ckpt->md, p2l_map_page_no, 1, map_page, md_page, ftl_p2l_ckpt_issue_end,
			       rq, &rq->md_persist_entry_ctx);
}

@@ -308,7 +309,7 @@ ftl_mngt_persist_band_p2l(struct ftl_mngt_process *mngt, struct ftl_p2l_sync_ctx
					 FTL_NUM_LBA_IN_BLOCK * sizeof(struct ftl_p2l_map_entry), 0);

	/* Save the P2L map entry */
	ftl_md_persist_entry(ckpt->md, ctx->page_start, map_page, md_page,
	ftl_md_persist_entries(ckpt->md, ctx->page_start, 1, map_page, md_page,
			       ftl_p2l_ckpt_persist_end, mngt, &band->md_persist_entry_ctx);
}

+9 −4
Original line number Diff line number Diff line
@@ -701,7 +701,7 @@ ftl_md_persist_entry_write_blocks(struct ftl_md_io_entry_ctx *ctx, struct ftl_md

	rc = write_blocks(md->dev, md->region->bdev_desc, md->region->ioch,
			  ctx->buffer, ctx->vss_buffer,
			  persist_entry_lba(md, ctx->start_entry), md->region->entry_size,
			  persist_entry_lba(md, ctx->start_entry), md->region->entry_size * ctx->num_entries,
			  persist_entry_cb, ctx);
	if (spdk_unlikely(rc)) {
		if (rc == -ENOMEM) {
@@ -756,14 +756,18 @@ _ftl_md_persist_entry(struct ftl_md_io_entry_ctx *ctx)
}

void
ftl_md_persist_entry(struct ftl_md *md, uint64_t start_entry, void *buffer, void *vss_buffer,
		     ftl_md_io_entry_cb cb, void *cb_arg,
ftl_md_persist_entries(struct ftl_md *md, uint64_t start_entry, uint64_t num_entries, void *buffer,
		       void *vss_buffer, ftl_md_io_entry_cb cb, void *cb_arg,
		       struct ftl_md_io_entry_ctx *ctx)
{
	if (spdk_unlikely(0 == md->region->entry_size)) {
		/* This MD has not been configured to support persist entry call */
		ftl_abort();
	}
	if (spdk_unlikely(start_entry + num_entries > md->region->num_entries)) {
		/* Exceeding number of available entires */
		ftl_abort();
	}

	/* Initialize persist entry context */
	ctx->cb = cb;
@@ -771,6 +775,7 @@ ftl_md_persist_entry(struct ftl_md *md, uint64_t start_entry, void *buffer, void
	ctx->md = md;
	ctx->start_entry = start_entry;
	ctx->buffer = buffer;
	ctx->num_entries = num_entries;
	ctx->vss_buffer = vss_buffer ? : md->entry_vss_dma_buf;

	_ftl_md_persist_entry(ctx);
+7 −3
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright (C) 2022 Intel Corporation.
 *   Copyright 2023 Solidigm All Rights Reserved
 *   All rights reserved.
 */

@@ -105,6 +106,7 @@ struct ftl_md_io_entry_ctx {
	void *cb_arg;
	struct ftl_md *md;
	uint64_t start_entry;
	uint64_t num_entries;
	void *buffer;
	void *vss_buffer;
	struct spdk_bdev_io_wait_entry bdev_io_wait;
@@ -291,14 +293,16 @@ void ftl_md_persist(struct ftl_md *md);
 *
 * @param md Metadata to be persisted
 * @param start_entry Starting index of entry to be persisted
 * @param num_entries Number of entries to be persisted
 * @param buffer DMA buffer for writing the entry to the device
 * @param vss_buffer DMA buffer for writing the entry VSS to the device
 * @param cb Completion called on persist entry end
 * @param cb_arg Context returned on completion
 * @param ctx Operation context structure
 */
void ftl_md_persist_entry(struct ftl_md *md, uint64_t start_entry, void *buffer, void *vss_buffer,
			  ftl_md_io_entry_cb cb, void *cb_arg,
void ftl_md_persist_entries(struct ftl_md *md, uint64_t start_entry, uint64_t num_entries,
			    void *buffer,
			    void *vss_buffer, ftl_md_io_entry_cb cb, void *cb_arg,
			    struct ftl_md_io_entry_ctx *ctx);

/**