blk-wbt: allow reset of default latency through sysfs

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>
This commit is contained in:
Jens Axboe 2016-11-28 09:22:47 -07:00
Родитель feffa5cc7b
Коммит 80e091d10e
4 изменённых файлов: 37 добавлений и 12 удалений

Просмотреть файл

@ -188,7 +188,9 @@ wb_lat_usec (RW)
If the device is registered for writeback throttling, then this file shows 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 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 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 Jens Axboe <jens.axboe@oracle.com>, February 2009

Просмотреть файл

@ -42,12 +42,12 @@ queue_var_store(unsigned long *var, const char *page, size_t count)
return 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; int err;
u64 v; s64 v;
err = kstrtou64(page, 10, &v); err = kstrtos64(page, 10, &v);
if (err < 0) if (err < 0)
return err; 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, static ssize_t queue_wb_lat_store(struct request_queue *q, const char *page,
size_t count) size_t count)
{ {
struct rq_wb *rwb;
ssize_t ret; ssize_t ret;
u64 val; s64 val;
if (!q->rq_wb) rwb = q->rq_wb;
if (!rwb)
return -EINVAL; return -EINVAL;
ret = queue_var_store64(&val, page); ret = queue_var_store64(&val, page);
if (ret < 0) if (ret < 0)
return ret; return ret;
q->rq_wb->min_lat_nsec = val * 1000ULL; if (val == -1)
wbt_update_limits(q->rq_wb); 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; return count;
} }

Просмотреть файл

@ -675,6 +675,18 @@ void wbt_disable(struct rq_wb *rwb)
} }
EXPORT_SYMBOL_GPL(wbt_disable); 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) int wbt_init(struct request_queue *q)
{ {
struct rq_wb *rwb; struct rq_wb *rwb;
@ -711,10 +723,7 @@ int wbt_init(struct request_queue *q)
q->rq_wb = rwb; q->rq_wb = rwb;
blk_stat_enable(q); blk_stat_enable(q);
if (blk_queue_nonrot(q)) rwb->min_lat_nsec = wbt_default_latency_nsec(q);
rwb->min_lat_nsec = 2000000ULL;
else
rwb->min_lat_nsec = 75000000ULL;
wbt_set_queue_depth(rwb, blk_queue_depth(q)); wbt_set_queue_depth(rwb, blk_queue_depth(q));
wbt_set_write_cache(rwb, test_bit(QUEUE_FLAG_WC, &q->queue_flags)); wbt_set_write_cache(rwb, test_bit(QUEUE_FLAG_WC, &q->queue_flags));

Просмотреть файл

@ -110,6 +110,8 @@ void wbt_disable(struct rq_wb *);
void wbt_set_queue_depth(struct rq_wb *, unsigned int); void wbt_set_queue_depth(struct rq_wb *, unsigned int);
void wbt_set_write_cache(struct rq_wb *, bool); void wbt_set_write_cache(struct rq_wb *, bool);
u64 wbt_default_latency_nsec(struct request_queue *);
#else #else
static inline void __wbt_done(struct rq_wb *rwb, enum wbt_flags flags) 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 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 */ #endif /* CONFIG_BLK_WBT */