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:
Tejun Heo 2012-04-13 13:11:29 -07:00 committed by Jens Axboe
parent 8bd435b30e
commit da8b066262
4 changed files with 14 additions and 10 deletions

View file

@ -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);
} }

View file

@ -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);

View file

@ -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;

View file

@ -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;