Commit ce57b558 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

blk-rq-qos: make rq_qos_add and rq_qos_del more useful

Switch to passing a gendisk, and make rq_qos_add initialize all required
fields and drop the not required q argument from rq_qos_del.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarAndreas Herrmann <aherrmann@suse.de>
Acked-by: default avatarTejun Heo <tj@kernel.org>
Link: https://lore.kernel.org/r/20230203150400.3199230-14-hch@lst.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent b494f9c5
...@@ -2843,9 +2843,7 @@ static struct rq_qos_ops ioc_rqos_ops = { ...@@ -2843,9 +2843,7 @@ static struct rq_qos_ops ioc_rqos_ops = {
static int blk_iocost_init(struct gendisk *disk) static int blk_iocost_init(struct gendisk *disk)
{ {
struct request_queue *q = disk->queue;
struct ioc *ioc; struct ioc *ioc;
struct rq_qos *rqos;
int i, cpu, ret; int i, cpu, ret;
ioc = kzalloc(sizeof(*ioc), GFP_KERNEL); ioc = kzalloc(sizeof(*ioc), GFP_KERNEL);
...@@ -2868,11 +2866,6 @@ static int blk_iocost_init(struct gendisk *disk) ...@@ -2868,11 +2866,6 @@ static int blk_iocost_init(struct gendisk *disk)
local64_set(&ccs->rq_wait_ns, 0); local64_set(&ccs->rq_wait_ns, 0);
} }
rqos = &ioc->rqos;
rqos->id = RQ_QOS_COST;
rqos->ops = &ioc_rqos_ops;
rqos->q = q;
spin_lock_init(&ioc->lock); spin_lock_init(&ioc->lock);
timer_setup(&ioc->timer, ioc_timer_fn, 0); timer_setup(&ioc->timer, ioc_timer_fn, 0);
INIT_LIST_HEAD(&ioc->active_iocgs); INIT_LIST_HEAD(&ioc->active_iocgs);
...@@ -2896,17 +2889,17 @@ static int blk_iocost_init(struct gendisk *disk) ...@@ -2896,17 +2889,17 @@ static int blk_iocost_init(struct gendisk *disk)
* called before policy activation completion, can't assume that the * called before policy activation completion, can't assume that the
* target bio has an iocg associated and need to test for NULL iocg. * target bio has an iocg associated and need to test for NULL iocg.
*/ */
ret = rq_qos_add(q, rqos); ret = rq_qos_add(&ioc->rqos, disk, RQ_QOS_COST, &ioc_rqos_ops);
if (ret) if (ret)
goto err_free_ioc; goto err_free_ioc;
ret = blkcg_activate_policy(q, &blkcg_policy_iocost); ret = blkcg_activate_policy(disk->queue, &blkcg_policy_iocost);
if (ret) if (ret)
goto err_del_qos; goto err_del_qos;
return 0; return 0;
err_del_qos: err_del_qos:
rq_qos_del(q, rqos); rq_qos_del(&ioc->rqos);
err_free_ioc: err_free_ioc:
free_percpu(ioc->pcpu_stat); free_percpu(ioc->pcpu_stat);
kfree(ioc); kfree(ioc);
......
...@@ -757,24 +757,18 @@ static void blkiolatency_enable_work_fn(struct work_struct *work) ...@@ -757,24 +757,18 @@ static void blkiolatency_enable_work_fn(struct work_struct *work)
int blk_iolatency_init(struct gendisk *disk) int blk_iolatency_init(struct gendisk *disk)
{ {
struct request_queue *q = disk->queue;
struct blk_iolatency *blkiolat; struct blk_iolatency *blkiolat;
struct rq_qos *rqos;
int ret; int ret;
blkiolat = kzalloc(sizeof(*blkiolat), GFP_KERNEL); blkiolat = kzalloc(sizeof(*blkiolat), GFP_KERNEL);
if (!blkiolat) if (!blkiolat)
return -ENOMEM; return -ENOMEM;
rqos = &blkiolat->rqos; ret = rq_qos_add(&blkiolat->rqos, disk, RQ_QOS_LATENCY,
rqos->id = RQ_QOS_LATENCY; &blkcg_iolatency_ops);
rqos->ops = &blkcg_iolatency_ops;
rqos->q = q;
ret = rq_qos_add(q, rqos);
if (ret) if (ret)
goto err_free; goto err_free;
ret = blkcg_activate_policy(q, &blkcg_policy_iolatency); ret = blkcg_activate_policy(disk->queue, &blkcg_policy_iolatency);
if (ret) if (ret)
goto err_qos_del; goto err_qos_del;
...@@ -784,7 +778,7 @@ int blk_iolatency_init(struct gendisk *disk) ...@@ -784,7 +778,7 @@ int blk_iolatency_init(struct gendisk *disk)
return 0; return 0;
err_qos_del: err_qos_del:
rq_qos_del(q, rqos); rq_qos_del(&blkiolat->rqos);
err_free: err_free:
kfree(blkiolat); kfree(blkiolat);
return ret; return ret;
......
...@@ -295,8 +295,15 @@ void rq_qos_exit(struct request_queue *q) ...@@ -295,8 +295,15 @@ void rq_qos_exit(struct request_queue *q)
} }
} }
int rq_qos_add(struct request_queue *q, struct rq_qos *rqos) int rq_qos_add(struct rq_qos *rqos, struct gendisk *disk, enum rq_qos_id id,
struct rq_qos_ops *ops)
{ {
struct request_queue *q = disk->queue;
rqos->q = q;
rqos->id = id;
rqos->ops = ops;
/* /*
* No IO can be in-flight when adding rqos, so freeze queue, which * No IO can be in-flight when adding rqos, so freeze queue, which
* is fine since we only support rq_qos for blk-mq queue. * is fine since we only support rq_qos for blk-mq queue.
...@@ -326,11 +333,11 @@ int rq_qos_add(struct request_queue *q, struct rq_qos *rqos) ...@@ -326,11 +333,11 @@ int rq_qos_add(struct request_queue *q, struct rq_qos *rqos)
spin_unlock_irq(&q->queue_lock); spin_unlock_irq(&q->queue_lock);
blk_mq_unfreeze_queue(q); blk_mq_unfreeze_queue(q);
return -EBUSY; return -EBUSY;
} }
void rq_qos_del(struct request_queue *q, struct rq_qos *rqos) void rq_qos_del(struct rq_qos *rqos)
{ {
struct request_queue *q = rqos->q;
struct rq_qos **cur; struct rq_qos **cur;
/* /*
......
...@@ -85,8 +85,9 @@ static inline void rq_wait_init(struct rq_wait *rq_wait) ...@@ -85,8 +85,9 @@ static inline void rq_wait_init(struct rq_wait *rq_wait)
init_waitqueue_head(&rq_wait->wait); init_waitqueue_head(&rq_wait->wait);
} }
int rq_qos_add(struct request_queue *q, struct rq_qos *rqos); int rq_qos_add(struct rq_qos *rqos, struct gendisk *disk, enum rq_qos_id id,
void rq_qos_del(struct request_queue *q, struct rq_qos *rqos); struct rq_qos_ops *ops);
void rq_qos_del(struct rq_qos *rqos);
typedef bool (acquire_inflight_cb_t)(struct rq_wait *rqw, void *private_data); typedef bool (acquire_inflight_cb_t)(struct rq_wait *rqw, void *private_data);
typedef void (cleanup_cb_t)(struct rq_wait *rqw, void *private_data); typedef void (cleanup_cb_t)(struct rq_wait *rqw, void *private_data);
......
...@@ -932,9 +932,6 @@ int wbt_init(struct gendisk *disk) ...@@ -932,9 +932,6 @@ int wbt_init(struct gendisk *disk)
for (i = 0; i < WBT_NUM_RWQ; i++) for (i = 0; i < WBT_NUM_RWQ; i++)
rq_wait_init(&rwb->rq_wait[i]); rq_wait_init(&rwb->rq_wait[i]);
rwb->rqos.id = RQ_QOS_WBT;
rwb->rqos.ops = &wbt_rqos_ops;
rwb->rqos.q = q;
rwb->last_comp = rwb->last_issue = jiffies; rwb->last_comp = rwb->last_issue = jiffies;
rwb->win_nsec = RWB_WINDOW_NSEC; rwb->win_nsec = RWB_WINDOW_NSEC;
rwb->enable_state = WBT_STATE_ON_DEFAULT; rwb->enable_state = WBT_STATE_ON_DEFAULT;
...@@ -947,7 +944,7 @@ int wbt_init(struct gendisk *disk) ...@@ -947,7 +944,7 @@ int wbt_init(struct gendisk *disk)
/* /*
* Assign rwb and add the stats callback. * Assign rwb and add the stats callback.
*/ */
ret = rq_qos_add(q, &rwb->rqos); ret = rq_qos_add(&rwb->rqos, disk, RQ_QOS_WBT, &wbt_rqos_ops);
if (ret) if (ret)
goto err_free; goto err_free;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment