Skip to content

Commit

Permalink
block: Make writeback throttling defaults consistent for SQ devices
Browse files Browse the repository at this point in the history
When CFQ is used as an elevator, it disables writeback throttling
because they don't play well together. Later when a different elevator
is chosen for the device, writeback throttling doesn't get enabled
again as it should. Make sure CFQ enables writeback throttling (if it
should be enabled by default) when we switch from it to another IO
scheduler.

Signed-off-by: Jan Kara <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
jankara authored and axboe committed Apr 19, 2017
1 parent ea25da4 commit 8330cdb
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 18 deletions.
19 changes: 1 addition & 18 deletions block/blk-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -844,23 +844,6 @@ struct kobj_type blk_queue_ktype = {
.release = blk_release_queue,
};

static void blk_wb_init(struct request_queue *q)
{
#ifndef CONFIG_BLK_WBT_MQ
if (q->mq_ops)
return;
#endif
#ifndef CONFIG_BLK_WBT_SQ
if (q->request_fn)
return;
#endif

/*
* If this fails, we don't get throttling
*/
wbt_init(q);
}

int blk_register_queue(struct gendisk *disk)
{
int ret;
Expand Down Expand Up @@ -908,7 +891,7 @@ int blk_register_queue(struct gendisk *disk)

kobject_uevent(&q->kobj, KOBJ_ADD);

blk_wb_init(q);
wbt_enable_default(q);

blk_throtl_register_queue(q);

Expand Down
19 changes: 19 additions & 0 deletions block/blk-wbt.c
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,25 @@ void wbt_disable_default(struct request_queue *q)
}
EXPORT_SYMBOL_GPL(wbt_disable_default);

/*
* Enable wbt if defaults are configured that way
*/
void wbt_enable_default(struct request_queue *q)
{
/* Throttling already enabled? */
if (q->rq_wb)
return;

/* Queue not registered? Maybe shutting down... */
if (!test_bit(QUEUE_FLAG_REGISTERED, &q->queue_flags))
return;

if ((q->mq_ops && IS_ENABLED(CONFIG_BLK_WBT_MQ)) ||
(q->request_fn && IS_ENABLED(CONFIG_BLK_WBT_SQ)))
wbt_init(q);
}
EXPORT_SYMBOL_GPL(wbt_enable_default);

u64 wbt_default_latency_nsec(struct request_queue *q)
{
/*
Expand Down
4 changes: 4 additions & 0 deletions block/blk-wbt.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ void wbt_update_limits(struct rq_wb *);
void wbt_requeue(struct rq_wb *, struct blk_issue_stat *);
void wbt_issue(struct rq_wb *, struct blk_issue_stat *);
void wbt_disable_default(struct request_queue *);
void wbt_enable_default(struct request_queue *);

void wbt_set_queue_depth(struct rq_wb *, unsigned int);
void wbt_set_write_cache(struct rq_wb *, bool);
Expand Down Expand Up @@ -155,6 +156,9 @@ static inline void wbt_issue(struct rq_wb *rwb, struct blk_issue_stat *stat)
static inline void wbt_disable_default(struct request_queue *q)
{
}
static inline void wbt_enable_default(struct request_queue *q)
{
}
static inline void wbt_set_queue_depth(struct rq_wb *rwb, unsigned int depth)
{
}
Expand Down
3 changes: 3 additions & 0 deletions block/elevator.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@

#include "blk.h"
#include "blk-mq-sched.h"
#include "blk-wbt.h"

static DEFINE_SPINLOCK(elv_list_lock);
static LIST_HEAD(elv_list);
Expand Down Expand Up @@ -877,6 +878,8 @@ void elv_unregister_queue(struct request_queue *q)
kobject_uevent(&e->kobj, KOBJ_REMOVE);
kobject_del(&e->kobj);
e->registered = 0;
/* Re-enable throttling in case elevator disabled it */
wbt_enable_default(q);
}
}
EXPORT_SYMBOL(elv_unregister_queue);
Expand Down

0 comments on commit 8330cdb

Please sign in to comment.