]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/spdk/test/unit/lib/ftl/common/utils.c
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / spdk / test / unit / lib / ftl / common / utils.c
index 89a80789d3002a998e47f4e596b71205ace529da..dda828df8a2893f722cf5592297d9ffa4cbac8c2 100644 (file)
 #include "spdk/ftl.h"
 #include "ftl/ftl_core.h"
 
-struct spdk_ftl_dev *test_init_ftl_dev(const struct spdk_ocssd_geometry_data *geo,
-                                      const struct spdk_ftl_punit_range *range);
-struct ftl_band *test_init_ftl_band(struct spdk_ftl_dev *dev, size_t id);
+struct base_bdev_geometry {
+       size_t write_unit_size;
+       size_t zone_size;
+       size_t optimal_open_zones;
+       size_t blockcnt;
+};
+
+extern struct base_bdev_geometry g_geo;
+
+struct spdk_ftl_dev *test_init_ftl_dev(const struct base_bdev_geometry *geo);
+struct ftl_band *test_init_ftl_band(struct spdk_ftl_dev *dev, size_t id, size_t zone_size);
 void test_free_ftl_dev(struct spdk_ftl_dev *dev);
 void test_free_ftl_band(struct ftl_band *band);
-uint64_t test_offset_from_ppa(struct ftl_ppa ppa, struct ftl_band *band);
+uint64_t test_offset_from_addr(struct ftl_addr addr, struct ftl_band *band);
+
+DEFINE_STUB(spdk_bdev_desc_get_bdev, struct spdk_bdev *, (struct spdk_bdev_desc *desc), NULL);
+
+uint64_t
+spdk_bdev_get_zone_size(const struct spdk_bdev *bdev)
+{
+       return g_geo.zone_size;
+}
+
+uint32_t
+spdk_bdev_get_optimal_open_zones(const struct spdk_bdev *bdev)
+{
+       return g_geo.optimal_open_zones;
+}
 
 struct spdk_ftl_dev *
-test_init_ftl_dev(const struct spdk_ocssd_geometry_data *geo,
-                 const struct spdk_ftl_punit_range *range)
+test_init_ftl_dev(const struct base_bdev_geometry *geo)
 {
        struct spdk_ftl_dev *dev;
-       unsigned int punit;
 
        dev = calloc(1, sizeof(*dev));
        SPDK_CU_ASSERT_FATAL(dev != NULL);
 
-       dev->xfer_size = geo->ws_opt;
-       dev->geo = *geo;
-       dev->range = *range;
-       dev->core_thread.thread = spdk_thread_create("unit_test_thread", NULL);
-       spdk_set_thread(dev->core_thread.thread);
-
-       dev->bands = calloc(geo->num_chk, sizeof(*dev->bands));
+       dev->xfer_size = geo->write_unit_size;
+       dev->core_thread = spdk_thread_create("unit_test_thread", NULL);
+       spdk_set_thread(dev->core_thread);
+       dev->ioch = calloc(1, sizeof(*dev->ioch)
+                          + sizeof(struct ftl_io_channel *));
+       dev->num_bands = geo->blockcnt / (geo->zone_size * geo->optimal_open_zones);
+       dev->bands = calloc(dev->num_bands, sizeof(*dev->bands));
        SPDK_CU_ASSERT_FATAL(dev->bands != NULL);
 
-       dev->punits = calloc(ftl_dev_num_punits(dev), sizeof(*dev->punits));
-       SPDK_CU_ASSERT_FATAL(dev->punits != NULL);
-
-       for (size_t i = 0; i < ftl_dev_num_punits(dev); ++i) {
-               punit = range->begin + i;
-               dev->punits[i].dev = dev;
-               dev->punits[i].start_ppa.grp = punit % geo->num_grp;
-               dev->punits[i].start_ppa.pu = punit / geo->num_grp;
-       }
+       dev->lba_pool = spdk_mempool_create("ftl_ut", 2, 0x18000,
+                                           SPDK_MEMPOOL_DEFAULT_CACHE_SIZE,
+                                           SPDK_ENV_SOCKET_ID_ANY);
+       SPDK_CU_ASSERT_FATAL(dev->lba_pool != NULL);
 
        LIST_INIT(&dev->free_bands);
        LIST_INIT(&dev->shut_bands);
@@ -79,13 +94,13 @@ test_init_ftl_dev(const struct spdk_ocssd_geometry_data *geo,
 }
 
 struct ftl_band *
-test_init_ftl_band(struct spdk_ftl_dev *dev, size_t id)
+test_init_ftl_band(struct spdk_ftl_dev *dev, size_t id, size_t zone_size)
 {
        struct ftl_band *band;
-       struct ftl_chunk *chunk;
+       struct ftl_zone *zone;
 
        SPDK_CU_ASSERT_FATAL(dev != NULL);
-       SPDK_CU_ASSERT_FATAL(id < dev->geo.num_chk);
+       SPDK_CU_ASSERT_FATAL(id < dev->num_bands);
 
        band = &dev->bands[id];
        band->dev = dev;
@@ -93,23 +108,23 @@ test_init_ftl_band(struct spdk_ftl_dev *dev, size_t id)
 
        band->state = FTL_BAND_STATE_CLOSED;
        LIST_INSERT_HEAD(&dev->shut_bands, band, list_entry);
-       CIRCLEQ_INIT(&band->chunks);
+       CIRCLEQ_INIT(&band->zones);
 
-       band->lba_map.vld = spdk_bit_array_create(ftl_num_band_lbks(dev));
+       band->lba_map.vld = spdk_bit_array_create(ftl_get_num_blocks_in_band(dev));
        SPDK_CU_ASSERT_FATAL(band->lba_map.vld != NULL);
 
-       band->chunk_buf = calloc(ftl_dev_num_punits(dev), sizeof(*band->chunk_buf));
-       SPDK_CU_ASSERT_FATAL(band->chunk_buf != NULL);
-
-       for (size_t i = 0; i < ftl_dev_num_punits(dev); ++i) {
-               chunk = &band->chunk_buf[i];
-               chunk->pos = i;
-               chunk->state = FTL_CHUNK_STATE_CLOSED;
-               chunk->punit = &dev->punits[i];
-               chunk->start_ppa = dev->punits[i].start_ppa;
-               chunk->start_ppa.chk = band->id;
-               CIRCLEQ_INSERT_TAIL(&band->chunks, chunk, circleq);
-               band->num_chunks++;
+       band->zone_buf = calloc(ftl_get_num_punits(dev), sizeof(*band->zone_buf));
+       SPDK_CU_ASSERT_FATAL(band->zone_buf != NULL);
+
+       band->reloc_bitmap = spdk_bit_array_create(ftl_get_num_bands(dev));
+       SPDK_CU_ASSERT_FATAL(band->reloc_bitmap != NULL);
+
+       for (size_t i = 0; i < ftl_get_num_punits(dev); ++i) {
+               zone = &band->zone_buf[i];
+               zone->info.state = SPDK_BDEV_ZONE_STATE_FULL;
+               zone->info.zone_id = zone_size * (id * ftl_get_num_punits(dev) + i);
+               CIRCLEQ_INSERT_TAIL(&band->zones, zone, circleq);
+               band->num_zones++;
        }
 
        pthread_spin_init(&band->lba_map.lock, PTHREAD_PROCESS_PRIVATE);
@@ -119,11 +134,20 @@ test_init_ftl_band(struct spdk_ftl_dev *dev, size_t id)
 void
 test_free_ftl_dev(struct spdk_ftl_dev *dev)
 {
+       struct spdk_thread *thread;
+
        SPDK_CU_ASSERT_FATAL(dev != NULL);
-       spdk_set_thread(dev->core_thread.thread);
-       spdk_thread_exit(dev->core_thread.thread);
-       spdk_thread_destroy(dev->core_thread.thread);
-       free(dev->punits);
+       free(dev->ioch);
+
+       thread = dev->core_thread;
+
+       spdk_set_thread(thread);
+       spdk_thread_exit(thread);
+       while (!spdk_thread_is_exited(thread)) {
+               spdk_thread_poll(thread, 0, 0);
+       }
+       spdk_thread_destroy(thread);
+       spdk_mempool_free(dev->lba_pool);
        free(dev->bands);
        free(dev);
 }
@@ -133,20 +157,17 @@ test_free_ftl_band(struct ftl_band *band)
 {
        SPDK_CU_ASSERT_FATAL(band != NULL);
        spdk_bit_array_free(&band->lba_map.vld);
-       free(band->chunk_buf);
-       free(band->lba_map.map);
+       spdk_bit_array_free(&band->reloc_bitmap);
+       free(band->zone_buf);
        spdk_dma_free(band->lba_map.dma_buf);
 }
 
 uint64_t
-test_offset_from_ppa(struct ftl_ppa ppa, struct ftl_band *band)
+test_offset_from_addr(struct ftl_addr addr, struct ftl_band *band)
 {
        struct spdk_ftl_dev *dev = band->dev;
-       unsigned int punit;
 
-       /* TODO: ftl_ppa_flatten_punit should return uint32_t */
-       punit = ftl_ppa_flatten_punit(dev, ppa);
-       CU_ASSERT_EQUAL(ppa.chk, band->id);
+       CU_ASSERT_EQUAL(ftl_addr_get_band(dev, addr), band->id);
 
-       return punit * ftl_dev_lbks_in_chunk(dev) + ppa.lbk;
+       return addr.offset - band->id * ftl_get_num_blocks_in_band(dev);
 }