Commit 3c5820c743479285ce2678fd3c12b1fd39fe998f
Committed by
Jens Axboe
1 parent
06d2188644
Exists in
master
and in
7 other branches
block: Optimal I/O limit wrapper
Implement blk_limits_io_opt() and make blk_queue_io_opt() a wrapper around it. DM needs this to avoid poking at the queue_limits directly. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Showing 3 changed files with 22 additions and 2 deletions Side-by-side Diff
block/blk-settings.c
... | ... | @@ -428,6 +428,25 @@ |
428 | 428 | EXPORT_SYMBOL(blk_queue_io_min); |
429 | 429 | |
430 | 430 | /** |
431 | + * blk_limits_io_opt - set optimal request size for a device | |
432 | + * @limits: the queue limits | |
433 | + * @opt: smallest I/O size in bytes | |
434 | + * | |
435 | + * Description: | |
436 | + * Storage devices may report an optimal I/O size, which is the | |
437 | + * device's preferred unit for sustained I/O. This is rarely reported | |
438 | + * for disk drives. For RAID arrays it is usually the stripe width or | |
439 | + * the internal track size. A properly aligned multiple of | |
440 | + * optimal_io_size is the preferred request size for workloads where | |
441 | + * sustained throughput is desired. | |
442 | + */ | |
443 | +void blk_limits_io_opt(struct queue_limits *limits, unsigned int opt) | |
444 | +{ | |
445 | + limits->io_opt = opt; | |
446 | +} | |
447 | +EXPORT_SYMBOL(blk_limits_io_opt); | |
448 | + | |
449 | +/** | |
431 | 450 | * blk_queue_io_opt - set optimal request size for the queue |
432 | 451 | * @q: the request queue for the device |
433 | 452 | * @opt: optimal request size in bytes |
... | ... | @@ -442,7 +461,7 @@ |
442 | 461 | */ |
443 | 462 | void blk_queue_io_opt(struct request_queue *q, unsigned int opt) |
444 | 463 | { |
445 | - q->limits.io_opt = opt; | |
464 | + blk_limits_io_opt(&q->limits, opt); | |
446 | 465 | } |
447 | 466 | EXPORT_SYMBOL(blk_queue_io_opt); |
448 | 467 |
drivers/md/dm-stripe.c
... | ... | @@ -336,7 +336,7 @@ |
336 | 336 | unsigned chunk_size = (sc->chunk_mask + 1) << 9; |
337 | 337 | |
338 | 338 | blk_limits_io_min(limits, chunk_size); |
339 | - limits->io_opt = chunk_size * sc->stripes; | |
339 | + blk_limits_io_opt(limits, chunk_size * sc->stripes); | |
340 | 340 | } |
341 | 341 | |
342 | 342 | static struct target_type stripe_target = { |
include/linux/blkdev.h
... | ... | @@ -935,6 +935,7 @@ |
935 | 935 | unsigned int alignment); |
936 | 936 | extern void blk_limits_io_min(struct queue_limits *limits, unsigned int min); |
937 | 937 | extern void blk_queue_io_min(struct request_queue *q, unsigned int min); |
938 | +extern void blk_limits_io_opt(struct queue_limits *limits, unsigned int opt); | |
938 | 939 | extern void blk_queue_io_opt(struct request_queue *q, unsigned int opt); |
939 | 940 | extern void blk_set_default_limits(struct queue_limits *lim); |
940 | 941 | extern int blk_stack_limits(struct queue_limits *t, struct queue_limits *b, |