blk-wbt: don't create wbt sysfs entry if CONFIG_BLK_WBT is disabled
authorYu Kuai <yukuai3@huawei.com>
Sat, 27 May 2023 01:06:40 +0000 (09:06 +0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 26 Jun 2023 15:53:36 +0000 (09:53 -0600)
sysfs entry /sys/block/[device]/queue/wbt_lat_usec will be created even
if CONFIG_BLK_WBT is disabled, while read and write will always fail.
It doesn't make sense to create a sysfs entry that can't be accessed,
so don't create such entry.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20230527010644.647900-2-yukuai1@huaweicloud.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-sysfs.c
block/blk-wbt.h

index a642085..6c1c4ba 100644 (file)
@@ -47,19 +47,6 @@ queue_var_store(unsigned long *var, const char *page, size_t count)
        return count;
 }
 
-static ssize_t queue_var_store64(s64 *var, const char *page)
-{
-       int err;
-       s64 v;
-
-       err = kstrtos64(page, 10, &v);
-       if (err < 0)
-               return err;
-
-       *var = v;
-       return 0;
-}
-
 static ssize_t queue_requests_show(struct request_queue *q, char *page)
 {
        return queue_var_show(q->nr_requests, page);
@@ -451,61 +438,6 @@ static ssize_t queue_io_timeout_store(struct request_queue *q, const char *page,
        return count;
 }
 
-static ssize_t queue_wb_lat_show(struct request_queue *q, char *page)
-{
-       if (!wbt_rq_qos(q))
-               return -EINVAL;
-
-       if (wbt_disabled(q))
-               return sprintf(page, "0\n");
-
-       return sprintf(page, "%llu\n", div_u64(wbt_get_min_lat(q), 1000));
-}
-
-static ssize_t queue_wb_lat_store(struct request_queue *q, const char *page,
-                                 size_t count)
-{
-       struct rq_qos *rqos;
-       ssize_t ret;
-       s64 val;
-
-       ret = queue_var_store64(&val, page);
-       if (ret < 0)
-               return ret;
-       if (val < -1)
-               return -EINVAL;
-
-       rqos = wbt_rq_qos(q);
-       if (!rqos) {
-               ret = wbt_init(q->disk);
-               if (ret)
-                       return ret;
-       }
-
-       if (val == -1)
-               val = wbt_default_latency_nsec(q);
-       else if (val >= 0)
-               val *= 1000ULL;
-
-       if (wbt_get_min_lat(q) == val)
-               return count;
-
-       /*
-        * 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.
-        */
-       blk_mq_freeze_queue(q);
-       blk_mq_quiesce_queue(q);
-
-       wbt_set_min_lat(q, val);
-
-       blk_mq_unquiesce_queue(q);
-       blk_mq_unfreeze_queue(q);
-
-       return count;
-}
-
 static ssize_t queue_wc_show(struct request_queue *q, char *page)
 {
        if (test_bit(QUEUE_FLAG_WC, &q->queue_flags))
@@ -598,7 +530,6 @@ QUEUE_RW_ENTRY(queue_wc, "write_cache");
 QUEUE_RO_ENTRY(queue_fua, "fua");
 QUEUE_RO_ENTRY(queue_dax, "dax");
 QUEUE_RW_ENTRY(queue_io_timeout, "io_timeout");
-QUEUE_RW_ENTRY(queue_wb_lat, "wbt_lat_usec");
 QUEUE_RO_ENTRY(queue_virt_boundary_mask, "virt_boundary_mask");
 QUEUE_RO_ENTRY(queue_dma_alignment, "dma_alignment");
 
@@ -617,6 +548,78 @@ QUEUE_RW_ENTRY(queue_iostats, "iostats");
 QUEUE_RW_ENTRY(queue_random, "add_random");
 QUEUE_RW_ENTRY(queue_stable_writes, "stable_writes");
 
+#ifdef CONFIG_BLK_WBT
+static ssize_t queue_var_store64(s64 *var, const char *page)
+{
+       int err;
+       s64 v;
+
+       err = kstrtos64(page, 10, &v);
+       if (err < 0)
+               return err;
+
+       *var = v;
+       return 0;
+}
+
+static ssize_t queue_wb_lat_show(struct request_queue *q, char *page)
+{
+       if (!wbt_rq_qos(q))
+               return -EINVAL;
+
+       if (wbt_disabled(q))
+               return sprintf(page, "0\n");
+
+       return sprintf(page, "%llu\n", div_u64(wbt_get_min_lat(q), 1000));
+}
+
+static ssize_t queue_wb_lat_store(struct request_queue *q, const char *page,
+                                 size_t count)
+{
+       struct rq_qos *rqos;
+       ssize_t ret;
+       s64 val;
+
+       ret = queue_var_store64(&val, page);
+       if (ret < 0)
+               return ret;
+       if (val < -1)
+               return -EINVAL;
+
+       rqos = wbt_rq_qos(q);
+       if (!rqos) {
+               ret = wbt_init(q->disk);
+               if (ret)
+                       return ret;
+       }
+
+       if (val == -1)
+               val = wbt_default_latency_nsec(q);
+       else if (val >= 0)
+               val *= 1000ULL;
+
+       if (wbt_get_min_lat(q) == val)
+               return count;
+
+       /*
+        * 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.
+        */
+       blk_mq_freeze_queue(q);
+       blk_mq_quiesce_queue(q);
+
+       wbt_set_min_lat(q, val);
+
+       blk_mq_unquiesce_queue(q);
+       blk_mq_unfreeze_queue(q);
+
+       return count;
+}
+
+QUEUE_RW_ENTRY(queue_wb_lat, "wbt_lat_usec");
+#endif
+
 static struct attribute *queue_attrs[] = {
        &queue_requests_entry.attr,
        &queue_ra_entry.attr,
@@ -655,7 +658,9 @@ static struct attribute *queue_attrs[] = {
        &queue_wc_entry.attr,
        &queue_fua_entry.attr,
        &queue_dax_entry.attr,
+#ifdef CONFIG_BLK_WBT
        &queue_wb_lat_entry.attr,
+#endif
        &queue_poll_delay_entry.attr,
        &queue_io_timeout_entry.attr,
 #ifdef CONFIG_BLK_DEV_THROTTLING_LOW
index ba6cca5..8a029e1 100644 (file)
@@ -18,10 +18,6 @@ u64 wbt_default_latency_nsec(struct request_queue *);
 
 #else
 
-static inline int wbt_init(struct gendisk *disk)
-{
-       return -EINVAL;
-}
 static inline void wbt_disable_default(struct gendisk *disk)
 {
 }
@@ -31,21 +27,6 @@ static inline void wbt_enable_default(struct gendisk *disk)
 static inline void wbt_set_write_cache(struct request_queue *q, bool wc)
 {
 }
-static inline u64 wbt_get_min_lat(struct request_queue *q)
-{
-       return 0;
-}
-static inline void wbt_set_min_lat(struct request_queue *q, u64 val)
-{
-}
-static inline u64 wbt_default_latency_nsec(struct request_queue *q)
-{
-       return 0;
-}
-static inline bool wbt_disabled(struct request_queue *q)
-{
-       return true;
-}
 
 #endif /* CONFIG_BLK_WBT */