diff options
author | Tejun Heo <tj@kernel.org> | 2013-01-09 11:05:12 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2013-01-09 11:05:12 -0500 |
commit | f427d909648aa592c9588d0f66b5b457752a0cd1 (patch) | |
tree | d6f91a6d46a1302f0cca6137851f0806364b7965 /block/blk-cgroup.c | |
parent | b276a876a014c5fa58a16f247c0933f6c42112e3 (diff) |
blkcg: implement blkcg_policy->on/offline_pd_fn() and blkcg_gq->online
Add two blkcg_policy methods, ->online_pd_fn() and ->offline_pd_fn(),
which are invoked as the policy_data gets activated and deactivated
while holding both blkcg and q locks.
Also, add blkcg_gq->online bool, which is set and cleared as the
blkcg_gq gets activated and deactivated. This flag also is toggled
while holding both blkcg and q locks.
These will be used to implement hierarchical stats.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
Diffstat (limited to 'block/blk-cgroup.c')
-rw-r--r-- | block/blk-cgroup.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index 3a8de321d1f6..4d625d28e070 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c | |||
@@ -182,7 +182,7 @@ static struct blkcg_gq *blkg_create(struct blkcg *blkcg, | |||
182 | struct blkcg_gq *new_blkg) | 182 | struct blkcg_gq *new_blkg) |
183 | { | 183 | { |
184 | struct blkcg_gq *blkg; | 184 | struct blkcg_gq *blkg; |
185 | int ret; | 185 | int i, ret; |
186 | 186 | ||
187 | WARN_ON_ONCE(!rcu_read_lock_held()); | 187 | WARN_ON_ONCE(!rcu_read_lock_held()); |
188 | lockdep_assert_held(q->queue_lock); | 188 | lockdep_assert_held(q->queue_lock); |
@@ -218,7 +218,15 @@ static struct blkcg_gq *blkg_create(struct blkcg *blkcg, | |||
218 | if (likely(!ret)) { | 218 | if (likely(!ret)) { |
219 | hlist_add_head_rcu(&blkg->blkcg_node, &blkcg->blkg_list); | 219 | hlist_add_head_rcu(&blkg->blkcg_node, &blkcg->blkg_list); |
220 | list_add(&blkg->q_node, &q->blkg_list); | 220 | list_add(&blkg->q_node, &q->blkg_list); |
221 | |||
222 | for (i = 0; i < BLKCG_MAX_POLS; i++) { | ||
223 | struct blkcg_policy *pol = blkcg_policy[i]; | ||
224 | |||
225 | if (blkg->pd[i] && pol->pd_online_fn) | ||
226 | pol->pd_online_fn(blkg); | ||
227 | } | ||
221 | } | 228 | } |
229 | blkg->online = true; | ||
222 | spin_unlock(&blkcg->lock); | 230 | spin_unlock(&blkcg->lock); |
223 | 231 | ||
224 | if (!ret) | 232 | if (!ret) |
@@ -291,6 +299,7 @@ EXPORT_SYMBOL_GPL(blkg_lookup_create); | |||
291 | static void blkg_destroy(struct blkcg_gq *blkg) | 299 | static void blkg_destroy(struct blkcg_gq *blkg) |
292 | { | 300 | { |
293 | struct blkcg *blkcg = blkg->blkcg; | 301 | struct blkcg *blkcg = blkg->blkcg; |
302 | int i; | ||
294 | 303 | ||
295 | lockdep_assert_held(blkg->q->queue_lock); | 304 | lockdep_assert_held(blkg->q->queue_lock); |
296 | lockdep_assert_held(&blkcg->lock); | 305 | lockdep_assert_held(&blkcg->lock); |
@@ -299,6 +308,14 @@ static void blkg_destroy(struct blkcg_gq *blkg) | |||
299 | WARN_ON_ONCE(list_empty(&blkg->q_node)); | 308 | WARN_ON_ONCE(list_empty(&blkg->q_node)); |
300 | WARN_ON_ONCE(hlist_unhashed(&blkg->blkcg_node)); | 309 | WARN_ON_ONCE(hlist_unhashed(&blkg->blkcg_node)); |
301 | 310 | ||
311 | for (i = 0; i < BLKCG_MAX_POLS; i++) { | ||
312 | struct blkcg_policy *pol = blkcg_policy[i]; | ||
313 | |||
314 | if (blkg->pd[i] && pol->pd_offline_fn) | ||
315 | pol->pd_offline_fn(blkg); | ||
316 | } | ||
317 | blkg->online = false; | ||
318 | |||
302 | radix_tree_delete(&blkcg->blkg_tree, blkg->q->id); | 319 | radix_tree_delete(&blkcg->blkg_tree, blkg->q->id); |
303 | list_del_init(&blkg->q_node); | 320 | list_del_init(&blkg->q_node); |
304 | hlist_del_init_rcu(&blkg->blkcg_node); | 321 | hlist_del_init_rcu(&blkg->blkcg_node); |
@@ -956,6 +973,8 @@ void blkcg_deactivate_policy(struct request_queue *q, | |||
956 | /* grab blkcg lock too while removing @pd from @blkg */ | 973 | /* grab blkcg lock too while removing @pd from @blkg */ |
957 | spin_lock(&blkg->blkcg->lock); | 974 | spin_lock(&blkg->blkcg->lock); |
958 | 975 | ||
976 | if (pol->pd_offline_fn) | ||
977 | pol->pd_offline_fn(blkg); | ||
959 | if (pol->pd_exit_fn) | 978 | if (pol->pd_exit_fn) |
960 | pol->pd_exit_fn(blkg); | 979 | pol->pd_exit_fn(blkg); |
961 | 980 | ||