From 777ce6d83c377281f94d5f03f4892baa72bb415e Mon Sep 17 00:00:00 2001 From: Wojciech Malikowski Date: Mon, 21 Oct 2019 10:48:57 -0400 Subject: [PATCH] lib/ftl: Replace some fileds in ftl_zone with spdk_bdev_zone_info ftl_zone had reduntant fields to spdk_bdev_zone_info. Change-Id: I5ec5bbc74912f286d798027afed06d0cd1917cc2 Signed-off-by: Wojciech Malikowski Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/471909 Tested-by: SPDK CI Jenkins Community-CI: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris Reviewed-by: Konrad Sztyber --- lib/ftl/ftl_band.c | 24 +++++++++++----------- lib/ftl/ftl_band.h | 15 ++++---------- lib/ftl/ftl_core.c | 12 +++++------ lib/ftl/ftl_init.c | 10 ++++----- lib/ftl/ftl_restore.c | 9 ++++---- test/unit/lib/ftl/common/utils.c | 4 ++-- test/unit/lib/ftl/ftl_band.c/ftl_band_ut.c | 2 +- 7 files changed, 33 insertions(+), 43 deletions(-) diff --git a/lib/ftl/ftl_band.c b/lib/ftl/ftl_band.c index 81426c197..fb687d79b 100644 --- a/lib/ftl/ftl_band.c +++ b/lib/ftl/ftl_band.c @@ -235,7 +235,7 @@ _ftl_band_set_closed(struct ftl_band *band) if (spdk_likely(band->num_zones)) { LIST_INSERT_HEAD(&dev->shut_bands, band, list_entry); CIRCLEQ_FOREACH(zone, &band->zones, circleq) { - zone->state = SPDK_BDEV_ZONE_STATE_CLOSED; + zone->info.state = SPDK_BDEV_ZONE_STATE_CLOSED; } } else { LIST_REMOVE(band, list_entry); @@ -405,7 +405,7 @@ ftl_band_tail_md_addr(struct ftl_band *band) } addr.offset = (num_req / band->num_zones) * xfer_size; - addr.offset += zone->start_addr.offset; + addr.offset += zone->info.zone_id; return addr; } @@ -417,7 +417,7 @@ ftl_band_head_md_addr(struct ftl_band *band) return ftl_to_addr(FTL_ADDR_INVALID); } - return CIRCLEQ_FIRST(&band->zones)->start_addr; + return ftl_to_addr(CIRCLEQ_FIRST(&band->zones)->info.zone_id); } void @@ -549,7 +549,7 @@ ftl_band_next_xfer_addr(struct ftl_band *band, struct ftl_addr addr, size_t num_ struct ftl_zone *_zone; size_t _num_zones = 0; CIRCLEQ_FOREACH(_zone, &band->zones, circleq) { - if (spdk_likely(_zone->state != SPDK_BDEV_ZONE_STATE_OFFLINE)) { + if (spdk_likely(_zone->info.state != SPDK_BDEV_ZONE_STATE_OFFLINE)) { _num_zones++; } } @@ -588,7 +588,7 @@ ftl_band_next_xfer_addr(struct ftl_band *band, struct ftl_addr addr, size_t num_ } } - addr.offset = zone->start_addr.offset + offset; + addr.offset = zone->info.zone_id + offset; return addr; } @@ -1033,7 +1033,7 @@ ftl_erase_fail(struct ftl_io *io, int status) ftl_addr2str(io->addr, buf, sizeof(buf)), status); zone = ftl_band_zone_from_addr(band, io->addr); - zone->state = SPDK_BDEV_ZONE_STATE_OFFLINE; + zone->info.state = SPDK_BDEV_ZONE_STATE_OFFLINE; ftl_band_remove_zone(band, zone); band->tail_md_addr = ftl_band_tail_md_addr(band); } @@ -1048,8 +1048,8 @@ ftl_band_erase_cb(struct ftl_io *io, void *ctx, int status) return; } zone = ftl_band_zone_from_addr(io->band, io->addr); - zone->state = SPDK_BDEV_ZONE_STATE_EMPTY; - zone->write_offset = zone->start_addr.offset; + zone->info.state = SPDK_BDEV_ZONE_STATE_EMPTY; + zone->info.write_pointer = zone->info.zone_id; } int @@ -1065,7 +1065,7 @@ ftl_band_erase(struct ftl_band *band) ftl_band_set_state(band, FTL_BAND_STATE_PREP); CIRCLEQ_FOREACH(zone, &band->zones, circleq) { - if (zone->state == SPDK_BDEV_ZONE_STATE_EMPTY) { + if (zone->info.state == SPDK_BDEV_ZONE_STATE_EMPTY) { continue; } @@ -1075,7 +1075,7 @@ ftl_band_erase(struct ftl_band *band) break; } - io->addr = zone->start_addr; + io->addr.offset = zone->info.zone_id; rc = ftl_io_erase(io); if (rc) { assert(0); @@ -1112,11 +1112,11 @@ ftl_band_next_operational_zone(struct ftl_band *band, struct ftl_zone *zone) /* Erasing band may fail after it was assigned to wptr. */ /* In such a case zone is no longer in band->zones queue. */ - if (spdk_likely(zone->state != SPDK_BDEV_ZONE_STATE_OFFLINE)) { + if (spdk_likely(zone->info.state != SPDK_BDEV_ZONE_STATE_OFFLINE)) { result = ftl_band_next_zone(band, zone); } else { CIRCLEQ_FOREACH_REVERSE(entry, &band->zones, circleq) { - if (entry->start_addr.offset > zone->start_addr.offset) { + if (entry->info.zone_id > zone->info.zone_id) { result = entry; } else { if (!result) { diff --git a/lib/ftl/ftl_band.h b/lib/ftl/ftl_band.h index 0af99e544..92612bcef 100644 --- a/lib/ftl/ftl_band.h +++ b/lib/ftl/ftl_band.h @@ -50,18 +50,11 @@ struct spdk_ftl_dev; struct ftl_lba_map_request; struct ftl_zone { - /* Zone state */ - enum spdk_bdev_zone_state state; + struct spdk_bdev_zone_info info; /* Indicates that there is inflight write */ bool busy; - /* Current logical block's offset */ - uint64_t write_offset; - - /* First logical block of a zone */ - struct ftl_addr start_addr; - CIRCLEQ_ENTRY(ftl_zone) circleq; }; @@ -236,7 +229,7 @@ ftl_band_empty(const struct ftl_band *band) static inline struct ftl_zone * ftl_band_next_zone(struct ftl_band *band, struct ftl_zone *zone) { - assert(zone->state != SPDK_BDEV_ZONE_STATE_OFFLINE); + assert(zone->info.state != SPDK_BDEV_ZONE_STATE_OFFLINE); return CIRCLEQ_LOOP_NEXT(&band->zones, zone, circleq); } @@ -283,8 +276,8 @@ ftl_band_zone_is_first(struct ftl_band *band, struct ftl_zone *zone) static inline int ftl_zone_is_writable(const struct ftl_zone *zone) { - return (zone->state == SPDK_BDEV_ZONE_STATE_OPEN || - zone->state == SPDK_BDEV_ZONE_STATE_EMPTY) && + return (zone->info.state == SPDK_BDEV_ZONE_STATE_OPEN || + zone->info.state == SPDK_BDEV_ZONE_STATE_EMPTY) && !zone->busy; } diff --git a/lib/ftl/ftl_core.c b/lib/ftl/ftl_core.c index b061629f0..9338d7827 100644 --- a/lib/ftl/ftl_core.c +++ b/lib/ftl/ftl_core.c @@ -358,8 +358,8 @@ ftl_submit_erase(struct ftl_io *io) for (i = 0; i < io->lbk_cnt; ++i) { if (i != 0) { zone = ftl_band_next_zone(band, ftl_band_zone_from_addr(band, addr)); - assert(zone->state == SPDK_BDEV_ZONE_STATE_CLOSED); - addr = zone->start_addr; + assert(zone->info.state == SPDK_BDEV_ZONE_STATE_CLOSED); + addr.offset = zone->info.zone_id; } assert(ftl_addr_get_zone_offset(dev, addr) == 0); @@ -484,7 +484,7 @@ ftl_wptr_init(struct ftl_band *band) wptr->dev = dev; wptr->band = band; wptr->zone = CIRCLEQ_FIRST(&band->zones); - wptr->addr = wptr->zone->start_addr; + wptr->addr.offset = wptr->zone->info.zone_id; TAILQ_INIT(&wptr->pending_queue); return wptr; @@ -620,7 +620,7 @@ ftl_wptr_ready(struct ftl_wptr *wptr) if (spdk_unlikely(!ftl_zone_is_writable(wptr->zone))) { /* Erasing band may fail after it was assigned to wptr. */ - if (spdk_unlikely(wptr->zone->state == SPDK_BDEV_ZONE_STATE_OFFLINE)) { + if (spdk_unlikely(wptr->zone->info.state == SPDK_BDEV_ZONE_STATE_OFFLINE)) { ftl_wptr_advance(wptr, wptr->dev->xfer_size); } return 0; @@ -1519,7 +1519,7 @@ ftl_io_child_write_cb(struct ftl_io *io, void *ctx, int status) wptr = ftl_wptr_from_band(io->band); zone->busy = false; - zone->write_offset += io->lbk_cnt; + zone->info.write_pointer += io->lbk_cnt; /* If some other write on the same band failed the write pointer would already be freed */ if (spdk_likely(wptr)) { @@ -2148,7 +2148,7 @@ ftl_addr_is_written(struct ftl_band *band, struct ftl_addr addr) { struct ftl_zone *zone = ftl_band_zone_from_addr(band, addr); - return addr.offset < zone->write_offset; + return addr.offset < zone->info.write_pointer; } static void diff --git a/lib/ftl/ftl_init.c b/lib/ftl/ftl_init.c index ae1801674..9829bcfdc 100644 --- a/lib/ftl/ftl_init.c +++ b/lib/ftl/ftl_init.c @@ -822,18 +822,16 @@ ftl_dev_get_zone_info_cb(struct spdk_bdev_io *bdev_io, bool success, void *cb_ar addr.offset = init_ctx->info[i].zone_id; band = &dev->bands[ftl_addr_get_band(dev, addr)]; zone = &band->zone_buf[ftl_addr_get_punit(dev, addr)]; - zone->state = init_ctx->info[i].state; - zone->start_addr = addr; - zone->write_offset = init_ctx->info[i].write_pointer; + zone->info = init_ctx->info[i]; /* TODO: add support for zone capacity less than zone size */ - if (init_ctx->info[i].capacity != ftl_get_num_blocks_in_zone(dev)) { - zone->state = SPDK_BDEV_ZONE_STATE_OFFLINE; + if (zone->info.capacity != ftl_get_num_blocks_in_zone(dev)) { + zone->info.state = SPDK_BDEV_ZONE_STATE_OFFLINE; SPDK_ERRLOG("Zone capacity is not equal zone size for " "zone id: %"PRIu64"\n", init_ctx->zone_id); } - if (zone->state != SPDK_BDEV_ZONE_STATE_OFFLINE) { + if (zone->info.state != SPDK_BDEV_ZONE_STATE_OFFLINE) { band->num_zones++; CIRCLEQ_INSERT_TAIL(&band->zones, zone, circleq); } diff --git a/lib/ftl/ftl_restore.c b/lib/ftl/ftl_restore.c index b00c8a88a..e0591a503 100644 --- a/lib/ftl/ftl_restore.c +++ b/lib/ftl/ftl_restore.c @@ -1087,7 +1087,7 @@ ftl_pad_zone_pad_finish(struct ftl_restore_band *rband, bool direct_access) } for (i = 0; i < rband->band->num_zones; ++i) { - if (rband->band->zone_buf[i].state != SPDK_BDEV_ZONE_STATE_CLOSED) { + if (rband->band->zone_buf[i].info.state != SPDK_BDEV_ZONE_STATE_CLOSED) { num_pad_zones++; } } @@ -1168,7 +1168,7 @@ ftl_pad_zone_cb(struct ftl_io *io, void *arg, int status) offset = io->addr.offset % ftl_get_num_blocks_in_zone(restore->dev); if (offset + io->lbk_cnt == ftl_get_num_blocks_in_zone(restore->dev)) { zone = ftl_band_zone_from_addr(band, io->addr); - zone->state = SPDK_BDEV_ZONE_STATE_CLOSED; + zone->info.state = SPDK_BDEV_ZONE_STATE_CLOSED; } else { struct ftl_addr addr = io->addr; addr.offset += io->lbk_cnt; @@ -1216,12 +1216,11 @@ ftl_restore_pad_band(struct ftl_restore_band *rband) } for (i = 0; i < band->num_zones; ++i) { - if (band->zone_buf[i].state == SPDK_BDEV_ZONE_STATE_CLOSED) { + if (band->zone_buf[i].info.state == SPDK_BDEV_ZONE_STATE_CLOSED) { continue; } - addr = band->zone_buf[i].start_addr; - addr.offset = band->zone_buf[i].write_offset; + addr.offset = band->zone_buf[i].info.write_pointer; buffer = spdk_dma_zmalloc(FTL_BLOCK_SIZE * dev->xfer_size, 0, NULL); if (spdk_unlikely(!buffer)) { diff --git a/test/unit/lib/ftl/common/utils.c b/test/unit/lib/ftl/common/utils.c index ddf123488..ef302b70f 100644 --- a/test/unit/lib/ftl/common/utils.c +++ b/test/unit/lib/ftl/common/utils.c @@ -121,8 +121,8 @@ test_init_ftl_band(struct spdk_ftl_dev *dev, size_t id, size_t zone_size) for (size_t i = 0; i < ftl_get_num_punits(dev); ++i) { zone = &band->zone_buf[i]; - zone->state = SPDK_BDEV_ZONE_STATE_CLOSED; - zone->start_addr.offset = zone_size * (id * ftl_get_num_punits(dev) + i); + zone->info.state = SPDK_BDEV_ZONE_STATE_CLOSED; + zone->info.zone_id = zone_size * (id * ftl_get_num_punits(dev) + i); CIRCLEQ_INSERT_TAIL(&band->zones, zone, circleq); band->num_zones++; } diff --git a/test/unit/lib/ftl/ftl_band.c/ftl_band_ut.c b/test/unit/lib/ftl/ftl_band.c/ftl_band_ut.c index 6bfd237a4..fe22023b8 100644 --- a/test/unit/lib/ftl/ftl_band.c/ftl_band_ut.c +++ b/test/unit/lib/ftl/ftl_band.c/ftl_band_ut.c @@ -264,7 +264,7 @@ test_next_xfer_addr(void) CU_ASSERT_EQUAL(result.offset, expect.offset); /* Remove one zone and verify it's skipped properly */ - g_band->zone_buf[1].state = SPDK_BDEV_ZONE_STATE_OFFLINE; + g_band->zone_buf[1].info.state = SPDK_BDEV_ZONE_STATE_OFFLINE; CIRCLEQ_REMOVE(&g_band->zones, &g_band->zone_buf[1], circleq); g_band->num_zones--; expect = addr_from_punit(2);