]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
null_blk: Introduce the zone_full parameter
authorDamien Le Moal <dlemoal@kernel.org>
Thu, 4 Jul 2024 05:28:12 +0000 (14:28 +0900)
committerJens Axboe <axboe@kernel.dk>
Fri, 5 Jul 2024 06:42:04 +0000 (00:42 -0600)
Allow creating a zoned null_blk device with the initial state of its
sequential write required zones to be FULL. This is convenient to avoid
having to first write these zones to perform read performance evaluation
or test zone management operations such as zone reset (and zone reset
all).

Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Link: https://lore.kernel.org/r/20240704052816.623865-2-dlemoal@kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/null_blk/main.c
drivers/block/null_blk/null_blk.h
drivers/block/null_blk/zoned.c

index cbf4b29b16876d469e7ac3887d7bccaf4c316a79..9d0f6da77601b456dc1d348747bebd6653c6a2ef 100644 (file)
@@ -262,6 +262,10 @@ module_param_named(zone_append_max_sectors, g_zone_append_max_sectors, int, 0444
 MODULE_PARM_DESC(zone_append_max_sectors,
                 "Maximum size of a zone append command (in 512B sectors). Specify 0 for zone append emulation");
 
+static bool g_zone_full;
+module_param_named(zone_full, g_zone_full, bool, S_IRUGO);
+MODULE_PARM_DESC(zone_full, "Initialize the sequential write required zones of a zoned device to be full. Default: false");
+
 static struct nullb_device *null_alloc_dev(void);
 static void null_free_dev(struct nullb_device *dev);
 static void null_del_dev(struct nullb *nullb);
@@ -458,6 +462,7 @@ NULLB_DEVICE_ATTR(zone_nr_conv, uint, NULL);
 NULLB_DEVICE_ATTR(zone_max_open, uint, NULL);
 NULLB_DEVICE_ATTR(zone_max_active, uint, NULL);
 NULLB_DEVICE_ATTR(zone_append_max_sectors, uint, NULL);
+NULLB_DEVICE_ATTR(zone_full, bool, NULL);
 NULLB_DEVICE_ATTR(virt_boundary, bool, NULL);
 NULLB_DEVICE_ATTR(no_sched, bool, NULL);
 NULLB_DEVICE_ATTR(shared_tags, bool, NULL);
@@ -610,6 +615,7 @@ static struct configfs_attribute *nullb_device_attrs[] = {
        &nullb_device_attr_zone_append_max_sectors,
        &nullb_device_attr_zone_readonly,
        &nullb_device_attr_zone_offline,
+       &nullb_device_attr_zone_full,
        &nullb_device_attr_virt_boundary,
        &nullb_device_attr_no_sched,
        &nullb_device_attr_shared_tags,
@@ -700,7 +706,7 @@ static ssize_t memb_group_features_show(struct config_item *item, char *page)
                        "shared_tags,size,submit_queues,use_per_node_hctx,"
                        "virt_boundary,zoned,zone_capacity,zone_max_active,"
                        "zone_max_open,zone_nr_conv,zone_offline,zone_readonly,"
-                       "zone_size,zone_append_max_sectors\n");
+                       "zone_size,zone_append_max_sectors,zone_full\n");
 }
 
 CONFIGFS_ATTR_RO(memb_group_, features);
@@ -781,6 +787,7 @@ static struct nullb_device *null_alloc_dev(void)
        dev->zone_max_open = g_zone_max_open;
        dev->zone_max_active = g_zone_max_active;
        dev->zone_append_max_sectors = g_zone_append_max_sectors;
+       dev->zone_full = g_zone_full;
        dev->virt_boundary = g_virt_boundary;
        dev->no_sched = g_no_sched;
        dev->shared_tags = g_shared_tags;
index 3234e6c85eed8cfd8b6a64a4082ec002884f0766..a7bb32f73ec36aa5c7b59875cfe78b4ac66d7716 100644 (file)
@@ -101,6 +101,7 @@ struct nullb_device {
        bool memory_backed; /* if data is stored in memory */
        bool discard; /* if support discard */
        bool zoned; /* if device is zoned */
+       bool zone_full; /* Initialize zones to be full */
        bool virt_boundary; /* virtual boundary on/off for the device */
        bool no_sched; /* no IO scheduler for the device */
        bool shared_tags; /* share tag set between devices for blk-mq */
index 9f7151ad93cfc4a10a65a1be5da81903597cd9b1..7996e2e7dce28af79faa05136b3258bacc36a981 100644 (file)
@@ -145,7 +145,7 @@ int null_init_zoned_dev(struct nullb_device *dev,
                zone = &dev->zones[i];
 
                null_init_zone_lock(dev, zone);
-               zone->start = zone->wp = sector;
+               zone->start = sector;
                if (zone->start + dev->zone_size_sects > dev_capacity_sects)
                        zone->len = dev_capacity_sects - zone->start;
                else
@@ -153,7 +153,13 @@ int null_init_zoned_dev(struct nullb_device *dev,
                zone->capacity =
                        min_t(sector_t, zone->len, zone_capacity_sects);
                zone->type = BLK_ZONE_TYPE_SEQWRITE_REQ;
-               zone->cond = BLK_ZONE_COND_EMPTY;
+               if (dev->zone_full) {
+                       zone->cond = BLK_ZONE_COND_FULL;
+                       zone->wp = zone->start + zone->capacity;
+               } else{
+                       zone->cond = BLK_ZONE_COND_EMPTY;
+                       zone->wp = zone->start;
+               }
 
                sector += dev->zone_size_sects;
        }