]> git.karo-electronics.de Git - linux-beck.git/commitdiff
blk-wbt: allow reset of default latency through sysfs
authorJens Axboe <axboe@fb.com>
Mon, 28 Nov 2016 16:22:47 +0000 (09:22 -0700)
committerJens Axboe <axboe@fb.com>
Mon, 28 Nov 2016 17:27:03 +0000 (10:27 -0700)
Allow a write of '-1' to reset the default latency target for
a given device. This removes knowledge of the different default
settings for rotational vs non-rotational from user space.

Signed-off-by: Jens Axboe <axboe@fb.com>
Documentation/block/queue-sysfs.txt
block/blk-sysfs.c
block/blk-wbt.c
block/blk-wbt.h

index 14235e72a70274bc7fffeb15316cedcb0247431e..51642159aedbbc405d1bb90fa89402c2143f8310 100644 (file)
@@ -188,7 +188,9 @@ wb_lat_usec (RW)
 If the device is registered for writeback throttling, then this file shows
 the target minimum read latency. If this latency is exceeded in a given
 window of time (see wb_window_usec), then the writeback throttling will start
-scaling back writes.
+scaling back writes. Writing a value of '0' to this file disables the
+feature. Writing a value of '-1' to this file resets the value to the
+default setting.
 
 
 Jens Axboe <jens.axboe@oracle.com>, February 2009
index 1855c6770045c0bf89ad0e29ef26acdc10070e4d..f0ca569e276b958518cbf6765547b9c99b861786 100644 (file)
@@ -42,12 +42,12 @@ queue_var_store(unsigned long *var, const char *page, size_t count)
        return count;
 }
 
-static ssize_t queue_var_store64(u64 *var, const char *page)
+static ssize_t queue_var_store64(s64 *var, const char *page)
 {
        int err;
-       u64 v;
+       s64 v;
 
-       err = kstrtou64(page, 10, &v);
+       err = kstrtos64(page, 10, &v);
        if (err < 0)
                return err;
 
@@ -421,18 +421,26 @@ static ssize_t queue_wb_lat_show(struct request_queue *q, char *page)
 static ssize_t queue_wb_lat_store(struct request_queue *q, const char *page,
                                  size_t count)
 {
+       struct rq_wb *rwb;
        ssize_t ret;
-       u64 val;
+       s64 val;
 
-       if (!q->rq_wb)
+       rwb = q->rq_wb;
+       if (!rwb)
                return -EINVAL;
 
        ret = queue_var_store64(&val, page);
        if (ret < 0)
                return ret;
 
-       q->rq_wb->min_lat_nsec = val * 1000ULL;
-       wbt_update_limits(q->rq_wb);
+       if (val == -1)
+               rwb->min_lat_nsec = wbt_default_latency_nsec(q);
+       else if (val >= 0)
+               rwb->min_lat_nsec = val * 1000ULL;
+       else
+               return -EINVAL;
+
+       wbt_update_limits(rwb);
        return count;
 }
 
index 9f97594e68ce738528bd23be5e366fd92d3603c7..92df2f7c5af1a047a13b5a009370fde23e519a25 100644 (file)
@@ -675,6 +675,18 @@ void wbt_disable(struct rq_wb *rwb)
 }
 EXPORT_SYMBOL_GPL(wbt_disable);
 
+u64 wbt_default_latency_nsec(struct request_queue *q)
+{
+       /*
+        * We default to 2msec for non-rotational storage, and 75msec
+        * for rotational storage.
+        */
+       if (blk_queue_nonrot(q))
+               return 2000000ULL;
+       else
+               return 75000000ULL;
+}
+
 int wbt_init(struct request_queue *q)
 {
        struct rq_wb *rwb;
@@ -711,10 +723,7 @@ int wbt_init(struct request_queue *q)
        q->rq_wb = rwb;
        blk_stat_enable(q);
 
-       if (blk_queue_nonrot(q))
-               rwb->min_lat_nsec = 2000000ULL;
-       else
-               rwb->min_lat_nsec = 75000000ULL;
+       rwb->min_lat_nsec = wbt_default_latency_nsec(q);
 
        wbt_set_queue_depth(rwb, blk_queue_depth(q));
        wbt_set_write_cache(rwb, test_bit(QUEUE_FLAG_WC, &q->queue_flags));
index 44dc2173dc1f38393ca3f67cb7f26f63d42451d4..9dfc88ad7f305dc299f303a858454123885467f3 100644 (file)
@@ -110,6 +110,8 @@ void wbt_disable(struct rq_wb *);
 void wbt_set_queue_depth(struct rq_wb *, unsigned int);
 void wbt_set_write_cache(struct rq_wb *, bool);
 
+u64 wbt_default_latency_nsec(struct request_queue *);
+
 #else
 
 static inline void __wbt_done(struct rq_wb *rwb, enum wbt_flags flags)
@@ -148,6 +150,10 @@ static inline void wbt_set_queue_depth(struct rq_wb *rwb, unsigned int depth)
 static inline void wbt_set_write_cache(struct rq_wb *rwb, bool wc)
 {
 }
+static inline u64 wbt_default_latency_nsec(struct request_queue *q)
+{
+       return 0;
+}
 
 #endif /* CONFIG_BLK_WBT */