blk-throttle: Dynamically allocate root group
authorVivek Goyal <vgoyal@redhat.com>
Thu, 19 May 2011 19:38:24 +0000 (15:38 -0400)
committerJens Axboe <jaxboe@fusionio.com>
Fri, 20 May 2011 18:34:52 +0000 (20:34 +0200)
Currently, we allocate root throtl_grp statically. But as we will be
introducing per cpu stat pointers and that will be allocated
dynamically even for root group, we might as well make whole root
throtl_grp allocation dynamic and treat it in same manner as other
groups.

Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
block/blk-throttle.c

index c201967..68f2ac3 100644 (file)
@@ -88,7 +88,7 @@ struct throtl_data
        /* service tree for active throtl groups */
        struct throtl_rb_root tg_service_tree;
 
-       struct throtl_grp root_tg;
+       struct throtl_grp *root_tg;
        struct request_queue *queue;
 
        /* Total Number of queued bios on READ and WRITE lists */
@@ -233,7 +233,7 @@ throtl_grp *throtl_find_tg(struct throtl_data *td, struct blkio_cgroup *blkcg)
         * Avoid lookup in this case
         */
        if (blkcg == &blkio_root_cgroup)
-               tg = &td->root_tg;
+               tg = td->root_tg;
        else
                tg = tg_of_blkg(blkiocg_lookup_group(blkcg, key));
 
@@ -313,7 +313,7 @@ static struct throtl_grp * throtl_get_tg(struct throtl_data *td)
 
        /* Group allocation failed. Account the IO to root group */
        if (!tg) {
-               tg = &td->root_tg;
+               tg = td->root_tg;
                return tg;
        }
 
@@ -1153,18 +1153,16 @@ int blk_throtl_init(struct request_queue *q)
        td->limits_changed = false;
        INIT_DELAYED_WORK(&td->throtl_work, blk_throtl_work);
 
-       /* Init root group */
-       tg = &td->root_tg;
-       throtl_init_group(tg);
+       /* alloc and Init root group. */
+       td->queue = q;
+       tg = throtl_alloc_tg(td);
 
-       /*
-        * Set root group reference to 2. One reference will be dropped when
-        * all groups on tg_list are being deleted during queue exit. Other
-        * reference will remain there as we don't want to delete this group
-        * as it is statically allocated and gets destroyed when throtl_data
-        * goes away.
-        */
-       atomic_inc(&tg->ref);
+       if (!tg) {
+               kfree(td);
+               return -ENOMEM;
+       }
+
+       td->root_tg = tg;
 
        rcu_read_lock();
        blkiocg_add_blkio_group(&blkio_root_cgroup, &tg->blkg, (void *)td,
@@ -1173,7 +1171,6 @@ int blk_throtl_init(struct request_queue *q)
        throtl_add_group_to_td_list(td, tg);
 
        /* Attach throtl data to request queue */
-       td->queue = q;
        q->td = td;
        return 0;
 }