mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-17 09:43:59 +08:00
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: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
e29158b4ff
commit
45919fbfe1
@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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 \
|
|||||||
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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user