mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-01 02:33:57 +00:00
blk-cgroup: pass a gendisk to blkcg_{de,}activate_policy
Prepare for storing the blkcg information in the gendisk instead of the request_queue. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Andreas Herrmann <aherrmann@suse.de> Acked-by: Tejun Heo <tj@kernel.org> Link: https://lore.kernel.org/r/20230203150400.3199230-17-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
ba91c849fa
commit
40e4996ec0
@ -1291,7 +1291,7 @@ struct bfq_group *bfq_create_group_hierarchy(struct bfq_data *bfqd, int node)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = blkcg_activate_policy(bfqd->queue, &blkcg_policy_bfq);
|
ret = blkcg_activate_policy(bfqd->queue->disk, &blkcg_policy_bfq);
|
||||||
if (ret)
|
if (ret)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -7146,7 +7146,7 @@ static void bfq_exit_queue(struct elevator_queue *e)
|
|||||||
bfqg_and_blkg_put(bfqd->root_group);
|
bfqg_and_blkg_put(bfqd->root_group);
|
||||||
|
|
||||||
#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||||
blkcg_deactivate_policy(bfqd->queue, &blkcg_policy_bfq);
|
blkcg_deactivate_policy(bfqd->queue->disk, &blkcg_policy_bfq);
|
||||||
#else
|
#else
|
||||||
spin_lock_irq(&bfqd->lock);
|
spin_lock_irq(&bfqd->lock);
|
||||||
bfq_put_async_queues(bfqd, bfqd->root_group);
|
bfq_put_async_queues(bfqd, bfqd->root_group);
|
||||||
|
@ -1390,14 +1390,14 @@ struct cgroup_subsys io_cgrp_subsys = {
|
|||||||
EXPORT_SYMBOL_GPL(io_cgrp_subsys);
|
EXPORT_SYMBOL_GPL(io_cgrp_subsys);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* blkcg_activate_policy - activate a blkcg policy on a request_queue
|
* blkcg_activate_policy - activate a blkcg policy on a gendisk
|
||||||
* @q: request_queue of interest
|
* @disk: gendisk of interest
|
||||||
* @pol: blkcg policy to activate
|
* @pol: blkcg policy to activate
|
||||||
*
|
*
|
||||||
* Activate @pol on @q. Requires %GFP_KERNEL context. @q goes through
|
* Activate @pol on @disk. Requires %GFP_KERNEL context. @disk goes through
|
||||||
* bypass mode to populate its blkgs with policy_data for @pol.
|
* bypass mode to populate its blkgs with policy_data for @pol.
|
||||||
*
|
*
|
||||||
* Activation happens with @q bypassed, so nobody would be accessing blkgs
|
* Activation happens with @disk bypassed, so nobody would be accessing blkgs
|
||||||
* from IO path. Update of each blkg is protected by both queue and blkcg
|
* from IO path. Update of each blkg is protected by both queue and blkcg
|
||||||
* locks so that holding either lock and testing blkcg_policy_enabled() is
|
* locks so that holding either lock and testing blkcg_policy_enabled() is
|
||||||
* always enough for dereferencing policy data.
|
* always enough for dereferencing policy data.
|
||||||
@ -1405,9 +1405,9 @@ EXPORT_SYMBOL_GPL(io_cgrp_subsys);
|
|||||||
* The caller is responsible for synchronizing [de]activations and policy
|
* The caller is responsible for synchronizing [de]activations and policy
|
||||||
* [un]registerations. Returns 0 on success, -errno on failure.
|
* [un]registerations. Returns 0 on success, -errno on failure.
|
||||||
*/
|
*/
|
||||||
int blkcg_activate_policy(struct request_queue *q,
|
int blkcg_activate_policy(struct gendisk *disk, const struct blkcg_policy *pol)
|
||||||
const struct blkcg_policy *pol)
|
|
||||||
{
|
{
|
||||||
|
struct request_queue *q = disk->queue;
|
||||||
struct blkg_policy_data *pd_prealloc = NULL;
|
struct blkg_policy_data *pd_prealloc = NULL;
|
||||||
struct blkcg_gq *blkg, *pinned_blkg = NULL;
|
struct blkcg_gq *blkg, *pinned_blkg = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
@ -1508,16 +1508,17 @@ int blkcg_activate_policy(struct request_queue *q,
|
|||||||
EXPORT_SYMBOL_GPL(blkcg_activate_policy);
|
EXPORT_SYMBOL_GPL(blkcg_activate_policy);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* blkcg_deactivate_policy - deactivate a blkcg policy on a request_queue
|
* blkcg_deactivate_policy - deactivate a blkcg policy on a gendisk
|
||||||
* @q: request_queue of interest
|
* @disk: gendisk of interest
|
||||||
* @pol: blkcg policy to deactivate
|
* @pol: blkcg policy to deactivate
|
||||||
*
|
*
|
||||||
* Deactivate @pol on @q. Follows the same synchronization rules as
|
* Deactivate @pol on @disk. Follows the same synchronization rules as
|
||||||
* blkcg_activate_policy().
|
* blkcg_activate_policy().
|
||||||
*/
|
*/
|
||||||
void blkcg_deactivate_policy(struct request_queue *q,
|
void blkcg_deactivate_policy(struct gendisk *disk,
|
||||||
const struct blkcg_policy *pol)
|
const struct blkcg_policy *pol)
|
||||||
{
|
{
|
||||||
|
struct request_queue *q = disk->queue;
|
||||||
struct blkcg_gq *blkg;
|
struct blkcg_gq *blkg;
|
||||||
|
|
||||||
if (!blkcg_policy_enabled(q, pol))
|
if (!blkcg_policy_enabled(q, pol))
|
||||||
|
@ -194,9 +194,8 @@ void blkcg_exit_disk(struct gendisk *disk);
|
|||||||
/* Blkio controller policy registration */
|
/* Blkio controller policy registration */
|
||||||
int blkcg_policy_register(struct blkcg_policy *pol);
|
int blkcg_policy_register(struct blkcg_policy *pol);
|
||||||
void blkcg_policy_unregister(struct blkcg_policy *pol);
|
void blkcg_policy_unregister(struct blkcg_policy *pol);
|
||||||
int blkcg_activate_policy(struct request_queue *q,
|
int blkcg_activate_policy(struct gendisk *disk, const struct blkcg_policy *pol);
|
||||||
const struct blkcg_policy *pol);
|
void blkcg_deactivate_policy(struct gendisk *disk,
|
||||||
void blkcg_deactivate_policy(struct request_queue *q,
|
|
||||||
const struct blkcg_policy *pol);
|
const struct blkcg_policy *pol);
|
||||||
|
|
||||||
const char *blkg_dev_name(struct blkcg_gq *blkg);
|
const char *blkg_dev_name(struct blkcg_gq *blkg);
|
||||||
@ -495,9 +494,9 @@ static inline int blkcg_init_disk(struct gendisk *disk) { return 0; }
|
|||||||
static inline void blkcg_exit_disk(struct gendisk *disk) { }
|
static inline void blkcg_exit_disk(struct gendisk *disk) { }
|
||||||
static inline int blkcg_policy_register(struct blkcg_policy *pol) { return 0; }
|
static inline int blkcg_policy_register(struct blkcg_policy *pol) { return 0; }
|
||||||
static inline void blkcg_policy_unregister(struct blkcg_policy *pol) { }
|
static inline void blkcg_policy_unregister(struct blkcg_policy *pol) { }
|
||||||
static inline int blkcg_activate_policy(struct request_queue *q,
|
static inline int blkcg_activate_policy(struct gendisk *disk,
|
||||||
const struct blkcg_policy *pol) { return 0; }
|
const struct blkcg_policy *pol) { return 0; }
|
||||||
static inline void blkcg_deactivate_policy(struct request_queue *q,
|
static inline void blkcg_deactivate_policy(struct gendisk *disk,
|
||||||
const struct blkcg_policy *pol) { }
|
const struct blkcg_policy *pol) { }
|
||||||
|
|
||||||
static inline struct blkg_policy_data *blkg_to_pd(struct blkcg_gq *blkg,
|
static inline struct blkg_policy_data *blkg_to_pd(struct blkcg_gq *blkg,
|
||||||
|
@ -2821,7 +2821,7 @@ static void ioc_rqos_exit(struct rq_qos *rqos)
|
|||||||
{
|
{
|
||||||
struct ioc *ioc = rqos_to_ioc(rqos);
|
struct ioc *ioc = rqos_to_ioc(rqos);
|
||||||
|
|
||||||
blkcg_deactivate_policy(rqos->disk->queue, &blkcg_policy_iocost);
|
blkcg_deactivate_policy(rqos->disk, &blkcg_policy_iocost);
|
||||||
|
|
||||||
spin_lock_irq(&ioc->lock);
|
spin_lock_irq(&ioc->lock);
|
||||||
ioc->running = IOC_STOP;
|
ioc->running = IOC_STOP;
|
||||||
@ -2893,7 +2893,7 @@ static int blk_iocost_init(struct gendisk *disk)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto err_free_ioc;
|
goto err_free_ioc;
|
||||||
|
|
||||||
ret = blkcg_activate_policy(disk->queue, &blkcg_policy_iocost);
|
ret = blkcg_activate_policy(disk, &blkcg_policy_iocost);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_del_qos;
|
goto err_del_qos;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -646,7 +646,7 @@ static void blkcg_iolatency_exit(struct rq_qos *rqos)
|
|||||||
|
|
||||||
timer_shutdown_sync(&blkiolat->timer);
|
timer_shutdown_sync(&blkiolat->timer);
|
||||||
flush_work(&blkiolat->enable_work);
|
flush_work(&blkiolat->enable_work);
|
||||||
blkcg_deactivate_policy(rqos->disk->queue, &blkcg_policy_iolatency);
|
blkcg_deactivate_policy(rqos->disk, &blkcg_policy_iolatency);
|
||||||
kfree(blkiolat);
|
kfree(blkiolat);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -768,7 +768,7 @@ int blk_iolatency_init(struct gendisk *disk)
|
|||||||
&blkcg_iolatency_ops);
|
&blkcg_iolatency_ops);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_free;
|
goto err_free;
|
||||||
ret = blkcg_activate_policy(disk->queue, &blkcg_policy_iolatency);
|
ret = blkcg_activate_policy(disk, &blkcg_policy_iolatency);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_qos_del;
|
goto err_qos_del;
|
||||||
|
|
||||||
|
@ -204,12 +204,12 @@ void blkcg_set_ioprio(struct bio *bio)
|
|||||||
|
|
||||||
void blk_ioprio_exit(struct gendisk *disk)
|
void blk_ioprio_exit(struct gendisk *disk)
|
||||||
{
|
{
|
||||||
blkcg_deactivate_policy(disk->queue, &ioprio_policy);
|
blkcg_deactivate_policy(disk, &ioprio_policy);
|
||||||
}
|
}
|
||||||
|
|
||||||
int blk_ioprio_init(struct gendisk *disk)
|
int blk_ioprio_init(struct gendisk *disk)
|
||||||
{
|
{
|
||||||
return blkcg_activate_policy(disk->queue, &ioprio_policy);
|
return blkcg_activate_policy(disk, &ioprio_policy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init ioprio_init(void)
|
static int __init ioprio_init(void)
|
||||||
|
@ -2395,7 +2395,7 @@ int blk_throtl_init(struct gendisk *disk)
|
|||||||
td->low_downgrade_time = jiffies;
|
td->low_downgrade_time = jiffies;
|
||||||
|
|
||||||
/* activate policy */
|
/* activate policy */
|
||||||
ret = blkcg_activate_policy(q, &blkcg_policy_throtl);
|
ret = blkcg_activate_policy(disk, &blkcg_policy_throtl);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
free_percpu(td->latency_buckets[READ]);
|
free_percpu(td->latency_buckets[READ]);
|
||||||
free_percpu(td->latency_buckets[WRITE]);
|
free_percpu(td->latency_buckets[WRITE]);
|
||||||
@ -2411,7 +2411,7 @@ void blk_throtl_exit(struct gendisk *disk)
|
|||||||
BUG_ON(!q->td);
|
BUG_ON(!q->td);
|
||||||
del_timer_sync(&q->td->service_queue.pending_timer);
|
del_timer_sync(&q->td->service_queue.pending_timer);
|
||||||
throtl_shutdown_wq(q);
|
throtl_shutdown_wq(q);
|
||||||
blkcg_deactivate_policy(q, &blkcg_policy_throtl);
|
blkcg_deactivate_policy(disk, &blkcg_policy_throtl);
|
||||||
free_percpu(q->td->latency_buckets[READ]);
|
free_percpu(q->td->latency_buckets[READ]);
|
||||||
free_percpu(q->td->latency_buckets[WRITE]);
|
free_percpu(q->td->latency_buckets[WRITE]);
|
||||||
kfree(q->td);
|
kfree(q->td);
|
||||||
|
Loading…
Reference in New Issue
Block a user