Commit f4d5dc33 authored by Damien Le Moal's avatar Damien Le Moal Committed by Jens Axboe
Browse files

null_blk: Introduce the zone_full parameter



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: default avatarDamien Le Moal <dlemoal@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Link: https://lore.kernel.org/r/20240704052816.623865-2-dlemoal@kernel.org


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent dd54fd4e
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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 */
+8 −2
Original line number Diff line number Diff line
@@ -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;
		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;
	}