Commit 3299bf6d authored by Jim Harris's avatar Jim Harris Committed by Konrad Sztyber
Browse files

blob: remove all references to pages as io_units



When blobstore was first created, everything was in terms of 4KB
pages - this included metadata page size and the unit for I/O
operations.

A bit later, we introduced concept of "io_unit". If a blobstore
was put on a bdev with 512 blocksize, then the io_unit could be
512 bytes.

But when this happened, we should have changed all of the blobstore
code such that remaining "page" references only referred to metadata
pages. Instead, we left a bunch of places where we would convert
various values to/from a number of 4KB pages, and then to the number
of io_units. This made the code quite confusing, since direct
conversion to/from io_units would have been much clearer.

This existing problem was exacerbated with the upcoming patch to support
variable metadata page sizes. We need things like spdk_bs_get_page_size()
to return the size of the metadata pages, which may not be 4KB.

So make all of the changes necessary such that all references to
"page" now means "metadata page". This includes removing the
spdk_blob_get_num_pages() function, which no longer makes sense.

Signed-off-by: default avatarJim Harris <jim.harris@samsung.com>
Change-Id: I66e93e7a4325a3b032bb16edaf657ef12044e1fd
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/25368


Community-CI: Mellanox Build Bot
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Community-CI: Community CI Samsung <spdk.community.ci.samsung@gmail.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent 671ee5e0
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -375,7 +375,7 @@ show_bs_cb(void *arg1, spdk_blob_id blobid, int bserrno)
		printf("\tsuper blob ID: none assigned\n");
	}

	printf("\tpage size: %" PRIu64 "\n", cli_context->page_size);
	printf("\tmd page size: %" PRIu64 "\n", cli_context->page_size);
	printf("\tio unit size: %" PRIu64 "\n", cli_context->io_unit_size);

	val = spdk_bs_get_cluster_size(cli_context->bs);
@@ -422,8 +422,8 @@ show_blob(struct cli_context_t *cli_context)
	printf("# of bytes: %" PRIu64 "\n",
	       val * spdk_bs_get_cluster_size(cli_context->bs));

	val = spdk_blob_get_num_pages(cli_context->blob);
	printf("# of pages: %" PRIu64 "\n", val);
	val = spdk_blob_get_num_io_units(cli_context->blob);
	printf("# of io units: %" PRIu64 "\n", val);

	spdk_blob_get_xattr_names(cli_context->blob, &names);

+1 −10
Original line number Diff line number Diff line
@@ -440,7 +440,7 @@ void spdk_bs_get_super(struct spdk_blob_store *bs,
uint64_t spdk_bs_get_cluster_size(struct spdk_blob_store *bs);

/**
 * Get the page size in bytes. This is the write and read granularity of blobs.
 * Get the metadata page size in bytes.
 *
 * \param bs blobstore to query.
 *
@@ -484,15 +484,6 @@ uint64_t spdk_bs_total_data_cluster_count(struct spdk_blob_store *bs);
 */
spdk_blob_id spdk_blob_get_id(struct spdk_blob *blob);

/**
 * Get the number of pages allocated to the blob.
 *
 * \param blob Blob struct to query.
 *
 * \return the number of pages.
 */
uint64_t spdk_blob_get_num_pages(struct spdk_blob *blob);

/**
 * Get the number of io_units allocated to the blob.
 *
+1 −1
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@
SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk

SO_VER := 11
SO_VER := 12
SO_MINOR := 0

C_SRCS = blobstore.c request.c zeroes.c blob_bs_dev.c
+5 −8
Original line number Diff line number Diff line
@@ -195,16 +195,14 @@ blob_bs_is_range_valid(struct spdk_bs_dev *dev, uint64_t lba, uint64_t lba_count
{
	struct spdk_blob_bs_dev *b = (struct spdk_blob_bs_dev *)dev;
	struct spdk_blob *blob = b->blob;
	uint64_t	page;
	uint64_t	pages_per_cluster;
	uint64_t	io_units_per_cluster;

	/* The lba here is supposed to be the first lba of cluster. lba_count
	 * will typically be fixed e.g. 8192 for 4MiB cluster. */
	assert(lba_count == blob->bs->cluster_sz / dev->blocklen);
	assert(lba % lba_count == 0);

	pages_per_cluster = blob->bs->pages_per_cluster;
	page = bs_io_unit_to_page(blob->bs, lba);
	io_units_per_cluster = blob->bs->io_units_per_cluster;

	/* A blob will either have:
	* - no backing bs_bdev (normal thick blob), or
@@ -212,9 +210,9 @@ blob_bs_is_range_valid(struct spdk_bs_dev *dev, uint64_t lba, uint64_t lba_count
	* - blob backing bs_bdev (e.g snapshot)
	* It may be possible that backing bs_bdev has lesser number of clusters
	* than the child lvol blob because lvol blob has been expanded after
	* taking snapshot. In such a case, page will be outside the cluster page
	* taking snapshot. In such a case, page will be outside the cluster io_unit
	* range of the backing dev. Always return true for zeroes backing bdev. */
	return page < blob->active.num_clusters * pages_per_cluster;
	return lba < blob->active.num_clusters * io_units_per_cluster;
}

static bool
@@ -259,8 +257,7 @@ bs_create_blob_bs_dev(struct spdk_blob *blob)
		return NULL;
	}
	/* snapshot blob */
	b->bs_dev.blockcnt = blob->active.num_clusters *
			     blob->bs->pages_per_cluster * bs_io_unit_per_page(blob->bs);
	b->bs_dev.blockcnt = blob->active.num_clusters * blob->bs->io_units_per_cluster;
	b->bs_dev.blocklen = spdk_bs_get_io_unit_size(blob->bs);
	b->bs_dev.create_channel = NULL;
	b->bs_dev.destroy_channel = NULL;
+17 −21
Original line number Diff line number Diff line
@@ -2623,7 +2623,7 @@ blob_persist(spdk_bs_sequence_t *seq, struct spdk_blob *blob,
struct spdk_blob_copy_cluster_ctx {
	struct spdk_blob *blob;
	uint8_t *buf;
	uint64_t page;
	uint64_t io_unit;
	uint64_t new_cluster;
	uint32_t new_extent_page;
	spdk_bs_sequence_t *seq;
@@ -2761,7 +2761,7 @@ blob_write_copy_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
		return;
	}

	cluster_number = bs_page_to_cluster(ctx->blob->bs, ctx->page);
	cluster_number = bs_io_unit_to_cluster(ctx->blob->bs, ctx->io_unit);

	blob_insert_cluster_on_md_thread(ctx->blob, cluster_number, ctx->new_cluster,
					 ctx->new_extent_page, ctx->new_cluster_page, blob_insert_cluster_cpl, ctx);
@@ -2786,9 +2786,9 @@ blob_write_copy(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
}

static bool
blob_can_copy(struct spdk_blob *blob, uint64_t cluster_start_page, uint64_t *base_lba)
blob_can_copy(struct spdk_blob *blob, uint64_t cluster_start_io_unit, uint64_t *base_lba)
{
	uint64_t lba = bs_dev_page_to_lba(blob->back_bs_dev, cluster_start_page);
	uint64_t lba = bs_dev_io_unit_to_lba(blob, blob->back_bs_dev, cluster_start_io_unit);

	return (!blob_is_esnap_clone(blob) && blob->bs->dev->copy != NULL) &&
	       blob->back_bs_dev->translate_lba(blob->back_bs_dev, lba, base_lba);
@@ -2815,7 +2815,7 @@ bs_allocate_and_copy_cluster(struct spdk_blob *blob,
	struct spdk_bs_cpl cpl;
	struct spdk_bs_channel *ch;
	struct spdk_blob_copy_cluster_ctx *ctx;
	uint64_t cluster_start_page;
	uint64_t cluster_start_io_unit;
	uint32_t cluster_number;
	bool is_zeroes;
	bool can_copy;
@@ -2833,8 +2833,8 @@ bs_allocate_and_copy_cluster(struct spdk_blob *blob,
		return;
	}

	/* Round the io_unit offset down to the first page in the cluster */
	cluster_start_page = bs_io_unit_to_cluster_start(blob, io_unit);
	/* Round the io_unit offset down to the first io_unit in the cluster */
	cluster_start_io_unit = bs_io_unit_to_cluster_start(blob, io_unit);

	/* Calculate which index in the metadata cluster array the corresponding
	 * cluster is supposed to be at. */
@@ -2849,7 +2849,7 @@ bs_allocate_and_copy_cluster(struct spdk_blob *blob,
	assert(blob->bs->cluster_sz % blob->back_bs_dev->blocklen == 0);

	ctx->blob = blob;
	ctx->page = cluster_start_page;
	ctx->io_unit = cluster_start_io_unit;
	ctx->new_cluster_page = ch->new_cluster_page;
	memset(ctx->new_cluster_page, 0, SPDK_BS_PAGE_SIZE);

@@ -2858,13 +2858,13 @@ bs_allocate_and_copy_cluster(struct spdk_blob *blob,
	 * For other backing dev e.g. a snapshot, it could be invalid if
	 * the blob has been resized after snapshot was taken. */
	is_valid_range = blob->back_bs_dev->is_range_valid(blob->back_bs_dev,
			 bs_dev_page_to_lba(blob->back_bs_dev, cluster_start_page),
			 bs_dev_io_unit_to_lba(blob, blob->back_bs_dev, cluster_start_io_unit),
			 bs_dev_byte_to_lba(blob->back_bs_dev, blob->bs->cluster_sz));

	can_copy = is_valid_range && blob_can_copy(blob, cluster_start_page, &copy_src_lba);
	can_copy = is_valid_range && blob_can_copy(blob, cluster_start_io_unit, &copy_src_lba);

	is_zeroes = is_valid_range && blob->back_bs_dev->is_zeroes(blob->back_bs_dev,
			bs_dev_page_to_lba(blob->back_bs_dev, cluster_start_page),
			bs_dev_io_unit_to_lba(blob, blob->back_bs_dev, cluster_start_io_unit),
			bs_dev_byte_to_lba(blob->back_bs_dev, blob->bs->cluster_sz));
	if (blob->parent_id != SPDK_BLOBID_INVALID && !is_zeroes && !can_copy) {
		ctx->buf = spdk_malloc(blob->bs->cluster_sz, blob->back_bs_dev->blocklen,
@@ -2913,7 +2913,7 @@ bs_allocate_and_copy_cluster(struct spdk_blob *blob,
		} else {
			/* Read cluster from backing device */
			bs_sequence_read_bs_dev(ctx->seq, blob->back_bs_dev, ctx->buf,
						bs_dev_page_to_lba(blob->back_bs_dev, cluster_start_page),
						bs_dev_io_unit_to_lba(blob, blob->back_bs_dev, cluster_start_io_unit),
						bs_dev_byte_to_lba(blob->back_bs_dev, blob->bs->cluster_sz),
						blob_write_copy, ctx);
		}
@@ -3879,6 +3879,10 @@ bs_init_per_cluster_fields(struct spdk_blob_store *bs)
	if (spdk_u32_is_pow2(bs->pages_per_cluster)) {
		bs->pages_per_cluster_shift = spdk_u32log2(bs->pages_per_cluster);
	}
	bs->io_units_per_cluster = bs->cluster_sz / bs->io_unit_size;
	if (spdk_u32_is_pow2(bs->io_units_per_cluster)) {
		bs->io_units_per_cluster_shift = spdk_u32log2(bs->io_units_per_cluster);
	}
}

static int
@@ -6095,20 +6099,12 @@ spdk_blob_get_id(struct spdk_blob *blob)
	return blob->id;
}

uint64_t
spdk_blob_get_num_pages(struct spdk_blob *blob)
{
	assert(blob != NULL);

	return bs_cluster_to_page(blob->bs, blob->active.num_clusters);
}

uint64_t
spdk_blob_get_num_io_units(struct spdk_blob *blob)
{
	assert(blob != NULL);

	return spdk_blob_get_num_pages(blob) * bs_io_unit_per_page(blob->bs);
	return bs_cluster_to_io_unit(blob->bs, blob->active.num_clusters);
}

uint64_t
Loading