Commit 45919fbf authored by Bart Van Assche's avatar Bart Van Assche Committed by Jens Axboe

null_blk: Enable modifying 'submit_queues' after an instance has been configured

This patch makes it possible to test blk_mq_update_nr_hw_queues() from
inside a VM.

Cc: Christoph Hellwig <hch@infradead.org>
Cc: Ming Lei <ming.lei@redhat.com>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent e29158b4
...@@ -227,7 +227,7 @@ static ssize_t nullb_device_uint_attr_store(unsigned int *val, ...@@ -227,7 +227,7 @@ static ssize_t nullb_device_uint_attr_store(unsigned int *val,
int result; int result;
result = kstrtouint(page, 0, &tmp); result = kstrtouint(page, 0, &tmp);
if (result) if (result < 0)
return result; return result;
*val = tmp; *val = tmp;
...@@ -241,7 +241,7 @@ static ssize_t nullb_device_ulong_attr_store(unsigned long *val, ...@@ -241,7 +241,7 @@ static ssize_t nullb_device_ulong_attr_store(unsigned long *val,
unsigned long tmp; unsigned long tmp;
result = kstrtoul(page, 0, &tmp); result = kstrtoul(page, 0, &tmp);
if (result) if (result < 0)
return result; return result;
*val = tmp; *val = tmp;
...@@ -255,7 +255,7 @@ static ssize_t nullb_device_bool_attr_store(bool *val, const char *page, ...@@ -255,7 +255,7 @@ static ssize_t nullb_device_bool_attr_store(bool *val, const char *page,
int result; int result;
result = kstrtobool(page, &tmp); result = kstrtobool(page, &tmp);
if (result) if (result < 0)
return result; return result;
*val = tmp; *val = tmp;
...@@ -263,7 +263,7 @@ static ssize_t nullb_device_bool_attr_store(bool *val, const char *page, ...@@ -263,7 +263,7 @@ static ssize_t nullb_device_bool_attr_store(bool *val, const char *page,
} }
/* The following macro should only be used with TYPE = {uint, ulong, bool}. */ /* The following macro should only be used with TYPE = {uint, ulong, bool}. */
#define NULLB_DEVICE_ATTR(NAME, TYPE) \ #define NULLB_DEVICE_ATTR(NAME, TYPE, APPLY) \
static ssize_t \ static ssize_t \
nullb_device_##NAME##_show(struct config_item *item, char *page) \ nullb_device_##NAME##_show(struct config_item *item, char *page) \
{ \ { \
...@@ -274,32 +274,57 @@ static ssize_t \ ...@@ -274,32 +274,57 @@ static ssize_t \
nullb_device_##NAME##_store(struct config_item *item, const char *page, \ nullb_device_##NAME##_store(struct config_item *item, const char *page, \
size_t count) \ size_t count) \
{ \ { \
int (*apply_fn)(struct nullb_device *dev, TYPE new_value) = APPLY; \
struct nullb_device *dev = to_nullb_device(item); \ struct nullb_device *dev = to_nullb_device(item); \
TYPE new_value; \
int ret; \
\ \
if (test_bit(NULLB_DEV_FL_CONFIGURED, &dev->flags)) \ ret = nullb_device_##TYPE##_attr_store(&new_value, page, count); \
return -EBUSY; \ if (ret < 0) \
return nullb_device_##TYPE##_attr_store(&dev->NAME, page, count); \ return ret; \
if (apply_fn) \
ret = apply_fn(dev, new_value); \
else if (test_bit(NULLB_DEV_FL_CONFIGURED, &dev->flags)) \
ret = -EBUSY; \
if (ret < 0) \
return ret; \
dev->NAME = new_value; \
return count; \
} \ } \
CONFIGFS_ATTR(nullb_device_, NAME); CONFIGFS_ATTR(nullb_device_, NAME);
NULLB_DEVICE_ATTR(size, ulong); static int nullb_apply_submit_queues(struct nullb_device *dev,
NULLB_DEVICE_ATTR(completion_nsec, ulong); unsigned int submit_queues)
NULLB_DEVICE_ATTR(submit_queues, uint); {
NULLB_DEVICE_ATTR(home_node, uint); struct nullb *nullb = dev->nullb;
NULLB_DEVICE_ATTR(queue_mode, uint); struct blk_mq_tag_set *set;
NULLB_DEVICE_ATTR(blocksize, uint);
NULLB_DEVICE_ATTR(irqmode, uint); if (!nullb)
NULLB_DEVICE_ATTR(hw_queue_depth, uint); return 0;
NULLB_DEVICE_ATTR(index, uint);
NULLB_DEVICE_ATTR(blocking, bool); set = nullb->tag_set;
NULLB_DEVICE_ATTR(use_per_node_hctx, bool); blk_mq_update_nr_hw_queues(set, submit_queues);
NULLB_DEVICE_ATTR(memory_backed, bool); return set->nr_hw_queues == submit_queues ? 0 : -ENOMEM;
NULLB_DEVICE_ATTR(discard, bool); }
NULLB_DEVICE_ATTR(mbps, uint);
NULLB_DEVICE_ATTR(cache_size, ulong); NULLB_DEVICE_ATTR(size, ulong, NULL);
NULLB_DEVICE_ATTR(zoned, bool); NULLB_DEVICE_ATTR(completion_nsec, ulong, NULL);
NULLB_DEVICE_ATTR(zone_size, ulong); NULLB_DEVICE_ATTR(submit_queues, uint, nullb_apply_submit_queues);
NULLB_DEVICE_ATTR(zone_nr_conv, uint); NULLB_DEVICE_ATTR(home_node, uint, NULL);
NULLB_DEVICE_ATTR(queue_mode, uint, NULL);
NULLB_DEVICE_ATTR(blocksize, uint, NULL);
NULLB_DEVICE_ATTR(irqmode, uint, NULL);
NULLB_DEVICE_ATTR(hw_queue_depth, uint, NULL);
NULLB_DEVICE_ATTR(index, uint, NULL);
NULLB_DEVICE_ATTR(blocking, bool, NULL);
NULLB_DEVICE_ATTR(use_per_node_hctx, bool, NULL);
NULLB_DEVICE_ATTR(memory_backed, bool, NULL);
NULLB_DEVICE_ATTR(discard, bool, NULL);
NULLB_DEVICE_ATTR(mbps, uint, NULL);
NULLB_DEVICE_ATTR(cache_size, ulong, NULL);
NULLB_DEVICE_ATTR(zoned, bool, NULL);
NULLB_DEVICE_ATTR(zone_size, ulong, NULL);
NULLB_DEVICE_ATTR(zone_nr_conv, uint, NULL);
static ssize_t nullb_device_power_show(struct config_item *item, char *page) static ssize_t nullb_device_power_show(struct config_item *item, char *page)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment