blkcg: make blkg_conf_prep() take @pol and return with queue lock held
Add @pol to blkg_conf_prep() and let it return with queue lock held (to be released by blkg_conf_finish()). Note that @pol isn't used yet. This is to prepare for per-queue policy activation and doesn't cause any visible difference. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Vivek Goyal <vgoyal@redhat.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
8bd435b30e
commit
da8b066262
4 changed files with 14 additions and 10 deletions
|
@ -464,17 +464,19 @@ EXPORT_SYMBOL_GPL(blkg_prfill_rwstat);
|
||||||
/**
|
/**
|
||||||
* blkg_conf_prep - parse and prepare for per-blkg config update
|
* blkg_conf_prep - parse and prepare for per-blkg config update
|
||||||
* @blkcg: target block cgroup
|
* @blkcg: target block cgroup
|
||||||
|
* @pol: target policy
|
||||||
* @input: input string
|
* @input: input string
|
||||||
* @ctx: blkg_conf_ctx to be filled
|
* @ctx: blkg_conf_ctx to be filled
|
||||||
*
|
*
|
||||||
* Parse per-blkg config update from @input and initialize @ctx with the
|
* Parse per-blkg config update from @input and initialize @ctx with the
|
||||||
* result. @ctx->blkg points to the blkg to be updated and @ctx->v the new
|
* result. @ctx->blkg points to the blkg to be updated and @ctx->v the new
|
||||||
* value. This function returns with RCU read locked and must be paired
|
* value. This function returns with RCU read lock and queue lock held and
|
||||||
* with blkg_conf_finish().
|
* must be paired with blkg_conf_finish().
|
||||||
*/
|
*/
|
||||||
int blkg_conf_prep(struct blkio_cgroup *blkcg, const char *input,
|
int blkg_conf_prep(struct blkio_cgroup *blkcg,
|
||||||
|
const struct blkio_policy_type *pol, const char *input,
|
||||||
struct blkg_conf_ctx *ctx)
|
struct blkg_conf_ctx *ctx)
|
||||||
__acquires(rcu)
|
__acquires(rcu) __acquires(disk->queue->queue_lock)
|
||||||
{
|
{
|
||||||
struct gendisk *disk;
|
struct gendisk *disk;
|
||||||
struct blkio_group *blkg;
|
struct blkio_group *blkg;
|
||||||
|
@ -490,14 +492,14 @@ int blkg_conf_prep(struct blkio_cgroup *blkcg, const char *input,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
|
||||||
spin_lock_irq(disk->queue->queue_lock);
|
spin_lock_irq(disk->queue->queue_lock);
|
||||||
|
|
||||||
blkg = blkg_lookup_create(blkcg, disk->queue, false);
|
blkg = blkg_lookup_create(blkcg, disk->queue, false);
|
||||||
spin_unlock_irq(disk->queue->queue_lock);
|
|
||||||
|
|
||||||
if (IS_ERR(blkg)) {
|
if (IS_ERR(blkg)) {
|
||||||
ret = PTR_ERR(blkg);
|
ret = PTR_ERR(blkg);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
spin_unlock_irq(disk->queue->queue_lock);
|
||||||
put_disk(disk);
|
put_disk(disk);
|
||||||
/*
|
/*
|
||||||
* If queue was bypassing, we should retry. Do so after a
|
* If queue was bypassing, we should retry. Do so after a
|
||||||
|
@ -527,8 +529,9 @@ EXPORT_SYMBOL_GPL(blkg_conf_prep);
|
||||||
* with blkg_conf_prep().
|
* with blkg_conf_prep().
|
||||||
*/
|
*/
|
||||||
void blkg_conf_finish(struct blkg_conf_ctx *ctx)
|
void blkg_conf_finish(struct blkg_conf_ctx *ctx)
|
||||||
__releases(rcu)
|
__releases(ctx->disk->queue->queue_lock) __releases(rcu)
|
||||||
{
|
{
|
||||||
|
spin_unlock_irq(ctx->disk->queue->queue_lock);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
put_disk(ctx->disk);
|
put_disk(ctx->disk);
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,7 +128,8 @@ struct blkg_conf_ctx {
|
||||||
u64 v;
|
u64 v;
|
||||||
};
|
};
|
||||||
|
|
||||||
int blkg_conf_prep(struct blkio_cgroup *blkcg, const char *input,
|
int blkg_conf_prep(struct blkio_cgroup *blkcg,
|
||||||
|
const struct blkio_policy_type *pol, const char *input,
|
||||||
struct blkg_conf_ctx *ctx);
|
struct blkg_conf_ctx *ctx);
|
||||||
void blkg_conf_finish(struct blkg_conf_ctx *ctx);
|
void blkg_conf_finish(struct blkg_conf_ctx *ctx);
|
||||||
|
|
||||||
|
|
|
@ -993,7 +993,7 @@ static int tg_set_conf(struct cgroup *cgrp, struct cftype *cft, const char *buf,
|
||||||
struct throtl_grp *tg;
|
struct throtl_grp *tg;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = blkg_conf_prep(blkcg, buf, &ctx);
|
ret = blkg_conf_prep(blkcg, &blkio_policy_throtl, buf, &ctx);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
|
@ -1400,7 +1400,7 @@ static int cfqg_set_weight_device(struct cgroup *cgrp, struct cftype *cft,
|
||||||
struct cfq_group *cfqg;
|
struct cfq_group *cfqg;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = blkg_conf_prep(blkcg, buf, &ctx);
|
ret = blkg_conf_prep(blkcg, &blkio_policy_cfq, buf, &ctx);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue