]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
block/rq_qos: implement rq_qos_ops->queue_depth_changed()
authorTejun Heo <tj@kernel.org>
Wed, 28 Aug 2019 22:05:55 +0000 (15:05 -0700)
committerJens Axboe <axboe@kernel.dk>
Thu, 29 Aug 2019 03:17:07 +0000 (21:17 -0600)
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: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-rq-qos.c
block/blk-rq-qos.h
block/blk-settings.c
block/blk-wbt.c
block/blk-wbt.h

index f4eea78f5cc1666f09edd8d30a0408347785dcf9..61b635bc2a3181be4432513d2c4a6a177d36e3ca 100644 (file)
@@ -101,6 +101,15 @@ void __rq_qos_done_bio(struct rq_qos *rqos, struct bio *bio)
        } while (rqos);
 }
 
+void __rq_qos_queue_depth_changed(struct rq_qos *rqos)
+{
+       do {
+               if (rqos->ops->queue_depth_changed)
+                       rqos->ops->queue_depth_changed(rqos);
+               rqos = rqos->next;
+       } while (rqos);
+}
+
 /*
  * Return true, if we can't increase the depth further by scaling
  */
index 8e426a8505b6366fd45351967164fc64616e94b2..e15b6907b76dc6f51795c67c8bd475231f95d1df 100644 (file)
@@ -41,6 +41,7 @@ struct rq_qos_ops {
        void (*done)(struct rq_qos *, struct request *);
        void (*done_bio)(struct rq_qos *, struct bio *);
        void (*cleanup)(struct rq_qos *, struct bio *);
+       void (*queue_depth_changed)(struct rq_qos *);
        void (*exit)(struct rq_qos *);
        const struct blk_mq_debugfs_attr *debugfs_attrs;
 };
@@ -138,6 +139,7 @@ void __rq_qos_throttle(struct rq_qos *rqos, struct bio *bio);
 void __rq_qos_track(struct rq_qos *rqos, struct request *rq, struct bio *bio);
 void __rq_qos_merge(struct rq_qos *rqos, struct request *rq, struct bio *bio);
 void __rq_qos_done_bio(struct rq_qos *rqos, struct bio *bio);
+void __rq_qos_queue_depth_changed(struct rq_qos *rqos);
 
 static inline void rq_qos_cleanup(struct request_queue *q, struct bio *bio)
 {
@@ -194,6 +196,12 @@ static inline void rq_qos_merge(struct request_queue *q, struct request *rq,
                __rq_qos_merge(q->rq_qos, rq, bio);
 }
 
+static inline void rq_qos_queue_depth_changed(struct request_queue *q)
+{
+       if (q->rq_qos)
+               __rq_qos_queue_depth_changed(q->rq_qos);
+}
+
 void rq_qos_exit(struct request_queue *);
 
 #endif
index 2c1831207a8f74de455679551f79d8862450eed0..a058997b9cce3ffc6de614370a57d0ab60f110a8 100644 (file)
@@ -805,7 +805,7 @@ EXPORT_SYMBOL(blk_queue_update_dma_alignment);
 void blk_set_queue_depth(struct request_queue *q, unsigned int depth)
 {
        q->queue_depth = depth;
-       wbt_set_queue_depth(q, depth);
+       rq_qos_queue_depth_changed(q);
 }
 EXPORT_SYMBOL(blk_set_queue_depth);
 
index c4d3089e47f7586e934d8b5765d0b0225dca4c7a..8af553a0ba00daaf09994be44c7c71aca9a3bfdc 100644 (file)
@@ -629,15 +629,6 @@ static 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)
 {
        struct rq_qos *rqos = wbt_rq_qos(q);
@@ -689,6 +680,12 @@ static int wbt_data_dir(const struct request *rq)
        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)
 {
        struct rq_wb *rwb = RQWB(rqos);
@@ -811,6 +808,7 @@ static struct rq_qos_ops wbt_rqos_ops = {
        .requeue = wbt_requeue,
        .done = wbt_done,
        .cleanup = wbt_cleanup,
+       .queue_depth_changed = wbt_queue_depth_changed,
        .exit = wbt_exit,
 #ifdef CONFIG_BLK_DEBUG_FS
        .debugfs_attrs = wbt_debugfs_attrs,
@@ -853,7 +851,7 @@ int wbt_init(struct request_queue *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));
 
        return 0;
index f47218d5b3b2081c81f92c40d3f4fc247f3f9242..8e4e376609710e2d6443bea904a73dac4b3dad9c 100644 (file)
@@ -95,7 +95,6 @@ void wbt_enable_default(struct request_queue *);
 u64 wbt_get_min_lat(struct request_queue *q);
 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);
 
 u64 wbt_default_latency_nsec(struct request_queue *);
@@ -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_set_queue_depth(struct request_queue *q, unsigned int depth)
-{
-}
 static inline void wbt_set_write_cache(struct request_queue *q, bool wc)
 {
 }