Skip to content

Commit 45919fb

Browse files
bvanasscheaxboe
authored andcommitted
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 <[email protected]> Cc: Ming Lei <[email protected]> Cc: Hannes Reinecke <[email protected]> Cc: Johannes Thumshirn <[email protected]> Signed-off-by: Bart Van Assche <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent e29158b commit 45919fb

File tree

1 file changed

+50
-25
lines changed

1 file changed

+50
-25
lines changed

drivers/block/null_blk_main.c

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ static ssize_t nullb_device_uint_attr_store(unsigned int *val,
227227
int result;
228228

229229
result = kstrtouint(page, 0, &tmp);
230-
if (result)
230+
if (result < 0)
231231
return result;
232232

233233
*val = tmp;
@@ -241,7 +241,7 @@ static ssize_t nullb_device_ulong_attr_store(unsigned long *val,
241241
unsigned long tmp;
242242

243243
result = kstrtoul(page, 0, &tmp);
244-
if (result)
244+
if (result < 0)
245245
return result;
246246

247247
*val = tmp;
@@ -255,15 +255,15 @@ static ssize_t nullb_device_bool_attr_store(bool *val, const char *page,
255255
int result;
256256

257257
result = kstrtobool(page, &tmp);
258-
if (result)
258+
if (result < 0)
259259
return result;
260260

261261
*val = tmp;
262262
return count;
263263
}
264264

265265
/* The following macro should only be used with TYPE = {uint, ulong, bool}. */
266-
#define NULLB_DEVICE_ATTR(NAME, TYPE) \
266+
#define NULLB_DEVICE_ATTR(NAME, TYPE, APPLY) \
267267
static ssize_t \
268268
nullb_device_##NAME##_show(struct config_item *item, char *page) \
269269
{ \
@@ -274,32 +274,57 @@ static ssize_t \
274274
nullb_device_##NAME##_store(struct config_item *item, const char *page, \
275275
size_t count) \
276276
{ \
277+
int (*apply_fn)(struct nullb_device *dev, TYPE new_value) = APPLY; \
277278
struct nullb_device *dev = to_nullb_device(item); \
279+
TYPE new_value; \
280+
int ret; \
278281
\
279-
if (test_bit(NULLB_DEV_FL_CONFIGURED, &dev->flags)) \
280-
return -EBUSY; \
281-
return nullb_device_##TYPE##_attr_store(&dev->NAME, page, count); \
282+
ret = nullb_device_##TYPE##_attr_store(&new_value, page, count); \
283+
if (ret < 0) \
284+
return ret; \
285+
if (apply_fn) \
286+
ret = apply_fn(dev, new_value); \
287+
else if (test_bit(NULLB_DEV_FL_CONFIGURED, &dev->flags)) \
288+
ret = -EBUSY; \
289+
if (ret < 0) \
290+
return ret; \
291+
dev->NAME = new_value; \
292+
return count; \
282293
} \
283294
CONFIGFS_ATTR(nullb_device_, NAME);
284295

285-
NULLB_DEVICE_ATTR(size, ulong);
286-
NULLB_DEVICE_ATTR(completion_nsec, ulong);
287-
NULLB_DEVICE_ATTR(submit_queues, uint);
288-
NULLB_DEVICE_ATTR(home_node, uint);
289-
NULLB_DEVICE_ATTR(queue_mode, uint);
290-
NULLB_DEVICE_ATTR(blocksize, uint);
291-
NULLB_DEVICE_ATTR(irqmode, uint);
292-
NULLB_DEVICE_ATTR(hw_queue_depth, uint);
293-
NULLB_DEVICE_ATTR(index, uint);
294-
NULLB_DEVICE_ATTR(blocking, bool);
295-
NULLB_DEVICE_ATTR(use_per_node_hctx, bool);
296-
NULLB_DEVICE_ATTR(memory_backed, bool);
297-
NULLB_DEVICE_ATTR(discard, bool);
298-
NULLB_DEVICE_ATTR(mbps, uint);
299-
NULLB_DEVICE_ATTR(cache_size, ulong);
300-
NULLB_DEVICE_ATTR(zoned, bool);
301-
NULLB_DEVICE_ATTR(zone_size, ulong);
302-
NULLB_DEVICE_ATTR(zone_nr_conv, uint);
296+
static int nullb_apply_submit_queues(struct nullb_device *dev,
297+
unsigned int submit_queues)
298+
{
299+
struct nullb *nullb = dev->nullb;
300+
struct blk_mq_tag_set *set;
301+
302+
if (!nullb)
303+
return 0;
304+
305+
set = nullb->tag_set;
306+
blk_mq_update_nr_hw_queues(set, submit_queues);
307+
return set->nr_hw_queues == submit_queues ? 0 : -ENOMEM;
308+
}
309+
310+
NULLB_DEVICE_ATTR(size, ulong, NULL);
311+
NULLB_DEVICE_ATTR(completion_nsec, ulong, NULL);
312+
NULLB_DEVICE_ATTR(submit_queues, uint, nullb_apply_submit_queues);
313+
NULLB_DEVICE_ATTR(home_node, uint, NULL);
314+
NULLB_DEVICE_ATTR(queue_mode, uint, NULL);
315+
NULLB_DEVICE_ATTR(blocksize, uint, NULL);
316+
NULLB_DEVICE_ATTR(irqmode, uint, NULL);
317+
NULLB_DEVICE_ATTR(hw_queue_depth, uint, NULL);
318+
NULLB_DEVICE_ATTR(index, uint, NULL);
319+
NULLB_DEVICE_ATTR(blocking, bool, NULL);
320+
NULLB_DEVICE_ATTR(use_per_node_hctx, bool, NULL);
321+
NULLB_DEVICE_ATTR(memory_backed, bool, NULL);
322+
NULLB_DEVICE_ATTR(discard, bool, NULL);
323+
NULLB_DEVICE_ATTR(mbps, uint, NULL);
324+
NULLB_DEVICE_ATTR(cache_size, ulong, NULL);
325+
NULLB_DEVICE_ATTR(zoned, bool, NULL);
326+
NULLB_DEVICE_ATTR(zone_size, ulong, NULL);
327+
NULLB_DEVICE_ATTR(zone_nr_conv, uint, NULL);
303328

304329
static ssize_t nullb_device_power_show(struct config_item *item, char *page)
305330
{

0 commit comments

Comments
 (0)