提交 2ef177be 编写于 作者: T Tejun Heo 提交者: Yang Yingliang

block/rq_qos: implement rq_qos_ops->queue_depth_changed()

mainline inclusion
from mainline-5.4-rc1
commit 9677a3e01f838622d2efc9a3ccb97090a2c3156a
category: feature
bugzilla: 38688
CVE: NA

---------------------------

wbt already gets queue depth changed notification through
wbt_set_queue_depth().  Generalize it into
rq_qos_ops->queue_depth_changed() so that other rq_qos policies can
easily hook into the events too.
Signed-off-by: NTejun Heo <tj@kernel.org>
Signed-off-by: NJens Axboe <axboe@kernel.dk>

Conflict:
  block/blk-rq-qos.c
  block/blk-rq-qos.h
  block/blk-wbt.c
Signed-off-by: NYu Kuai <yukuai3@huawei.com>
Reviewed-by: NHou Tao <houtao1@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 8843e68d
...@@ -109,6 +109,16 @@ void rq_qos_done_bio(struct request_queue *q, struct bio *bio) ...@@ -109,6 +109,16 @@ void rq_qos_done_bio(struct request_queue *q, struct bio *bio)
} }
} }
void rq_qos_queue_depth_changed(struct request_queue *q)
{
struct rq_qos *rqos;
for (rqos = q->rq_qos; rqos; rqos = rqos->next) {
if (rqos->ops->queue_depth_changed)
rqos->ops->queue_depth_changed(rqos);
}
}
/* /*
* Return true, if we can't increase the depth further by scaling * Return true, if we can't increase the depth further by scaling
*/ */
......
...@@ -33,6 +33,7 @@ struct rq_qos_ops { ...@@ -33,6 +33,7 @@ struct rq_qos_ops {
void (*done)(struct rq_qos *, struct request *); void (*done)(struct rq_qos *, struct request *);
void (*done_bio)(struct rq_qos *, struct bio *); void (*done_bio)(struct rq_qos *, struct bio *);
void (*cleanup)(struct rq_qos *, struct bio *); void (*cleanup)(struct rq_qos *, struct bio *);
void (*queue_depth_changed)(struct rq_qos *);
void (*exit)(struct rq_qos *); void (*exit)(struct rq_qos *);
}; };
...@@ -104,5 +105,6 @@ void rq_qos_done_bio(struct request_queue *q, struct bio *bio); ...@@ -104,5 +105,6 @@ void rq_qos_done_bio(struct request_queue *q, struct bio *bio);
void rq_qos_throttle(struct request_queue *, struct bio *, spinlock_t *); void rq_qos_throttle(struct request_queue *, struct bio *, spinlock_t *);
void rq_qos_track(struct request_queue *q, struct request *, struct bio *); void rq_qos_track(struct request_queue *q, struct request *, struct bio *);
void rq_qos_merge(struct request_queue *q, struct request *rq, struct bio *bio); void rq_qos_merge(struct request_queue *q, struct request *rq, struct bio *bio);
void rq_qos_queue_depth_changed(struct request_queue *q);
void rq_qos_exit(struct request_queue *); void rq_qos_exit(struct request_queue *);
#endif #endif
...@@ -884,7 +884,7 @@ EXPORT_SYMBOL_GPL(blk_queue_flush_queueable); ...@@ -884,7 +884,7 @@ EXPORT_SYMBOL_GPL(blk_queue_flush_queueable);
void blk_set_queue_depth(struct request_queue *q, unsigned int depth) void blk_set_queue_depth(struct request_queue *q, unsigned int depth)
{ {
q->queue_depth = depth; q->queue_depth = depth;
wbt_set_queue_depth(q, depth); rq_qos_queue_depth_changed(q);
} }
EXPORT_SYMBOL(blk_set_queue_depth); EXPORT_SYMBOL(blk_set_queue_depth);
......
...@@ -686,15 +686,6 @@ void wbt_requeue(struct rq_qos *rqos, struct request *rq) ...@@ -686,15 +686,6 @@ void wbt_requeue(struct rq_qos *rqos, struct request *rq)
} }
} }
void wbt_set_queue_depth(struct request_queue *q, unsigned int depth)
{
struct rq_qos *rqos = wbt_rq_qos(q);
if (rqos) {
RQWB(rqos)->rq_depth.queue_depth = depth;
__wbt_update_limits(RQWB(rqos));
}
}
void wbt_set_write_cache(struct request_queue *q, bool write_cache_on) void wbt_set_write_cache(struct request_queue *q, bool write_cache_on)
{ {
struct rq_qos *rqos = wbt_rq_qos(q); struct rq_qos *rqos = wbt_rq_qos(q);
...@@ -747,6 +738,12 @@ static int wbt_data_dir(const struct request *rq) ...@@ -747,6 +738,12 @@ static int wbt_data_dir(const struct request *rq)
return -1; return -1;
} }
static void wbt_queue_depth_changed(struct rq_qos *rqos)
{
RQWB(rqos)->rq_depth.queue_depth = blk_queue_depth(rqos->q);
__wbt_update_limits(RQWB(rqos));
}
static void wbt_exit(struct rq_qos *rqos) static void wbt_exit(struct rq_qos *rqos)
{ {
struct rq_wb *rwb = RQWB(rqos); struct rq_wb *rwb = RQWB(rqos);
...@@ -782,6 +779,7 @@ static struct rq_qos_ops wbt_rqos_ops = { ...@@ -782,6 +779,7 @@ static struct rq_qos_ops wbt_rqos_ops = {
.requeue = wbt_requeue, .requeue = wbt_requeue,
.done = wbt_done, .done = wbt_done,
.cleanup = wbt_cleanup, .cleanup = wbt_cleanup,
.queue_depth_changed = wbt_queue_depth_changed,
.exit = wbt_exit, .exit = wbt_exit,
}; };
...@@ -821,7 +819,7 @@ int wbt_init(struct request_queue *q) ...@@ -821,7 +819,7 @@ int wbt_init(struct request_queue *q)
rwb->min_lat_nsec = wbt_default_latency_nsec(q); rwb->min_lat_nsec = wbt_default_latency_nsec(q);
wbt_set_queue_depth(q, blk_queue_depth(q)); wbt_queue_depth_changed(&rwb->rqos);
wbt_set_write_cache(q, test_bit(QUEUE_FLAG_WC, &q->queue_flags)); wbt_set_write_cache(q, test_bit(QUEUE_FLAG_WC, &q->queue_flags));
return 0; return 0;
......
...@@ -95,7 +95,6 @@ void wbt_enable_default(struct request_queue *); ...@@ -95,7 +95,6 @@ void wbt_enable_default(struct request_queue *);
u64 wbt_get_min_lat(struct request_queue *q); u64 wbt_get_min_lat(struct request_queue *q);
void wbt_set_min_lat(struct request_queue *q, u64 val); void wbt_set_min_lat(struct request_queue *q, u64 val);
void wbt_set_queue_depth(struct request_queue *, unsigned int);
void wbt_set_write_cache(struct request_queue *, bool); void wbt_set_write_cache(struct request_queue *, bool);
u64 wbt_default_latency_nsec(struct request_queue *); u64 wbt_default_latency_nsec(struct request_queue *);
...@@ -118,9 +117,6 @@ static inline void wbt_disable_default(struct request_queue *q) ...@@ -118,9 +117,6 @@ static inline void wbt_disable_default(struct request_queue *q)
static inline void wbt_enable_default(struct request_queue *q) static inline void wbt_enable_default(struct request_queue *q)
{ {
} }
static inline void wbt_set_queue_depth(struct request_queue *q, unsigned int depth)
{
}
static inline void wbt_set_write_cache(struct request_queue *q, bool wc) static inline void wbt_set_write_cache(struct request_queue *q, bool wc)
{ {
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册