blkcg: add blkio_policy[] array and allow one policy per policy ID
authorTejun Heo <tj@kernel.org>
Mon, 5 Mar 2012 21:15:04 +0000 (13:15 -0800)
committerJens Axboe <axboe@kernel.dk>
Tue, 6 Mar 2012 20:27:22 +0000 (21:27 +0100)
Block cgroup policies are maintained in a linked list and,
theoretically, multiple policies sharing the same policy ID are
allowed.

This patch temporarily restricts one policy per plid and adds
blkio_policy[] array which indexes registered policy types by plid.
Both the restriction and blkio_policy[] array are transitional and
will be removed once API cleanup is complete.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-cgroup.c
block/blk-cgroup.h

index 5e50ca1f5b47734f742efbdf1d498ce9f0fcc90e..f1b08d3cba557e5f81bdc263639eb50f1f5f73a3 100644 (file)
@@ -29,6 +29,8 @@ static LIST_HEAD(blkio_list);
 struct blkio_cgroup blkio_root_cgroup = { .weight = 2*BLKIO_WEIGHT_DEFAULT };
 EXPORT_SYMBOL_GPL(blkio_root_cgroup);
 
+static struct blkio_policy_type *blkio_policy[BLKIO_NR_POLICIES];
+
 static struct cgroup_subsys_state *blkiocg_create(struct cgroup_subsys *,
                                                  struct cgroup *);
 static int blkiocg_can_attach(struct cgroup_subsys *, struct cgroup *,
@@ -1694,7 +1696,11 @@ static void blkiocg_attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
 void blkio_policy_register(struct blkio_policy_type *blkiop)
 {
        spin_lock(&blkio_list_lock);
+
+       BUG_ON(blkio_policy[blkiop->plid]);
+       blkio_policy[blkiop->plid] = blkiop;
        list_add_tail(&blkiop->list, &blkio_list);
+
        spin_unlock(&blkio_list_lock);
 }
 EXPORT_SYMBOL_GPL(blkio_policy_register);
@@ -1702,7 +1708,11 @@ EXPORT_SYMBOL_GPL(blkio_policy_register);
 void blkio_policy_unregister(struct blkio_policy_type *blkiop)
 {
        spin_lock(&blkio_list_lock);
+
+       BUG_ON(blkio_policy[blkiop->plid] != blkiop);
+       blkio_policy[blkiop->plid] = NULL;
        list_del_init(&blkiop->list);
+
        spin_unlock(&blkio_list_lock);
 }
 EXPORT_SYMBOL_GPL(blkio_policy_unregister);
index 41c960b99c57040931a8ba40f831c9e534004d95..562fa55d97b1faed4601d06c8b96edc60637ae4f 100644 (file)
@@ -19,6 +19,8 @@
 enum blkio_policy_id {
        BLKIO_POLICY_PROP = 0,          /* Proportional Bandwidth division */
        BLKIO_POLICY_THROTL,            /* Throttling */
+
+       BLKIO_NR_POLICIES,
 };
 
 /* Max limits for throttle policy */