|
@@ -453,9 +453,26 @@ static ssize_t queue_wb_lat_store(struct request_queue *q, const char *page,
|
|
|
else if (val >= 0)
|
|
|
val *= 1000ULL;
|
|
|
|
|
|
- wbt_set_min_lat(q, val);
|
|
|
+ /*
|
|
|
+ * Ensure that the queue is idled, in case the latency update
|
|
|
+ * ends up either enabling or disabling wbt completely. We can't
|
|
|
+ * have IO inflight if that happens.
|
|
|
+ */
|
|
|
+ if (q->mq_ops) {
|
|
|
+ blk_mq_freeze_queue(q);
|
|
|
+ blk_mq_quiesce_queue(q);
|
|
|
+ } else
|
|
|
+ blk_queue_bypass_start(q);
|
|
|
|
|
|
+ wbt_set_min_lat(q, val);
|
|
|
wbt_update_limits(q);
|
|
|
+
|
|
|
+ if (q->mq_ops) {
|
|
|
+ blk_mq_unquiesce_queue(q);
|
|
|
+ blk_mq_unfreeze_queue(q);
|
|
|
+ } else
|
|
|
+ blk_queue_bypass_end(q);
|
|
|
+
|
|
|
return count;
|
|
|
}
|
|
|
|