diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-03 21:25:03 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-03 21:25:03 -0400 |
commit | 32dad03d164206ea886885d0740284ba215b0970 (patch) | |
tree | 5fd89fe27295bfbe47dce5f274aa645099741a71 /block | |
parent | 357397a14117f0c2eeafcac06a1f8412a02aa6af (diff) | |
parent | d1625964da51bda61306ad3ec45307a799c21f08 (diff) |
Merge branch 'for-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
Pull cgroup updates from Tejun Heo:
"A lot of activities on the cgroup front. Most changes aren't visible
to userland at all at this point and are laying foundation for the
planned unified hierarchy.
- The biggest change is decoupling the lifetime management of css
(cgroup_subsys_state) from that of cgroup's. Because controllers
(cpu, memory, block and so on) will need to be dynamically enabled
and disabled, css which is the association point between a cgroup
and a controller may come and go dynamically across the lifetime of
a cgroup. Till now, css's were created when the associated cgroup
was created and stayed till the cgroup got destroyed.
Assumptions around this tight coupling permeated through cgroup
core and controllers. These assumptions are gradually removed,
which consists bulk of patches, and css destruction path is
completely decoupled from cgroup destruction path. Note that
decoupling of creation path is relatively easy on top of these
changes and the patchset is pending for the next window.
- cgroup has its own event mechanism cgroup.event_control, which is
only used by memcg. It is overly complex trying to achieve high
flexibility whose benefits seem dubious at best. Going forward,
new events will simply generate file modified event and the
existing mechanism is being made specific to memcg. This pull
request contains prepatory patches for such change.
- Various fixes and cleanups"
Fixed up conflict in kernel/cgroup.c as per Tejun.
* 'for-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup: (69 commits)
cgroup: fix cgroup_css() invocation in css_from_id()
cgroup: make cgroup_write_event_control() use css_from_dir() instead of __d_cgrp()
cgroup: make cgroup_event hold onto cgroup_subsys_state instead of cgroup
cgroup: implement CFTYPE_NO_PREFIX
cgroup: make cgroup_css() take cgroup_subsys * instead and allow NULL subsys
cgroup: rename cgroup_css_from_dir() to css_from_dir() and update its syntax
cgroup: fix cgroup_write_event_control()
cgroup: fix subsystem file accesses on the root cgroup
cgroup: change cgroup_from_id() to css_from_id()
cgroup: use css_get() in cgroup_create() to check CSS_ROOT
cpuset: remove an unncessary forward declaration
cgroup: RCU protect each cgroup_subsys_state release
cgroup: move subsys file removal to kill_css()
cgroup: factor out kill_css()
cgroup: decouple cgroup_subsys_state destruction from cgroup destruction
cgroup: replace cgroup->css_kill_cnt with ->nr_css
cgroup: bounce cgroup_subsys_state ref kill confirmation to a work item
cgroup: move cgroup->subsys[] assignment to online_css()
cgroup: reorganize css init / exit paths
cgroup: add __rcu modifier to cgroup->subsys[]
...
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-cgroup.c | 49 | ||||
-rw-r--r-- | block/blk-cgroup.h | 38 | ||||
-rw-r--r-- | block/blk-throttle.c | 43 | ||||
-rw-r--r-- | block/cfq-iosched.c | 90 |
4 files changed, 105 insertions, 115 deletions
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index 290792a13e3c..e90c7c164c83 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c | |||
@@ -437,10 +437,10 @@ struct request_list *__blk_queue_next_rl(struct request_list *rl, | |||
437 | return &blkg->rl; | 437 | return &blkg->rl; |
438 | } | 438 | } |
439 | 439 | ||
440 | static int blkcg_reset_stats(struct cgroup *cgroup, struct cftype *cftype, | 440 | static int blkcg_reset_stats(struct cgroup_subsys_state *css, |
441 | u64 val) | 441 | struct cftype *cftype, u64 val) |
442 | { | 442 | { |
443 | struct blkcg *blkcg = cgroup_to_blkcg(cgroup); | 443 | struct blkcg *blkcg = css_to_blkcg(css); |
444 | struct blkcg_gq *blkg; | 444 | struct blkcg_gq *blkg; |
445 | int i; | 445 | int i; |
446 | 446 | ||
@@ -614,15 +614,13 @@ u64 blkg_stat_recursive_sum(struct blkg_policy_data *pd, int off) | |||
614 | { | 614 | { |
615 | struct blkcg_policy *pol = blkcg_policy[pd->plid]; | 615 | struct blkcg_policy *pol = blkcg_policy[pd->plid]; |
616 | struct blkcg_gq *pos_blkg; | 616 | struct blkcg_gq *pos_blkg; |
617 | struct cgroup *pos_cgrp; | 617 | struct cgroup_subsys_state *pos_css; |
618 | u64 sum; | 618 | u64 sum = 0; |
619 | 619 | ||
620 | lockdep_assert_held(pd->blkg->q->queue_lock); | 620 | lockdep_assert_held(pd->blkg->q->queue_lock); |
621 | 621 | ||
622 | sum = blkg_stat_read((void *)pd + off); | ||
623 | |||
624 | rcu_read_lock(); | 622 | rcu_read_lock(); |
625 | blkg_for_each_descendant_pre(pos_blkg, pos_cgrp, pd_to_blkg(pd)) { | 623 | blkg_for_each_descendant_pre(pos_blkg, pos_css, pd_to_blkg(pd)) { |
626 | struct blkg_policy_data *pos_pd = blkg_to_pd(pos_blkg, pol); | 624 | struct blkg_policy_data *pos_pd = blkg_to_pd(pos_blkg, pol); |
627 | struct blkg_stat *stat = (void *)pos_pd + off; | 625 | struct blkg_stat *stat = (void *)pos_pd + off; |
628 | 626 | ||
@@ -649,16 +647,14 @@ struct blkg_rwstat blkg_rwstat_recursive_sum(struct blkg_policy_data *pd, | |||
649 | { | 647 | { |
650 | struct blkcg_policy *pol = blkcg_policy[pd->plid]; | 648 | struct blkcg_policy *pol = blkcg_policy[pd->plid]; |
651 | struct blkcg_gq *pos_blkg; | 649 | struct blkcg_gq *pos_blkg; |
652 | struct cgroup *pos_cgrp; | 650 | struct cgroup_subsys_state *pos_css; |
653 | struct blkg_rwstat sum; | 651 | struct blkg_rwstat sum = { }; |
654 | int i; | 652 | int i; |
655 | 653 | ||
656 | lockdep_assert_held(pd->blkg->q->queue_lock); | 654 | lockdep_assert_held(pd->blkg->q->queue_lock); |
657 | 655 | ||
658 | sum = blkg_rwstat_read((void *)pd + off); | ||
659 | |||
660 | rcu_read_lock(); | 656 | rcu_read_lock(); |
661 | blkg_for_each_descendant_pre(pos_blkg, pos_cgrp, pd_to_blkg(pd)) { | 657 | blkg_for_each_descendant_pre(pos_blkg, pos_css, pd_to_blkg(pd)) { |
662 | struct blkg_policy_data *pos_pd = blkg_to_pd(pos_blkg, pol); | 658 | struct blkg_policy_data *pos_pd = blkg_to_pd(pos_blkg, pol); |
663 | struct blkg_rwstat *rwstat = (void *)pos_pd + off; | 659 | struct blkg_rwstat *rwstat = (void *)pos_pd + off; |
664 | struct blkg_rwstat tmp; | 660 | struct blkg_rwstat tmp; |
@@ -765,18 +761,18 @@ struct cftype blkcg_files[] = { | |||
765 | 761 | ||
766 | /** | 762 | /** |
767 | * blkcg_css_offline - cgroup css_offline callback | 763 | * blkcg_css_offline - cgroup css_offline callback |
768 | * @cgroup: cgroup of interest | 764 | * @css: css of interest |
769 | * | 765 | * |
770 | * This function is called when @cgroup is about to go away and responsible | 766 | * This function is called when @css is about to go away and responsible |
771 | * for shooting down all blkgs associated with @cgroup. blkgs should be | 767 | * for shooting down all blkgs associated with @css. blkgs should be |
772 | * removed while holding both q and blkcg locks. As blkcg lock is nested | 768 | * removed while holding both q and blkcg locks. As blkcg lock is nested |
773 | * inside q lock, this function performs reverse double lock dancing. | 769 | * inside q lock, this function performs reverse double lock dancing. |
774 | * | 770 | * |
775 | * This is the blkcg counterpart of ioc_release_fn(). | 771 | * This is the blkcg counterpart of ioc_release_fn(). |
776 | */ | 772 | */ |
777 | static void blkcg_css_offline(struct cgroup *cgroup) | 773 | static void blkcg_css_offline(struct cgroup_subsys_state *css) |
778 | { | 774 | { |
779 | struct blkcg *blkcg = cgroup_to_blkcg(cgroup); | 775 | struct blkcg *blkcg = css_to_blkcg(css); |
780 | 776 | ||
781 | spin_lock_irq(&blkcg->lock); | 777 | spin_lock_irq(&blkcg->lock); |
782 | 778 | ||
@@ -798,21 +794,21 @@ static void blkcg_css_offline(struct cgroup *cgroup) | |||
798 | spin_unlock_irq(&blkcg->lock); | 794 | spin_unlock_irq(&blkcg->lock); |
799 | } | 795 | } |
800 | 796 | ||
801 | static void blkcg_css_free(struct cgroup *cgroup) | 797 | static void blkcg_css_free(struct cgroup_subsys_state *css) |
802 | { | 798 | { |
803 | struct blkcg *blkcg = cgroup_to_blkcg(cgroup); | 799 | struct blkcg *blkcg = css_to_blkcg(css); |
804 | 800 | ||
805 | if (blkcg != &blkcg_root) | 801 | if (blkcg != &blkcg_root) |
806 | kfree(blkcg); | 802 | kfree(blkcg); |
807 | } | 803 | } |
808 | 804 | ||
809 | static struct cgroup_subsys_state *blkcg_css_alloc(struct cgroup *cgroup) | 805 | static struct cgroup_subsys_state * |
806 | blkcg_css_alloc(struct cgroup_subsys_state *parent_css) | ||
810 | { | 807 | { |
811 | static atomic64_t id_seq = ATOMIC64_INIT(0); | 808 | static atomic64_t id_seq = ATOMIC64_INIT(0); |
812 | struct blkcg *blkcg; | 809 | struct blkcg *blkcg; |
813 | struct cgroup *parent = cgroup->parent; | ||
814 | 810 | ||
815 | if (!parent) { | 811 | if (!parent_css) { |
816 | blkcg = &blkcg_root; | 812 | blkcg = &blkcg_root; |
817 | goto done; | 813 | goto done; |
818 | } | 814 | } |
@@ -883,14 +879,15 @@ void blkcg_exit_queue(struct request_queue *q) | |||
883 | * of the main cic data structures. For now we allow a task to change | 879 | * of the main cic data structures. For now we allow a task to change |
884 | * its cgroup only if it's the only owner of its ioc. | 880 | * its cgroup only if it's the only owner of its ioc. |
885 | */ | 881 | */ |
886 | static int blkcg_can_attach(struct cgroup *cgrp, struct cgroup_taskset *tset) | 882 | static int blkcg_can_attach(struct cgroup_subsys_state *css, |
883 | struct cgroup_taskset *tset) | ||
887 | { | 884 | { |
888 | struct task_struct *task; | 885 | struct task_struct *task; |
889 | struct io_context *ioc; | 886 | struct io_context *ioc; |
890 | int ret = 0; | 887 | int ret = 0; |
891 | 888 | ||
892 | /* task_lock() is needed to avoid races with exit_io_context() */ | 889 | /* task_lock() is needed to avoid races with exit_io_context() */ |
893 | cgroup_taskset_for_each(task, cgrp, tset) { | 890 | cgroup_taskset_for_each(task, css, tset) { |
894 | task_lock(task); | 891 | task_lock(task); |
895 | ioc = task->io_context; | 892 | ioc = task->io_context; |
896 | if (ioc && atomic_read(&ioc->nr_tasks) > 1) | 893 | if (ioc && atomic_read(&ioc->nr_tasks) > 1) |
@@ -1127,7 +1124,7 @@ void blkcg_policy_unregister(struct blkcg_policy *pol) | |||
1127 | 1124 | ||
1128 | /* kill the intf files first */ | 1125 | /* kill the intf files first */ |
1129 | if (pol->cftypes) | 1126 | if (pol->cftypes) |
1130 | cgroup_rm_cftypes(&blkio_subsys, pol->cftypes); | 1127 | cgroup_rm_cftypes(pol->cftypes); |
1131 | 1128 | ||
1132 | /* unregister and update blkgs */ | 1129 | /* unregister and update blkgs */ |
1133 | blkcg_policy[pol->plid] = NULL; | 1130 | blkcg_policy[pol->plid] = NULL; |
diff --git a/block/blk-cgroup.h b/block/blk-cgroup.h index 8056c03a3382..ae6969a7ffd4 100644 --- a/block/blk-cgroup.h +++ b/block/blk-cgroup.h | |||
@@ -179,22 +179,20 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol, | |||
179 | void blkg_conf_finish(struct blkg_conf_ctx *ctx); | 179 | void blkg_conf_finish(struct blkg_conf_ctx *ctx); |
180 | 180 | ||
181 | 181 | ||
182 | static inline struct blkcg *cgroup_to_blkcg(struct cgroup *cgroup) | 182 | static inline struct blkcg *css_to_blkcg(struct cgroup_subsys_state *css) |
183 | { | 183 | { |
184 | return container_of(cgroup_subsys_state(cgroup, blkio_subsys_id), | 184 | return css ? container_of(css, struct blkcg, css) : NULL; |
185 | struct blkcg, css); | ||
186 | } | 185 | } |
187 | 186 | ||
188 | static inline struct blkcg *task_blkcg(struct task_struct *tsk) | 187 | static inline struct blkcg *task_blkcg(struct task_struct *tsk) |
189 | { | 188 | { |
190 | return container_of(task_subsys_state(tsk, blkio_subsys_id), | 189 | return css_to_blkcg(task_css(tsk, blkio_subsys_id)); |
191 | struct blkcg, css); | ||
192 | } | 190 | } |
193 | 191 | ||
194 | static inline struct blkcg *bio_blkcg(struct bio *bio) | 192 | static inline struct blkcg *bio_blkcg(struct bio *bio) |
195 | { | 193 | { |
196 | if (bio && bio->bi_css) | 194 | if (bio && bio->bi_css) |
197 | return container_of(bio->bi_css, struct blkcg, css); | 195 | return css_to_blkcg(bio->bi_css); |
198 | return task_blkcg(current); | 196 | return task_blkcg(current); |
199 | } | 197 | } |
200 | 198 | ||
@@ -206,9 +204,7 @@ static inline struct blkcg *bio_blkcg(struct bio *bio) | |||
206 | */ | 204 | */ |
207 | static inline struct blkcg *blkcg_parent(struct blkcg *blkcg) | 205 | static inline struct blkcg *blkcg_parent(struct blkcg *blkcg) |
208 | { | 206 | { |
209 | struct cgroup *pcg = blkcg->css.cgroup->parent; | 207 | return css_to_blkcg(css_parent(&blkcg->css)); |
210 | |||
211 | return pcg ? cgroup_to_blkcg(pcg) : NULL; | ||
212 | } | 208 | } |
213 | 209 | ||
214 | /** | 210 | /** |
@@ -288,32 +284,33 @@ struct blkcg_gq *__blkg_lookup(struct blkcg *blkcg, struct request_queue *q, | |||
288 | /** | 284 | /** |
289 | * blkg_for_each_descendant_pre - pre-order walk of a blkg's descendants | 285 | * blkg_for_each_descendant_pre - pre-order walk of a blkg's descendants |
290 | * @d_blkg: loop cursor pointing to the current descendant | 286 | * @d_blkg: loop cursor pointing to the current descendant |
291 | * @pos_cgrp: used for iteration | 287 | * @pos_css: used for iteration |
292 | * @p_blkg: target blkg to walk descendants of | 288 | * @p_blkg: target blkg to walk descendants of |
293 | * | 289 | * |
294 | * Walk @c_blkg through the descendants of @p_blkg. Must be used with RCU | 290 | * Walk @c_blkg through the descendants of @p_blkg. Must be used with RCU |
295 | * read locked. If called under either blkcg or queue lock, the iteration | 291 | * read locked. If called under either blkcg or queue lock, the iteration |
296 | * is guaranteed to include all and only online blkgs. The caller may | 292 | * is guaranteed to include all and only online blkgs. The caller may |
297 | * update @pos_cgrp by calling cgroup_rightmost_descendant() to skip | 293 | * update @pos_css by calling css_rightmost_descendant() to skip subtree. |
298 | * subtree. | 294 | * @p_blkg is included in the iteration and the first node to be visited. |
299 | */ | 295 | */ |
300 | #define blkg_for_each_descendant_pre(d_blkg, pos_cgrp, p_blkg) \ | 296 | #define blkg_for_each_descendant_pre(d_blkg, pos_css, p_blkg) \ |
301 | cgroup_for_each_descendant_pre((pos_cgrp), (p_blkg)->blkcg->css.cgroup) \ | 297 | css_for_each_descendant_pre((pos_css), &(p_blkg)->blkcg->css) \ |
302 | if (((d_blkg) = __blkg_lookup(cgroup_to_blkcg(pos_cgrp), \ | 298 | if (((d_blkg) = __blkg_lookup(css_to_blkcg(pos_css), \ |
303 | (p_blkg)->q, false))) | 299 | (p_blkg)->q, false))) |
304 | 300 | ||
305 | /** | 301 | /** |
306 | * blkg_for_each_descendant_post - post-order walk of a blkg's descendants | 302 | * blkg_for_each_descendant_post - post-order walk of a blkg's descendants |
307 | * @d_blkg: loop cursor pointing to the current descendant | 303 | * @d_blkg: loop cursor pointing to the current descendant |
308 | * @pos_cgrp: used for iteration | 304 | * @pos_css: used for iteration |
309 | * @p_blkg: target blkg to walk descendants of | 305 | * @p_blkg: target blkg to walk descendants of |
310 | * | 306 | * |
311 | * Similar to blkg_for_each_descendant_pre() but performs post-order | 307 | * Similar to blkg_for_each_descendant_pre() but performs post-order |
312 | * traversal instead. Synchronization rules are the same. | 308 | * traversal instead. Synchronization rules are the same. @p_blkg is |
309 | * included in the iteration and the last node to be visited. | ||
313 | */ | 310 | */ |
314 | #define blkg_for_each_descendant_post(d_blkg, pos_cgrp, p_blkg) \ | 311 | #define blkg_for_each_descendant_post(d_blkg, pos_css, p_blkg) \ |
315 | cgroup_for_each_descendant_post((pos_cgrp), (p_blkg)->blkcg->css.cgroup) \ | 312 | css_for_each_descendant_post((pos_css), &(p_blkg)->blkcg->css) \ |
316 | if (((d_blkg) = __blkg_lookup(cgroup_to_blkcg(pos_cgrp), \ | 313 | if (((d_blkg) = __blkg_lookup(css_to_blkcg(pos_css), \ |
317 | (p_blkg)->q, false))) | 314 | (p_blkg)->q, false))) |
318 | 315 | ||
319 | /** | 316 | /** |
@@ -576,7 +573,6 @@ static inline int blkcg_activate_policy(struct request_queue *q, | |||
576 | static inline void blkcg_deactivate_policy(struct request_queue *q, | 573 | static inline void blkcg_deactivate_policy(struct request_queue *q, |
577 | const struct blkcg_policy *pol) { } | 574 | const struct blkcg_policy *pol) { } |
578 | 575 | ||
579 | static inline struct blkcg *cgroup_to_blkcg(struct cgroup *cgroup) { return NULL; } | ||
580 | static inline struct blkcg *bio_blkcg(struct bio *bio) { return NULL; } | 576 | static inline struct blkcg *bio_blkcg(struct bio *bio) { return NULL; } |
581 | 577 | ||
582 | static inline struct blkg_policy_data *blkg_to_pd(struct blkcg_gq *blkg, | 578 | static inline struct blkg_policy_data *blkg_to_pd(struct blkcg_gq *blkg, |
diff --git a/block/blk-throttle.c b/block/blk-throttle.c index 08a32dfd3844..8331aba9426f 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c | |||
@@ -1293,10 +1293,10 @@ static u64 tg_prfill_cpu_rwstat(struct seq_file *sf, | |||
1293 | return __blkg_prfill_rwstat(sf, pd, &rwstat); | 1293 | return __blkg_prfill_rwstat(sf, pd, &rwstat); |
1294 | } | 1294 | } |
1295 | 1295 | ||
1296 | static int tg_print_cpu_rwstat(struct cgroup *cgrp, struct cftype *cft, | 1296 | static int tg_print_cpu_rwstat(struct cgroup_subsys_state *css, |
1297 | struct seq_file *sf) | 1297 | struct cftype *cft, struct seq_file *sf) |
1298 | { | 1298 | { |
1299 | struct blkcg *blkcg = cgroup_to_blkcg(cgrp); | 1299 | struct blkcg *blkcg = css_to_blkcg(css); |
1300 | 1300 | ||
1301 | blkcg_print_blkgs(sf, blkcg, tg_prfill_cpu_rwstat, &blkcg_policy_throtl, | 1301 | blkcg_print_blkgs(sf, blkcg, tg_prfill_cpu_rwstat, &blkcg_policy_throtl, |
1302 | cft->private, true); | 1302 | cft->private, true); |
@@ -1325,31 +1325,31 @@ static u64 tg_prfill_conf_uint(struct seq_file *sf, struct blkg_policy_data *pd, | |||
1325 | return __blkg_prfill_u64(sf, pd, v); | 1325 | return __blkg_prfill_u64(sf, pd, v); |
1326 | } | 1326 | } |
1327 | 1327 | ||
1328 | static int tg_print_conf_u64(struct cgroup *cgrp, struct cftype *cft, | 1328 | static int tg_print_conf_u64(struct cgroup_subsys_state *css, |
1329 | struct seq_file *sf) | 1329 | struct cftype *cft, struct seq_file *sf) |
1330 | { | 1330 | { |
1331 | blkcg_print_blkgs(sf, cgroup_to_blkcg(cgrp), tg_prfill_conf_u64, | 1331 | blkcg_print_blkgs(sf, css_to_blkcg(css), tg_prfill_conf_u64, |
1332 | &blkcg_policy_throtl, cft->private, false); | 1332 | &blkcg_policy_throtl, cft->private, false); |
1333 | return 0; | 1333 | return 0; |
1334 | } | 1334 | } |
1335 | 1335 | ||
1336 | static int tg_print_conf_uint(struct cgroup *cgrp, struct cftype *cft, | 1336 | static int tg_print_conf_uint(struct cgroup_subsys_state *css, |
1337 | struct seq_file *sf) | 1337 | struct cftype *cft, struct seq_file *sf) |
1338 | { | 1338 | { |
1339 | blkcg_print_blkgs(sf, cgroup_to_blkcg(cgrp), tg_prfill_conf_uint, | 1339 | blkcg_print_blkgs(sf, css_to_blkcg(css), tg_prfill_conf_uint, |
1340 | &blkcg_policy_throtl, cft->private, false); | 1340 | &blkcg_policy_throtl, cft->private, false); |
1341 | return 0; | 1341 | return 0; |
1342 | } | 1342 | } |
1343 | 1343 | ||
1344 | static int tg_set_conf(struct cgroup *cgrp, struct cftype *cft, const char *buf, | 1344 | static int tg_set_conf(struct cgroup_subsys_state *css, struct cftype *cft, |
1345 | bool is_u64) | 1345 | const char *buf, bool is_u64) |
1346 | { | 1346 | { |
1347 | struct blkcg *blkcg = cgroup_to_blkcg(cgrp); | 1347 | struct blkcg *blkcg = css_to_blkcg(css); |
1348 | struct blkg_conf_ctx ctx; | 1348 | struct blkg_conf_ctx ctx; |
1349 | struct throtl_grp *tg; | 1349 | struct throtl_grp *tg; |
1350 | struct throtl_service_queue *sq; | 1350 | struct throtl_service_queue *sq; |
1351 | struct blkcg_gq *blkg; | 1351 | struct blkcg_gq *blkg; |
1352 | struct cgroup *pos_cgrp; | 1352 | struct cgroup_subsys_state *pos_css; |
1353 | int ret; | 1353 | int ret; |
1354 | 1354 | ||
1355 | ret = blkg_conf_prep(blkcg, &blkcg_policy_throtl, buf, &ctx); | 1355 | ret = blkg_conf_prep(blkcg, &blkcg_policy_throtl, buf, &ctx); |
@@ -1379,8 +1379,7 @@ static int tg_set_conf(struct cgroup *cgrp, struct cftype *cft, const char *buf, | |||
1379 | * restrictions in the whole hierarchy and allows them to bypass | 1379 | * restrictions in the whole hierarchy and allows them to bypass |
1380 | * blk-throttle. | 1380 | * blk-throttle. |
1381 | */ | 1381 | */ |
1382 | tg_update_has_rules(tg); | 1382 | blkg_for_each_descendant_pre(blkg, pos_css, ctx.blkg) |
1383 | blkg_for_each_descendant_pre(blkg, pos_cgrp, ctx.blkg) | ||
1384 | tg_update_has_rules(blkg_to_tg(blkg)); | 1383 | tg_update_has_rules(blkg_to_tg(blkg)); |
1385 | 1384 | ||
1386 | /* | 1385 | /* |
@@ -1403,16 +1402,16 @@ static int tg_set_conf(struct cgroup *cgrp, struct cftype *cft, const char *buf, | |||
1403 | return 0; | 1402 | return 0; |
1404 | } | 1403 | } |
1405 | 1404 | ||
1406 | static int tg_set_conf_u64(struct cgroup *cgrp, struct cftype *cft, | 1405 | static int tg_set_conf_u64(struct cgroup_subsys_state *css, struct cftype *cft, |
1407 | const char *buf) | 1406 | const char *buf) |
1408 | { | 1407 | { |
1409 | return tg_set_conf(cgrp, cft, buf, true); | 1408 | return tg_set_conf(css, cft, buf, true); |
1410 | } | 1409 | } |
1411 | 1410 | ||
1412 | static int tg_set_conf_uint(struct cgroup *cgrp, struct cftype *cft, | 1411 | static int tg_set_conf_uint(struct cgroup_subsys_state *css, struct cftype *cft, |
1413 | const char *buf) | 1412 | const char *buf) |
1414 | { | 1413 | { |
1415 | return tg_set_conf(cgrp, cft, buf, false); | 1414 | return tg_set_conf(css, cft, buf, false); |
1416 | } | 1415 | } |
1417 | 1416 | ||
1418 | static struct cftype throtl_files[] = { | 1417 | static struct cftype throtl_files[] = { |
@@ -1623,7 +1622,7 @@ void blk_throtl_drain(struct request_queue *q) | |||
1623 | { | 1622 | { |
1624 | struct throtl_data *td = q->td; | 1623 | struct throtl_data *td = q->td; |
1625 | struct blkcg_gq *blkg; | 1624 | struct blkcg_gq *blkg; |
1626 | struct cgroup *pos_cgrp; | 1625 | struct cgroup_subsys_state *pos_css; |
1627 | struct bio *bio; | 1626 | struct bio *bio; |
1628 | int rw; | 1627 | int rw; |
1629 | 1628 | ||
@@ -1636,11 +1635,9 @@ void blk_throtl_drain(struct request_queue *q) | |||
1636 | * better to walk service_queue tree directly but blkg walk is | 1635 | * better to walk service_queue tree directly but blkg walk is |
1637 | * easier. | 1636 | * easier. |
1638 | */ | 1637 | */ |
1639 | blkg_for_each_descendant_post(blkg, pos_cgrp, td->queue->root_blkg) | 1638 | blkg_for_each_descendant_post(blkg, pos_css, td->queue->root_blkg) |
1640 | tg_drain_bios(&blkg_to_tg(blkg)->service_queue); | 1639 | tg_drain_bios(&blkg_to_tg(blkg)->service_queue); |
1641 | 1640 | ||
1642 | tg_drain_bios(&td_root_tg(td)->service_queue); | ||
1643 | |||
1644 | /* finally, transfer bios from top-level tg's into the td */ | 1641 | /* finally, transfer bios from top-level tg's into the td */ |
1645 | tg_drain_bios(&td->service_queue); | 1642 | tg_drain_bios(&td->service_queue); |
1646 | 1643 | ||
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index d5bbdcfd0dab..dabb9d02cf9a 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -1607,12 +1607,11 @@ static u64 cfqg_prfill_weight_device(struct seq_file *sf, | |||
1607 | return __blkg_prfill_u64(sf, pd, cfqg->dev_weight); | 1607 | return __blkg_prfill_u64(sf, pd, cfqg->dev_weight); |
1608 | } | 1608 | } |
1609 | 1609 | ||
1610 | static int cfqg_print_weight_device(struct cgroup *cgrp, struct cftype *cft, | 1610 | static int cfqg_print_weight_device(struct cgroup_subsys_state *css, |
1611 | struct seq_file *sf) | 1611 | struct cftype *cft, struct seq_file *sf) |
1612 | { | 1612 | { |
1613 | blkcg_print_blkgs(sf, cgroup_to_blkcg(cgrp), | 1613 | blkcg_print_blkgs(sf, css_to_blkcg(css), cfqg_prfill_weight_device, |
1614 | cfqg_prfill_weight_device, &blkcg_policy_cfq, 0, | 1614 | &blkcg_policy_cfq, 0, false); |
1615 | false); | ||
1616 | return 0; | 1615 | return 0; |
1617 | } | 1616 | } |
1618 | 1617 | ||
@@ -1626,35 +1625,34 @@ static u64 cfqg_prfill_leaf_weight_device(struct seq_file *sf, | |||
1626 | return __blkg_prfill_u64(sf, pd, cfqg->dev_leaf_weight); | 1625 | return __blkg_prfill_u64(sf, pd, cfqg->dev_leaf_weight); |
1627 | } | 1626 | } |
1628 | 1627 | ||
1629 | static int cfqg_print_leaf_weight_device(struct cgroup *cgrp, | 1628 | static int cfqg_print_leaf_weight_device(struct cgroup_subsys_state *css, |
1630 | struct cftype *cft, | 1629 | struct cftype *cft, |
1631 | struct seq_file *sf) | 1630 | struct seq_file *sf) |
1632 | { | 1631 | { |
1633 | blkcg_print_blkgs(sf, cgroup_to_blkcg(cgrp), | 1632 | blkcg_print_blkgs(sf, css_to_blkcg(css), cfqg_prfill_leaf_weight_device, |
1634 | cfqg_prfill_leaf_weight_device, &blkcg_policy_cfq, 0, | 1633 | &blkcg_policy_cfq, 0, false); |
1635 | false); | ||
1636 | return 0; | 1634 | return 0; |
1637 | } | 1635 | } |
1638 | 1636 | ||
1639 | static int cfq_print_weight(struct cgroup *cgrp, struct cftype *cft, | 1637 | static int cfq_print_weight(struct cgroup_subsys_state *css, struct cftype *cft, |
1640 | struct seq_file *sf) | 1638 | struct seq_file *sf) |
1641 | { | 1639 | { |
1642 | seq_printf(sf, "%u\n", cgroup_to_blkcg(cgrp)->cfq_weight); | 1640 | seq_printf(sf, "%u\n", css_to_blkcg(css)->cfq_weight); |
1643 | return 0; | 1641 | return 0; |
1644 | } | 1642 | } |
1645 | 1643 | ||
1646 | static int cfq_print_leaf_weight(struct cgroup *cgrp, struct cftype *cft, | 1644 | static int cfq_print_leaf_weight(struct cgroup_subsys_state *css, |
1647 | struct seq_file *sf) | 1645 | struct cftype *cft, struct seq_file *sf) |
1648 | { | 1646 | { |
1649 | seq_printf(sf, "%u\n", | 1647 | seq_printf(sf, "%u\n", css_to_blkcg(css)->cfq_leaf_weight); |
1650 | cgroup_to_blkcg(cgrp)->cfq_leaf_weight); | ||
1651 | return 0; | 1648 | return 0; |
1652 | } | 1649 | } |
1653 | 1650 | ||
1654 | static int __cfqg_set_weight_device(struct cgroup *cgrp, struct cftype *cft, | 1651 | static int __cfqg_set_weight_device(struct cgroup_subsys_state *css, |
1655 | const char *buf, bool is_leaf_weight) | 1652 | struct cftype *cft, const char *buf, |
1653 | bool is_leaf_weight) | ||
1656 | { | 1654 | { |
1657 | struct blkcg *blkcg = cgroup_to_blkcg(cgrp); | 1655 | struct blkcg *blkcg = css_to_blkcg(css); |
1658 | struct blkg_conf_ctx ctx; | 1656 | struct blkg_conf_ctx ctx; |
1659 | struct cfq_group *cfqg; | 1657 | struct cfq_group *cfqg; |
1660 | int ret; | 1658 | int ret; |
@@ -1680,22 +1678,22 @@ static int __cfqg_set_weight_device(struct cgroup *cgrp, struct cftype *cft, | |||
1680 | return ret; | 1678 | return ret; |
1681 | } | 1679 | } |
1682 | 1680 | ||
1683 | static int cfqg_set_weight_device(struct cgroup *cgrp, struct cftype *cft, | 1681 | static int cfqg_set_weight_device(struct cgroup_subsys_state *css, |
1684 | const char *buf) | 1682 | struct cftype *cft, const char *buf) |
1685 | { | 1683 | { |
1686 | return __cfqg_set_weight_device(cgrp, cft, buf, false); | 1684 | return __cfqg_set_weight_device(css, cft, buf, false); |
1687 | } | 1685 | } |
1688 | 1686 | ||
1689 | static int cfqg_set_leaf_weight_device(struct cgroup *cgrp, struct cftype *cft, | 1687 | static int cfqg_set_leaf_weight_device(struct cgroup_subsys_state *css, |
1690 | const char *buf) | 1688 | struct cftype *cft, const char *buf) |
1691 | { | 1689 | { |
1692 | return __cfqg_set_weight_device(cgrp, cft, buf, true); | 1690 | return __cfqg_set_weight_device(css, cft, buf, true); |
1693 | } | 1691 | } |
1694 | 1692 | ||
1695 | static int __cfq_set_weight(struct cgroup *cgrp, struct cftype *cft, u64 val, | 1693 | static int __cfq_set_weight(struct cgroup_subsys_state *css, struct cftype *cft, |
1696 | bool is_leaf_weight) | 1694 | u64 val, bool is_leaf_weight) |
1697 | { | 1695 | { |
1698 | struct blkcg *blkcg = cgroup_to_blkcg(cgrp); | 1696 | struct blkcg *blkcg = css_to_blkcg(css); |
1699 | struct blkcg_gq *blkg; | 1697 | struct blkcg_gq *blkg; |
1700 | 1698 | ||
1701 | if (val < CFQ_WEIGHT_MIN || val > CFQ_WEIGHT_MAX) | 1699 | if (val < CFQ_WEIGHT_MIN || val > CFQ_WEIGHT_MAX) |
@@ -1727,30 +1725,32 @@ static int __cfq_set_weight(struct cgroup *cgrp, struct cftype *cft, u64 val, | |||
1727 | return 0; | 1725 | return 0; |
1728 | } | 1726 | } |
1729 | 1727 | ||
1730 | static int cfq_set_weight(struct cgroup *cgrp, struct cftype *cft, u64 val) | 1728 | static int cfq_set_weight(struct cgroup_subsys_state *css, struct cftype *cft, |
1729 | u64 val) | ||
1731 | { | 1730 | { |
1732 | return __cfq_set_weight(cgrp, cft, val, false); | 1731 | return __cfq_set_weight(css, cft, val, false); |
1733 | } | 1732 | } |
1734 | 1733 | ||
1735 | static int cfq_set_leaf_weight(struct cgroup *cgrp, struct cftype *cft, u64 val) | 1734 | static int cfq_set_leaf_weight(struct cgroup_subsys_state *css, |
1735 | struct cftype *cft, u64 val) | ||
1736 | { | 1736 | { |
1737 | return __cfq_set_weight(cgrp, cft, val, true); | 1737 | return __cfq_set_weight(css, cft, val, true); |
1738 | } | 1738 | } |
1739 | 1739 | ||
1740 | static int cfqg_print_stat(struct cgroup *cgrp, struct cftype *cft, | 1740 | static int cfqg_print_stat(struct cgroup_subsys_state *css, struct cftype *cft, |
1741 | struct seq_file *sf) | 1741 | struct seq_file *sf) |
1742 | { | 1742 | { |
1743 | struct blkcg *blkcg = cgroup_to_blkcg(cgrp); | 1743 | struct blkcg *blkcg = css_to_blkcg(css); |
1744 | 1744 | ||
1745 | blkcg_print_blkgs(sf, blkcg, blkg_prfill_stat, &blkcg_policy_cfq, | 1745 | blkcg_print_blkgs(sf, blkcg, blkg_prfill_stat, &blkcg_policy_cfq, |
1746 | cft->private, false); | 1746 | cft->private, false); |
1747 | return 0; | 1747 | return 0; |
1748 | } | 1748 | } |
1749 | 1749 | ||
1750 | static int cfqg_print_rwstat(struct cgroup *cgrp, struct cftype *cft, | 1750 | static int cfqg_print_rwstat(struct cgroup_subsys_state *css, |
1751 | struct seq_file *sf) | 1751 | struct cftype *cft, struct seq_file *sf) |
1752 | { | 1752 | { |
1753 | struct blkcg *blkcg = cgroup_to_blkcg(cgrp); | 1753 | struct blkcg *blkcg = css_to_blkcg(css); |
1754 | 1754 | ||
1755 | blkcg_print_blkgs(sf, blkcg, blkg_prfill_rwstat, &blkcg_policy_cfq, | 1755 | blkcg_print_blkgs(sf, blkcg, blkg_prfill_rwstat, &blkcg_policy_cfq, |
1756 | cft->private, true); | 1756 | cft->private, true); |
@@ -1773,20 +1773,20 @@ static u64 cfqg_prfill_rwstat_recursive(struct seq_file *sf, | |||
1773 | return __blkg_prfill_rwstat(sf, pd, &sum); | 1773 | return __blkg_prfill_rwstat(sf, pd, &sum); |
1774 | } | 1774 | } |
1775 | 1775 | ||
1776 | static int cfqg_print_stat_recursive(struct cgroup *cgrp, struct cftype *cft, | 1776 | static int cfqg_print_stat_recursive(struct cgroup_subsys_state *css, |
1777 | struct seq_file *sf) | 1777 | struct cftype *cft, struct seq_file *sf) |
1778 | { | 1778 | { |
1779 | struct blkcg *blkcg = cgroup_to_blkcg(cgrp); | 1779 | struct blkcg *blkcg = css_to_blkcg(css); |
1780 | 1780 | ||
1781 | blkcg_print_blkgs(sf, blkcg, cfqg_prfill_stat_recursive, | 1781 | blkcg_print_blkgs(sf, blkcg, cfqg_prfill_stat_recursive, |
1782 | &blkcg_policy_cfq, cft->private, false); | 1782 | &blkcg_policy_cfq, cft->private, false); |
1783 | return 0; | 1783 | return 0; |
1784 | } | 1784 | } |
1785 | 1785 | ||
1786 | static int cfqg_print_rwstat_recursive(struct cgroup *cgrp, struct cftype *cft, | 1786 | static int cfqg_print_rwstat_recursive(struct cgroup_subsys_state *css, |
1787 | struct seq_file *sf) | 1787 | struct cftype *cft, struct seq_file *sf) |
1788 | { | 1788 | { |
1789 | struct blkcg *blkcg = cgroup_to_blkcg(cgrp); | 1789 | struct blkcg *blkcg = css_to_blkcg(css); |
1790 | 1790 | ||
1791 | blkcg_print_blkgs(sf, blkcg, cfqg_prfill_rwstat_recursive, | 1791 | blkcg_print_blkgs(sf, blkcg, cfqg_prfill_rwstat_recursive, |
1792 | &blkcg_policy_cfq, cft->private, true); | 1792 | &blkcg_policy_cfq, cft->private, true); |
@@ -1810,10 +1810,10 @@ static u64 cfqg_prfill_avg_queue_size(struct seq_file *sf, | |||
1810 | } | 1810 | } |
1811 | 1811 | ||
1812 | /* print avg_queue_size */ | 1812 | /* print avg_queue_size */ |
1813 | static int cfqg_print_avg_queue_size(struct cgroup *cgrp, struct cftype *cft, | 1813 | static int cfqg_print_avg_queue_size(struct cgroup_subsys_state *css, |
1814 | struct seq_file *sf) | 1814 | struct cftype *cft, struct seq_file *sf) |
1815 | { | 1815 | { |
1816 | struct blkcg *blkcg = cgroup_to_blkcg(cgrp); | 1816 | struct blkcg *blkcg = css_to_blkcg(css); |
1817 | 1817 | ||
1818 | blkcg_print_blkgs(sf, blkcg, cfqg_prfill_avg_queue_size, | 1818 | blkcg_print_blkgs(sf, blkcg, cfqg_prfill_avg_queue_size, |
1819 | &blkcg_policy_cfq, 0, false); | 1819 | &blkcg_policy_cfq, 0, false); |