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 <wojciech.malikowski@intel.com> Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/471909 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
This commit is contained in:
parent
55342d972b
commit
777ce6d83c
@ -235,7 +235,7 @@ _ftl_band_set_closed(struct ftl_band *band)
|
|||||||
if (spdk_likely(band->num_zones)) {
|
if (spdk_likely(band->num_zones)) {
|
||||||
LIST_INSERT_HEAD(&dev->shut_bands, band, list_entry);
|
LIST_INSERT_HEAD(&dev->shut_bands, band, list_entry);
|
||||||
CIRCLEQ_FOREACH(zone, &band->zones, circleq) {
|
CIRCLEQ_FOREACH(zone, &band->zones, circleq) {
|
||||||
zone->state = SPDK_BDEV_ZONE_STATE_CLOSED;
|
zone->info.state = SPDK_BDEV_ZONE_STATE_CLOSED;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LIST_REMOVE(band, list_entry);
|
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 = (num_req / band->num_zones) * xfer_size;
|
||||||
addr.offset += zone->start_addr.offset;
|
addr.offset += zone->info.zone_id;
|
||||||
|
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
@ -417,7 +417,7 @@ ftl_band_head_md_addr(struct ftl_band *band)
|
|||||||
return ftl_to_addr(FTL_ADDR_INVALID);
|
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
|
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;
|
struct ftl_zone *_zone;
|
||||||
size_t _num_zones = 0;
|
size_t _num_zones = 0;
|
||||||
CIRCLEQ_FOREACH(_zone, &band->zones, circleq) {
|
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++;
|
_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;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1033,7 +1033,7 @@ ftl_erase_fail(struct ftl_io *io, int status)
|
|||||||
ftl_addr2str(io->addr, buf, sizeof(buf)), status);
|
ftl_addr2str(io->addr, buf, sizeof(buf)), status);
|
||||||
|
|
||||||
zone = ftl_band_zone_from_addr(band, io->addr);
|
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);
|
ftl_band_remove_zone(band, zone);
|
||||||
band->tail_md_addr = ftl_band_tail_md_addr(band);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
zone = ftl_band_zone_from_addr(io->band, io->addr);
|
zone = ftl_band_zone_from_addr(io->band, io->addr);
|
||||||
zone->state = SPDK_BDEV_ZONE_STATE_EMPTY;
|
zone->info.state = SPDK_BDEV_ZONE_STATE_EMPTY;
|
||||||
zone->write_offset = zone->start_addr.offset;
|
zone->info.write_pointer = zone->info.zone_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -1065,7 +1065,7 @@ ftl_band_erase(struct ftl_band *band)
|
|||||||
ftl_band_set_state(band, FTL_BAND_STATE_PREP);
|
ftl_band_set_state(band, FTL_BAND_STATE_PREP);
|
||||||
|
|
||||||
CIRCLEQ_FOREACH(zone, &band->zones, circleq) {
|
CIRCLEQ_FOREACH(zone, &band->zones, circleq) {
|
||||||
if (zone->state == SPDK_BDEV_ZONE_STATE_EMPTY) {
|
if (zone->info.state == SPDK_BDEV_ZONE_STATE_EMPTY) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1075,7 +1075,7 @@ ftl_band_erase(struct ftl_band *band)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
io->addr = zone->start_addr;
|
io->addr.offset = zone->info.zone_id;
|
||||||
rc = ftl_io_erase(io);
|
rc = ftl_io_erase(io);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
assert(0);
|
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. */
|
/* Erasing band may fail after it was assigned to wptr. */
|
||||||
/* In such a case zone is no longer in band->zones queue. */
|
/* 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);
|
result = ftl_band_next_zone(band, zone);
|
||||||
} else {
|
} else {
|
||||||
CIRCLEQ_FOREACH_REVERSE(entry, &band->zones, circleq) {
|
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;
|
result = entry;
|
||||||
} else {
|
} else {
|
||||||
if (!result) {
|
if (!result) {
|
||||||
|
@ -50,18 +50,11 @@ struct spdk_ftl_dev;
|
|||||||
struct ftl_lba_map_request;
|
struct ftl_lba_map_request;
|
||||||
|
|
||||||
struct ftl_zone {
|
struct ftl_zone {
|
||||||
/* Zone state */
|
struct spdk_bdev_zone_info info;
|
||||||
enum spdk_bdev_zone_state state;
|
|
||||||
|
|
||||||
/* Indicates that there is inflight write */
|
/* Indicates that there is inflight write */
|
||||||
bool busy;
|
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;
|
CIRCLEQ_ENTRY(ftl_zone) circleq;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -236,7 +229,7 @@ ftl_band_empty(const struct ftl_band *band)
|
|||||||
static inline struct ftl_zone *
|
static inline struct ftl_zone *
|
||||||
ftl_band_next_zone(struct ftl_band *band, struct ftl_zone *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);
|
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
|
static inline int
|
||||||
ftl_zone_is_writable(const struct ftl_zone *zone)
|
ftl_zone_is_writable(const struct ftl_zone *zone)
|
||||||
{
|
{
|
||||||
return (zone->state == SPDK_BDEV_ZONE_STATE_OPEN ||
|
return (zone->info.state == SPDK_BDEV_ZONE_STATE_OPEN ||
|
||||||
zone->state == SPDK_BDEV_ZONE_STATE_EMPTY) &&
|
zone->info.state == SPDK_BDEV_ZONE_STATE_EMPTY) &&
|
||||||
!zone->busy;
|
!zone->busy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,8 +358,8 @@ ftl_submit_erase(struct ftl_io *io)
|
|||||||
for (i = 0; i < io->lbk_cnt; ++i) {
|
for (i = 0; i < io->lbk_cnt; ++i) {
|
||||||
if (i != 0) {
|
if (i != 0) {
|
||||||
zone = ftl_band_next_zone(band, ftl_band_zone_from_addr(band, addr));
|
zone = ftl_band_next_zone(band, ftl_band_zone_from_addr(band, addr));
|
||||||
assert(zone->state == SPDK_BDEV_ZONE_STATE_CLOSED);
|
assert(zone->info.state == SPDK_BDEV_ZONE_STATE_CLOSED);
|
||||||
addr = zone->start_addr;
|
addr.offset = zone->info.zone_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(ftl_addr_get_zone_offset(dev, addr) == 0);
|
assert(ftl_addr_get_zone_offset(dev, addr) == 0);
|
||||||
@ -484,7 +484,7 @@ ftl_wptr_init(struct ftl_band *band)
|
|||||||
wptr->dev = dev;
|
wptr->dev = dev;
|
||||||
wptr->band = band;
|
wptr->band = band;
|
||||||
wptr->zone = CIRCLEQ_FIRST(&band->zones);
|
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);
|
TAILQ_INIT(&wptr->pending_queue);
|
||||||
|
|
||||||
return wptr;
|
return wptr;
|
||||||
@ -620,7 +620,7 @@ ftl_wptr_ready(struct ftl_wptr *wptr)
|
|||||||
|
|
||||||
if (spdk_unlikely(!ftl_zone_is_writable(wptr->zone))) {
|
if (spdk_unlikely(!ftl_zone_is_writable(wptr->zone))) {
|
||||||
/* Erasing band may fail after it was assigned to wptr. */
|
/* 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);
|
ftl_wptr_advance(wptr, wptr->dev->xfer_size);
|
||||||
}
|
}
|
||||||
return 0;
|
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);
|
wptr = ftl_wptr_from_band(io->band);
|
||||||
|
|
||||||
zone->busy = false;
|
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 some other write on the same band failed the write pointer would already be freed */
|
||||||
if (spdk_likely(wptr)) {
|
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);
|
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
|
static void
|
||||||
|
@ -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;
|
addr.offset = init_ctx->info[i].zone_id;
|
||||||
band = &dev->bands[ftl_addr_get_band(dev, addr)];
|
band = &dev->bands[ftl_addr_get_band(dev, addr)];
|
||||||
zone = &band->zone_buf[ftl_addr_get_punit(dev, addr)];
|
zone = &band->zone_buf[ftl_addr_get_punit(dev, addr)];
|
||||||
zone->state = init_ctx->info[i].state;
|
zone->info = init_ctx->info[i];
|
||||||
zone->start_addr = addr;
|
|
||||||
zone->write_offset = init_ctx->info[i].write_pointer;
|
|
||||||
|
|
||||||
/* TODO: add support for zone capacity less than zone size */
|
/* TODO: add support for zone capacity less than zone size */
|
||||||
if (init_ctx->info[i].capacity != ftl_get_num_blocks_in_zone(dev)) {
|
if (zone->info.capacity != ftl_get_num_blocks_in_zone(dev)) {
|
||||||
zone->state = SPDK_BDEV_ZONE_STATE_OFFLINE;
|
zone->info.state = SPDK_BDEV_ZONE_STATE_OFFLINE;
|
||||||
SPDK_ERRLOG("Zone capacity is not equal zone size for "
|
SPDK_ERRLOG("Zone capacity is not equal zone size for "
|
||||||
"zone id: %"PRIu64"\n", init_ctx->zone_id);
|
"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++;
|
band->num_zones++;
|
||||||
CIRCLEQ_INSERT_TAIL(&band->zones, zone, circleq);
|
CIRCLEQ_INSERT_TAIL(&band->zones, zone, circleq);
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
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++;
|
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);
|
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)) {
|
if (offset + io->lbk_cnt == ftl_get_num_blocks_in_zone(restore->dev)) {
|
||||||
zone = ftl_band_zone_from_addr(band, io->addr);
|
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 {
|
} else {
|
||||||
struct ftl_addr addr = io->addr;
|
struct ftl_addr addr = io->addr;
|
||||||
addr.offset += io->lbk_cnt;
|
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) {
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
addr = band->zone_buf[i].start_addr;
|
addr.offset = band->zone_buf[i].info.write_pointer;
|
||||||
addr.offset = band->zone_buf[i].write_offset;
|
|
||||||
|
|
||||||
buffer = spdk_dma_zmalloc(FTL_BLOCK_SIZE * dev->xfer_size, 0, NULL);
|
buffer = spdk_dma_zmalloc(FTL_BLOCK_SIZE * dev->xfer_size, 0, NULL);
|
||||||
if (spdk_unlikely(!buffer)) {
|
if (spdk_unlikely(!buffer)) {
|
||||||
|
@ -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) {
|
for (size_t i = 0; i < ftl_get_num_punits(dev); ++i) {
|
||||||
zone = &band->zone_buf[i];
|
zone = &band->zone_buf[i];
|
||||||
zone->state = SPDK_BDEV_ZONE_STATE_CLOSED;
|
zone->info.state = SPDK_BDEV_ZONE_STATE_CLOSED;
|
||||||
zone->start_addr.offset = zone_size * (id * ftl_get_num_punits(dev) + i);
|
zone->info.zone_id = zone_size * (id * ftl_get_num_punits(dev) + i);
|
||||||
CIRCLEQ_INSERT_TAIL(&band->zones, zone, circleq);
|
CIRCLEQ_INSERT_TAIL(&band->zones, zone, circleq);
|
||||||
band->num_zones++;
|
band->num_zones++;
|
||||||
}
|
}
|
||||||
|
@ -264,7 +264,7 @@ test_next_xfer_addr(void)
|
|||||||
CU_ASSERT_EQUAL(result.offset, expect.offset);
|
CU_ASSERT_EQUAL(result.offset, expect.offset);
|
||||||
|
|
||||||
/* Remove one zone and verify it's skipped properly */
|
/* 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);
|
CIRCLEQ_REMOVE(&g_band->zones, &g_band->zone_buf[1], circleq);
|
||||||
g_band->num_zones--;
|
g_band->num_zones--;
|
||||||
expect = addr_from_punit(2);
|
expect = addr_from_punit(2);
|
||||||
|
Loading…
Reference in New Issue
Block a user