diff options
Diffstat (limited to 'block/cfq-iosched.c')
-rw-r--r-- | block/cfq-iosched.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 606020fe93f3..d646b279c8bb 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -1051,7 +1051,7 @@ static void cfq_init_add_cfqg_lists(struct cfq_data *cfqd, | |||
1051 | static struct cfq_group * cfq_alloc_cfqg(struct cfq_data *cfqd) | 1051 | static struct cfq_group * cfq_alloc_cfqg(struct cfq_data *cfqd) |
1052 | { | 1052 | { |
1053 | struct cfq_group *cfqg = NULL; | 1053 | struct cfq_group *cfqg = NULL; |
1054 | int i, j; | 1054 | int i, j, ret; |
1055 | struct cfq_rb_root *st; | 1055 | struct cfq_rb_root *st; |
1056 | 1056 | ||
1057 | cfqg = kzalloc_node(sizeof(*cfqg), GFP_ATOMIC, cfqd->queue->node); | 1057 | cfqg = kzalloc_node(sizeof(*cfqg), GFP_ATOMIC, cfqd->queue->node); |
@@ -1069,6 +1069,13 @@ static struct cfq_group * cfq_alloc_cfqg(struct cfq_data *cfqd) | |||
1069 | * or cgroup deletion path depending on who is exiting first. | 1069 | * or cgroup deletion path depending on who is exiting first. |
1070 | */ | 1070 | */ |
1071 | cfqg->ref = 1; | 1071 | cfqg->ref = 1; |
1072 | |||
1073 | ret = blkio_alloc_blkg_stats(&cfqg->blkg); | ||
1074 | if (ret) { | ||
1075 | kfree(cfqg); | ||
1076 | return NULL; | ||
1077 | } | ||
1078 | |||
1072 | return cfqg; | 1079 | return cfqg; |
1073 | } | 1080 | } |
1074 | 1081 | ||
@@ -1183,6 +1190,7 @@ static void cfq_put_cfqg(struct cfq_group *cfqg) | |||
1183 | return; | 1190 | return; |
1184 | for_each_cfqg_st(cfqg, i, j, st) | 1191 | for_each_cfqg_st(cfqg, i, j, st) |
1185 | BUG_ON(!RB_EMPTY_ROOT(&st->rb)); | 1192 | BUG_ON(!RB_EMPTY_ROOT(&st->rb)); |
1193 | free_percpu(cfqg->blkg.stats_cpu); | ||
1186 | kfree(cfqg); | 1194 | kfree(cfqg); |
1187 | } | 1195 | } |
1188 | 1196 | ||
@@ -3995,7 +4003,15 @@ static void *cfq_init_queue(struct request_queue *q) | |||
3995 | * throtl_data goes away. | 4003 | * throtl_data goes away. |
3996 | */ | 4004 | */ |
3997 | cfqg->ref = 2; | 4005 | cfqg->ref = 2; |
4006 | |||
4007 | if (blkio_alloc_blkg_stats(&cfqg->blkg)) { | ||
4008 | kfree(cfqg); | ||
4009 | kfree(cfqd); | ||
4010 | return NULL; | ||
4011 | } | ||
4012 | |||
3998 | rcu_read_lock(); | 4013 | rcu_read_lock(); |
4014 | |||
3999 | cfq_blkiocg_add_blkio_group(&blkio_root_cgroup, &cfqg->blkg, | 4015 | cfq_blkiocg_add_blkio_group(&blkio_root_cgroup, &cfqg->blkg, |
4000 | (void *)cfqd, 0); | 4016 | (void *)cfqd, 0); |
4001 | rcu_read_unlock(); | 4017 | rcu_read_unlock(); |