Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

blk-wbt: factor out a helper wbt_set_lat()

To move implementation details inside blk-wbt.c, prepare to fix possible
deadlock to call wbt_init() while queue is frozen in the next patch.

Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
Signed-off-by: Yu Kuai <yukuai@fnnas.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Yu Kuai and committed by
Jens Axboe
2751b900 06564bae

+51 -45
+2 -37
block/blk-sysfs.c
··· 636 636 static ssize_t queue_wb_lat_store(struct gendisk *disk, const char *page, 637 637 size_t count) 638 638 { 639 - struct request_queue *q = disk->queue; 640 - struct rq_qos *rqos; 641 639 ssize_t ret; 642 640 s64 val; 643 - unsigned int memflags; 644 641 645 642 ret = queue_var_store64(&val, page); 646 643 if (ret < 0) ··· 645 648 if (val < -1) 646 649 return -EINVAL; 647 650 648 - /* 649 - * Ensure that the queue is idled, in case the latency update 650 - * ends up either enabling or disabling wbt completely. We can't 651 - * have IO inflight if that happens. 652 - */ 653 - memflags = blk_mq_freeze_queue(q); 654 - 655 - rqos = wbt_rq_qos(q); 656 - if (!rqos) { 657 - ret = wbt_init(disk); 658 - if (ret) 659 - goto out; 660 - } 661 - 662 - ret = count; 663 - if (val == -1) 664 - val = wbt_default_latency_nsec(q); 665 - else if (val >= 0) 666 - val *= 1000ULL; 667 - 668 - if (wbt_get_min_lat(q) == val) 669 - goto out; 670 - 671 - blk_mq_quiesce_queue(q); 672 - 673 - mutex_lock(&disk->rqos_state_mutex); 674 - wbt_set_min_lat(q, val); 675 - mutex_unlock(&disk->rqos_state_mutex); 676 - 677 - blk_mq_unquiesce_queue(q); 678 - out: 679 - blk_mq_unfreeze_queue(q, memflags); 680 - 681 - return ret; 651 + ret = wbt_set_lat(disk, val); 652 + return ret ? ret : count; 682 653 } 683 654 684 655 QUEUE_RW_ENTRY(queue_wb_lat, "wbt_lat_usec");
+47 -3
block/blk-wbt.c
··· 93 93 struct rq_depth rq_depth; 94 94 }; 95 95 96 + static int wbt_init(struct gendisk *disk); 97 + 96 98 static inline struct rq_wb *RQWB(struct rq_qos *rqos) 97 99 { 98 100 return container_of(rqos, struct rq_wb, rqos); ··· 508 506 return RQWB(rqos)->min_lat_nsec; 509 507 } 510 508 511 - void wbt_set_min_lat(struct request_queue *q, u64 val) 509 + static void wbt_set_min_lat(struct request_queue *q, u64 val) 512 510 { 513 511 struct rq_qos *rqos = wbt_rq_qos(q); 514 512 if (!rqos) ··· 743 741 WARN_ON_ONCE(wbt_init(disk)); 744 742 } 745 743 746 - u64 wbt_default_latency_nsec(struct request_queue *q) 744 + static u64 wbt_default_latency_nsec(struct request_queue *q) 747 745 { 748 746 /* 749 747 * We default to 2msec for non-rotational storage, and 75msec ··· 903 901 #endif 904 902 }; 905 903 906 - int wbt_init(struct gendisk *disk) 904 + static int wbt_init(struct gendisk *disk) 907 905 { 908 906 struct request_queue *q = disk->queue; 909 907 struct rq_wb *rwb; ··· 949 947 kfree(rwb); 950 948 return ret; 951 949 950 + } 951 + 952 + int wbt_set_lat(struct gendisk *disk, s64 val) 953 + { 954 + struct request_queue *q = disk->queue; 955 + unsigned int memflags; 956 + struct rq_qos *rqos; 957 + int ret = 0; 958 + 959 + /* 960 + * Ensure that the queue is idled, in case the latency update 961 + * ends up either enabling or disabling wbt completely. We can't 962 + * have IO inflight if that happens. 963 + */ 964 + memflags = blk_mq_freeze_queue(q); 965 + 966 + rqos = wbt_rq_qos(q); 967 + if (!rqos) { 968 + ret = wbt_init(disk); 969 + if (ret) 970 + goto out; 971 + } 972 + 973 + if (val == -1) 974 + val = wbt_default_latency_nsec(q); 975 + else if (val >= 0) 976 + val *= 1000ULL; 977 + 978 + if (wbt_get_min_lat(q) == val) 979 + goto out; 980 + 981 + blk_mq_quiesce_queue(q); 982 + 983 + mutex_lock(&disk->rqos_state_mutex); 984 + wbt_set_min_lat(q, val); 985 + mutex_unlock(&disk->rqos_state_mutex); 986 + 987 + blk_mq_unquiesce_queue(q); 988 + out: 989 + blk_mq_unfreeze_queue(q, memflags); 990 + 991 + return ret; 952 992 }
+2 -5
block/blk-wbt.h
··· 4 4 5 5 #ifdef CONFIG_BLK_WBT 6 6 7 - int wbt_init(struct gendisk *disk); 8 7 void wbt_init_enable_default(struct gendisk *disk); 9 8 void wbt_disable_default(struct gendisk *disk); 10 9 void wbt_enable_default(struct gendisk *disk); 11 10 12 11 u64 wbt_get_min_lat(struct request_queue *q); 13 - void wbt_set_min_lat(struct request_queue *q, u64 val); 14 - bool wbt_disabled(struct request_queue *); 15 - 16 - u64 wbt_default_latency_nsec(struct request_queue *); 12 + bool wbt_disabled(struct request_queue *q); 13 + int wbt_set_lat(struct gendisk *disk, s64 val); 17 14 18 15 #else 19 16