blkcg: add request_queue->root_blkg
With per-queue policy activation, root blkg creation will be moved to blkcg core. Add q->root_blkg in preparation. For blk-throtl, this replaces throtl_data->root_tg; however, cfq needs to keep cfqd->root_group for !CONFIG_CFQ_GROUP_IOSCHED. This is to prepare for per-queue policy activation and doesn't cause any functional 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:
@@ -97,7 +97,6 @@ struct throtl_data
|
|||||||
/* service tree for active throtl groups */
|
/* service tree for active throtl groups */
|
||||||
struct throtl_rb_root tg_service_tree;
|
struct throtl_rb_root tg_service_tree;
|
||||||
|
|
||||||
struct throtl_grp *root_tg;
|
|
||||||
struct request_queue *queue;
|
struct request_queue *queue;
|
||||||
|
|
||||||
/* Total Number of queued bios on READ and WRITE lists */
|
/* Total Number of queued bios on READ and WRITE lists */
|
||||||
@@ -131,6 +130,11 @@ static inline struct blkio_group *tg_to_blkg(struct throtl_grp *tg)
|
|||||||
return pdata_to_blkg(tg);
|
return pdata_to_blkg(tg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct throtl_grp *td_root_tg(struct throtl_data *td)
|
||||||
|
{
|
||||||
|
return blkg_to_tg(td->queue->root_blkg);
|
||||||
|
}
|
||||||
|
|
||||||
enum tg_state_flags {
|
enum tg_state_flags {
|
||||||
THROTL_TG_FLAG_on_rr = 0, /* on round-robin busy list */
|
THROTL_TG_FLAG_on_rr = 0, /* on round-robin busy list */
|
||||||
};
|
};
|
||||||
@@ -261,7 +265,7 @@ throtl_grp *throtl_lookup_tg(struct throtl_data *td, struct blkio_cgroup *blkcg)
|
|||||||
* Avoid lookup in this case
|
* Avoid lookup in this case
|
||||||
*/
|
*/
|
||||||
if (blkcg == &blkio_root_cgroup)
|
if (blkcg == &blkio_root_cgroup)
|
||||||
return td->root_tg;
|
return td_root_tg(td);
|
||||||
|
|
||||||
return blkg_to_tg(blkg_lookup(blkcg, td->queue));
|
return blkg_to_tg(blkg_lookup(blkcg, td->queue));
|
||||||
}
|
}
|
||||||
@@ -277,7 +281,7 @@ static struct throtl_grp *throtl_lookup_create_tg(struct throtl_data *td,
|
|||||||
* Avoid lookup in this case
|
* Avoid lookup in this case
|
||||||
*/
|
*/
|
||||||
if (blkcg == &blkio_root_cgroup) {
|
if (blkcg == &blkio_root_cgroup) {
|
||||||
tg = td->root_tg;
|
tg = td_root_tg(td);
|
||||||
} else {
|
} else {
|
||||||
struct blkio_group *blkg;
|
struct blkio_group *blkg;
|
||||||
|
|
||||||
@@ -287,7 +291,7 @@ static struct throtl_grp *throtl_lookup_create_tg(struct throtl_data *td,
|
|||||||
if (!IS_ERR(blkg))
|
if (!IS_ERR(blkg))
|
||||||
tg = blkg_to_tg(blkg);
|
tg = blkg_to_tg(blkg);
|
||||||
else if (!blk_queue_dead(q))
|
else if (!blk_queue_dead(q))
|
||||||
tg = td->root_tg;
|
tg = td_root_tg(td);
|
||||||
}
|
}
|
||||||
|
|
||||||
return tg;
|
return tg;
|
||||||
@@ -1245,12 +1249,12 @@ int blk_throtl_init(struct request_queue *q)
|
|||||||
|
|
||||||
blkg = blkg_lookup_create(&blkio_root_cgroup, q, true);
|
blkg = blkg_lookup_create(&blkio_root_cgroup, q, true);
|
||||||
if (!IS_ERR(blkg))
|
if (!IS_ERR(blkg))
|
||||||
td->root_tg = blkg_to_tg(blkg);
|
q->root_blkg = blkg;
|
||||||
|
|
||||||
spin_unlock_irq(q->queue_lock);
|
spin_unlock_irq(q->queue_lock);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
if (!td->root_tg) {
|
if (!q->root_blkg) {
|
||||||
kfree(td);
|
kfree(td);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
@@ -3964,8 +3964,10 @@ static int cfq_init_queue(struct request_queue *q)
|
|||||||
spin_lock_irq(q->queue_lock);
|
spin_lock_irq(q->queue_lock);
|
||||||
|
|
||||||
blkg = blkg_lookup_create(&blkio_root_cgroup, q, true);
|
blkg = blkg_lookup_create(&blkio_root_cgroup, q, true);
|
||||||
if (!IS_ERR(blkg))
|
if (!IS_ERR(blkg)) {
|
||||||
|
q->root_blkg = blkg;
|
||||||
cfqd->root_group = blkg_to_cfqg(blkg);
|
cfqd->root_group = blkg_to_cfqg(blkg);
|
||||||
|
}
|
||||||
|
|
||||||
spin_unlock_irq(q->queue_lock);
|
spin_unlock_irq(q->queue_lock);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
@@ -31,6 +31,7 @@ struct blk_trace;
|
|||||||
struct request;
|
struct request;
|
||||||
struct sg_io_hdr;
|
struct sg_io_hdr;
|
||||||
struct bsg_job;
|
struct bsg_job;
|
||||||
|
struct blkio_group;
|
||||||
|
|
||||||
#define BLKDEV_MIN_RQ 4
|
#define BLKDEV_MIN_RQ 4
|
||||||
#define BLKDEV_MAX_RQ 128 /* Default maximum */
|
#define BLKDEV_MAX_RQ 128 /* Default maximum */
|
||||||
@@ -369,6 +370,7 @@ struct request_queue {
|
|||||||
|
|
||||||
struct list_head icq_list;
|
struct list_head icq_list;
|
||||||
#ifdef CONFIG_BLK_CGROUP
|
#ifdef CONFIG_BLK_CGROUP
|
||||||
|
struct blkio_group *root_blkg;
|
||||||
struct list_head blkg_list;
|
struct list_head blkg_list;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user