Skip to content

Commit

Permalink
blk-wbt: allow wbt to be enabled always through sysfs
Browse files Browse the repository at this point in the history
Currently there's no way to enable wbt if it's not enabled in the
kernel config by default for a device. Allow a write to the
'wbt_lat_usec' queue sysfs file to enable wbt.

This is useful for both the kernel config case, but also if the
device is CFQ managed and it was turned off by default.

Signed-off-by: Jens Axboe <axboe@fb.com>
  • Loading branch information
axboe committed Nov 28, 2016
1 parent fa224ee commit d62118b
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 7 deletions.
22 changes: 16 additions & 6 deletions block/blk-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -425,20 +425,30 @@ static ssize_t queue_wb_lat_store(struct request_queue *q, const char *page,
ssize_t ret;
s64 val;

rwb = q->rq_wb;
if (!rwb)
return -EINVAL;

ret = queue_var_store64(&val, page);
if (ret < 0)
return ret;
if (val < -1)
return -EINVAL;

rwb = q->rq_wb;
if (!rwb) {
ret = wbt_init(q);
if (ret)
return ret;

rwb = q->rq_wb;
if (!rwb)
return -EINVAL;
}

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;

if (rwb->enable_state == WBT_STATE_ON_DEFAULT)
rwb->enable_state = WBT_STATE_ON_MANUAL;

wbt_update_limits(rwb);
return count;
Expand Down
3 changes: 2 additions & 1 deletion block/blk-wbt.c
Original file line number Diff line number Diff line change
Expand Up @@ -673,7 +673,7 @@ void wbt_disable_default(struct request_queue *q)
{
struct rq_wb *rwb = q->rq_wb;

if (rwb) {
if (rwb && rwb->enable_state == WBT_STATE_ON_DEFAULT) {
del_timer_sync(&rwb->window_timer);
rwb->win_nsec = rwb->min_lat_nsec = 0;
wbt_update_limits(rwb);
Expand Down Expand Up @@ -721,6 +721,7 @@ int wbt_init(struct request_queue *q)
rwb->last_comp = rwb->last_issue = jiffies;
rwb->queue = q;
rwb->win_nsec = RWB_WINDOW_NSEC;
rwb->enable_state = WBT_STATE_ON_DEFAULT;
wbt_update_limits(rwb);

/*
Expand Down
11 changes: 11 additions & 0 deletions block/blk-wbt.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,15 @@ enum {
WBT_NUM_RWQ = 2,
};

/*
* Enable states. Either off, or on by default (done at init time),
* or on through manual setup in sysfs.
*/
enum {
WBT_STATE_ON_DEFAULT = 1,
WBT_STATE_ON_MANUAL = 2,
};

static inline void wbt_clear_state(struct blk_issue_stat *stat)
{
stat->time &= BLK_STAT_TIME_MASK;
Expand Down Expand Up @@ -61,6 +70,8 @@ struct rq_wb {
int scale_step;
bool scaled_max;

short enable_state; /* WBT_STATE_* */

/*
* Number of consecutive periods where we don't have enough
* information to make a firm scale up/down decision.
Expand Down

0 comments on commit d62118b

Please sign in to comment.