diff options
author | Vivek Goyal <vgoyal@redhat.com> | 2011-05-19 15:38:24 -0400 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2011-05-20 14:34:52 -0400 |
commit | 29b125892f3317ada86b662e0b6ebc0f79be9037 (patch) | |
tree | a8caa5a8d521c0d667bbae956ff4d8b160ad02d9 | |
parent | f469a7b4d5b1d1d053200a9015fd25d59c057f49 (diff) |
blk-throttle: Dynamically allocate root group
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>
-rw-r--r-- | block/blk-throttle.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/block/blk-throttle.c b/block/blk-throttle.c index c201967b33cd..68f2ac3f3b07 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c | |||
@@ -88,7 +88,7 @@ struct throtl_data | |||
88 | /* service tree for active throtl groups */ | 88 | /* service tree for active throtl groups */ |
89 | struct throtl_rb_root tg_service_tree; | 89 | struct throtl_rb_root tg_service_tree; |
90 | 90 | ||
91 | struct throtl_grp root_tg; | 91 | struct throtl_grp *root_tg; |
92 | struct request_queue *queue; | 92 | struct request_queue *queue; |
93 | 93 | ||
94 | /* Total Number of queued bios on READ and WRITE lists */ | 94 | /* 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) | |||
233 | * Avoid lookup in this case | 233 | * Avoid lookup in this case |
234 | */ | 234 | */ |
235 | if (blkcg == &blkio_root_cgroup) | 235 | if (blkcg == &blkio_root_cgroup) |
236 | tg = &td->root_tg; | 236 | tg = td->root_tg; |
237 | else | 237 | else |
238 | tg = tg_of_blkg(blkiocg_lookup_group(blkcg, key)); | 238 | tg = tg_of_blkg(blkiocg_lookup_group(blkcg, key)); |
239 | 239 | ||
@@ -313,7 +313,7 @@ static struct throtl_grp * throtl_get_tg(struct throtl_data *td) | |||
313 | 313 | ||
314 | /* Group allocation failed. Account the IO to root group */ | 314 | /* Group allocation failed. Account the IO to root group */ |
315 | if (!tg) { | 315 | if (!tg) { |
316 | tg = &td->root_tg; | 316 | tg = td->root_tg; |
317 | return tg; | 317 | return tg; |
318 | } | 318 | } |
319 | 319 | ||
@@ -1153,18 +1153,16 @@ int blk_throtl_init(struct request_queue *q) | |||
1153 | td->limits_changed = false; | 1153 | td->limits_changed = false; |
1154 | INIT_DELAYED_WORK(&td->throtl_work, blk_throtl_work); | 1154 | INIT_DELAYED_WORK(&td->throtl_work, blk_throtl_work); |
1155 | 1155 | ||
1156 | /* Init root group */ | 1156 | /* alloc and Init root group. */ |
1157 | tg = &td->root_tg; | 1157 | td->queue = q; |
1158 | throtl_init_group(tg); | 1158 | tg = throtl_alloc_tg(td); |
1159 | 1159 | ||
1160 | /* | 1160 | if (!tg) { |
1161 | * Set root group reference to 2. One reference will be dropped when | 1161 | kfree(td); |
1162 | * all groups on tg_list are being deleted during queue exit. Other | 1162 | return -ENOMEM; |
1163 | * reference will remain there as we don't want to delete this group | 1163 | } |
1164 | * as it is statically allocated and gets destroyed when throtl_data | 1164 | |
1165 | * goes away. | 1165 | td->root_tg = tg; |
1166 | */ | ||
1167 | atomic_inc(&tg->ref); | ||
1168 | 1166 | ||
1169 | rcu_read_lock(); | 1167 | rcu_read_lock(); |
1170 | blkiocg_add_blkio_group(&blkio_root_cgroup, &tg->blkg, (void *)td, | 1168 | blkiocg_add_blkio_group(&blkio_root_cgroup, &tg->blkg, (void *)td, |
@@ -1173,7 +1171,6 @@ int blk_throtl_init(struct request_queue *q) | |||
1173 | throtl_add_group_to_td_list(td, tg); | 1171 | throtl_add_group_to_td_list(td, tg); |
1174 | 1172 | ||
1175 | /* Attach throtl data to request queue */ | 1173 | /* Attach throtl data to request queue */ |
1176 | td->queue = q; | ||
1177 | q->td = td; | 1174 | q->td = td; |
1178 | return 0; | 1175 | return 0; |
1179 | } | 1176 | } |