From b7d508f5e554f34c03b359423ef26ff2f30a57bb Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Thu, 27 Aug 2020 14:01:40 -0700 Subject: [PATCH] blob: use spdk_bit_array_load/store_mask functions These functions were added during FTL development and are more efficient than the roll-your-own implementations blobstore had previously. Signed-off-by: Jim Harris Change-Id: Ie09e5c305e6e171af0258e805f2aac3b88822b5e Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3965 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Changpeng Liu Reviewed-by: Tomasz Zawadzki --- lib/blob/blobstore.c | 50 ++++++++------------------------------------ 1 file changed, 9 insertions(+), 41 deletions(-) diff --git a/lib/blob/blobstore.c b/lib/blob/blobstore.c index 98c25d307..80f5b148b 100644 --- a/lib/blob/blobstore.c +++ b/lib/blob/blobstore.c @@ -3204,41 +3204,6 @@ bs_load_ctx_fail(struct spdk_bs_load_ctx *ctx, int bserrno) free(ctx); } -static void -bs_set_mask(struct spdk_bit_array *array, struct spdk_bs_md_mask *mask) -{ - uint32_t i = 0; - - while (true) { - i = spdk_bit_array_find_first_set(array, i); - if (i >= mask->length) { - break; - } - mask->mask[i / 8] |= 1U << (i % 8); - i++; - } -} - -static int -bs_load_mask(struct spdk_bit_array **array_ptr, struct spdk_bs_md_mask *mask) -{ - struct spdk_bit_array *array; - uint32_t i; - - if (spdk_bit_array_resize(array_ptr, mask->length) < 0) { - return -ENOMEM; - } - - array = *array_ptr; - for (i = 0; i < mask->length; i++) { - if (mask->mask[i / 8] & (1U << (i % 8))) { - spdk_bit_array_set(array, i); - } - } - - return 0; -} - static void bs_write_super(spdk_bs_sequence_t *seq, struct spdk_blob_store *bs, struct spdk_bs_super_block *super, spdk_bs_sequence_cpl cb_fn, void *cb_arg) @@ -3271,7 +3236,7 @@ bs_write_used_clusters(spdk_bs_sequence_t *seq, void *arg, spdk_bs_sequence_cpl ctx->mask->length = ctx->bs->total_clusters; assert(ctx->mask->length == spdk_bit_array_capacity(ctx->bs->used_clusters)); - bs_set_mask(ctx->bs->used_clusters, ctx->mask); + spdk_bit_array_store_mask(ctx->bs->used_clusters, ctx->mask->mask); lba = bs_page_to_lba(ctx->bs, ctx->super->used_cluster_mask_start); lba_count = bs_page_to_lba(ctx->bs, ctx->super->used_cluster_mask_len); bs_sequence_write_dev(seq, ctx->mask, lba, lba_count, cb_fn, arg); @@ -3295,7 +3260,7 @@ bs_write_used_md(spdk_bs_sequence_t *seq, void *arg, spdk_bs_sequence_cpl cb_fn) ctx->mask->length = ctx->super->md_len; assert(ctx->mask->length == spdk_bit_array_capacity(ctx->bs->used_md_pages)); - bs_set_mask(ctx->bs->used_md_pages, ctx->mask); + spdk_bit_array_store_mask(ctx->bs->used_md_pages, ctx->mask->mask); lba = bs_page_to_lba(ctx->bs, ctx->super->used_page_mask_start); lba_count = bs_page_to_lba(ctx->bs, ctx->super->used_page_mask_len); bs_sequence_write_dev(seq, ctx->mask, lba, lba_count, cb_fn, arg); @@ -3328,7 +3293,7 @@ bs_write_used_blobids(spdk_bs_sequence_t *seq, void *arg, spdk_bs_sequence_cpl c ctx->mask->length = ctx->super->md_len; assert(ctx->mask->length == spdk_bit_array_capacity(ctx->bs->used_blobids)); - bs_set_mask(ctx->bs->used_blobids, ctx->mask); + spdk_bit_array_store_mask(ctx->bs->used_blobids, ctx->mask->mask); lba = bs_page_to_lba(ctx->bs, ctx->super->used_blobid_mask_start); lba_count = bs_page_to_lba(ctx->bs, ctx->super->used_blobid_mask_len); bs_sequence_write_dev(seq, ctx->mask, lba, lba_count, cb_fn, arg); @@ -3544,13 +3509,14 @@ bs_load_used_blobids_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno) * (in pages) of the metadata region */ assert(ctx->mask->length == ctx->super->md_len); - rc = bs_load_mask(&ctx->bs->used_blobids, ctx->mask); + rc = spdk_bit_array_resize(&ctx->bs->used_blobids, ctx->mask->length); if (rc < 0) { spdk_free(ctx->mask); bs_load_ctx_fail(ctx, rc); return; } + spdk_bit_array_load_mask(ctx->bs->used_blobids, ctx->mask->mask); bs_load_complete(ctx); } @@ -3574,13 +3540,14 @@ bs_load_used_clusters_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno) /* The length of the mask must be exactly equal to the total number of clusters */ assert(ctx->mask->length == ctx->bs->total_clusters); - rc = bs_load_mask(&ctx->bs->used_clusters, ctx->mask); + rc = spdk_bit_array_resize(&ctx->bs->used_clusters, ctx->mask->length); if (rc < 0) { spdk_free(ctx->mask); bs_load_ctx_fail(ctx, rc); return; } + spdk_bit_array_load_mask(ctx->bs->used_clusters, ctx->mask->mask); ctx->bs->num_free_clusters = spdk_bit_array_count_clear(ctx->bs->used_clusters); assert(ctx->bs->num_free_clusters <= ctx->bs->total_clusters); @@ -3620,13 +3587,14 @@ bs_load_used_pages_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno) /* The length of the mask must be exactly equal to the size (in pages) of the metadata region */ assert(ctx->mask->length == ctx->super->md_len); - rc = bs_load_mask(&ctx->bs->used_md_pages, ctx->mask); + rc = spdk_bit_array_resize(&ctx->bs->used_md_pages, ctx->mask->length); if (rc < 0) { spdk_free(ctx->mask); bs_load_ctx_fail(ctx, rc); return; } + spdk_bit_array_load_mask(ctx->bs->used_md_pages, ctx->mask->mask); spdk_free(ctx->mask); /* Read the used clusters mask */