diff options
| author | Tejun Heo <tj@kernel.org> | 2012-04-01 17:38:44 -0400 |
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2012-04-01 17:38:44 -0400 |
| commit | 3381cb8d2ef1523dbaeec99161d766c25f1e52d6 (patch) | |
| tree | b5592ee2a0f84e694282c947611971eb7735622d | |
| parent | 8a3d26151f24e2a2ffa550890144c3d54d2edb15 (diff) | |
blkcg: move blkio_group_conf->weight to cfq
blkio_group_conf->weight is owned by cfq and has no reason to be
defined in blkcg core. Replace it with cfq_group->dev_weight and let
conf setting functions directly set it. If dev_weight is zero, the
cfqg doesn't have device specific weight configured.
Also, rename BLKIO_WEIGHT_* constants to CFQ_WEIGHT_* and rename
blkio_cgroup->weight to blkio_cgroup->cfq_weight. We eventually want
per-policy storage in blkio_cgroup but just mark the ownership of the
field for now.
Signed-off-by: Tejun Heo <tj@kernel.org>
| -rw-r--r-- | block/blk-cgroup.c | 4 | ||||
| -rw-r--r-- | block/blk-cgroup.h | 14 | ||||
| -rw-r--r-- | block/cfq-iosched.c | 77 |
3 files changed, 45 insertions, 50 deletions
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index 16f6ee65a593..c0e239b8455e 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c | |||
| @@ -30,7 +30,7 @@ static LIST_HEAD(blkio_list); | |||
| 30 | static DEFINE_MUTEX(all_q_mutex); | 30 | static DEFINE_MUTEX(all_q_mutex); |
| 31 | static LIST_HEAD(all_q_list); | 31 | static LIST_HEAD(all_q_list); |
| 32 | 32 | ||
| 33 | struct blkio_cgroup blkio_root_cgroup = { .weight = 2*BLKIO_WEIGHT_DEFAULT }; | 33 | struct blkio_cgroup blkio_root_cgroup = { .cfq_weight = 2 * CFQ_WEIGHT_DEFAULT }; |
| 34 | EXPORT_SYMBOL_GPL(blkio_root_cgroup); | 34 | EXPORT_SYMBOL_GPL(blkio_root_cgroup); |
| 35 | 35 | ||
| 36 | static struct blkio_policy_type *blkio_policy[BLKIO_NR_POLICIES]; | 36 | static struct blkio_policy_type *blkio_policy[BLKIO_NR_POLICIES]; |
| @@ -611,7 +611,7 @@ static struct cgroup_subsys_state *blkiocg_create(struct cgroup *cgroup) | |||
| 611 | if (!blkcg) | 611 | if (!blkcg) |
| 612 | return ERR_PTR(-ENOMEM); | 612 | return ERR_PTR(-ENOMEM); |
| 613 | 613 | ||
| 614 | blkcg->weight = BLKIO_WEIGHT_DEFAULT; | 614 | blkcg->cfq_weight = CFQ_WEIGHT_DEFAULT; |
| 615 | blkcg->id = atomic64_inc_return(&id_seq); /* root is 0, start from 1 */ | 615 | blkcg->id = atomic64_inc_return(&id_seq); /* root is 0, start from 1 */ |
| 616 | done: | 616 | done: |
| 617 | spin_lock_init(&blkcg->lock); | 617 | spin_lock_init(&blkcg->lock); |
diff --git a/block/blk-cgroup.h b/block/blk-cgroup.h index e368dd00b8cf..386db2974a08 100644 --- a/block/blk-cgroup.h +++ b/block/blk-cgroup.h | |||
| @@ -29,6 +29,11 @@ enum blkio_policy_id { | |||
| 29 | 29 | ||
| 30 | #ifdef CONFIG_BLK_CGROUP | 30 | #ifdef CONFIG_BLK_CGROUP |
| 31 | 31 | ||
| 32 | /* CFQ specific, out here for blkcg->cfq_weight */ | ||
| 33 | #define CFQ_WEIGHT_MIN 10 | ||
| 34 | #define CFQ_WEIGHT_MAX 1000 | ||
| 35 | #define CFQ_WEIGHT_DEFAULT 500 | ||
| 36 | |||
| 32 | /* cft->private [un]packing for stat printing */ | 37 | /* cft->private [un]packing for stat printing */ |
| 33 | #define BLKCG_STAT_PRIV(pol, off) (((unsigned)(pol) << 16) | (off)) | 38 | #define BLKCG_STAT_PRIV(pol, off) (((unsigned)(pol) << 16) | (off)) |
| 34 | #define BLKCG_STAT_POL(prv) ((unsigned)(prv) >> 16) | 39 | #define BLKCG_STAT_POL(prv) ((unsigned)(prv) >> 16) |
| @@ -46,12 +51,14 @@ enum blkg_rwstat_type { | |||
| 46 | 51 | ||
| 47 | struct blkio_cgroup { | 52 | struct blkio_cgroup { |
| 48 | struct cgroup_subsys_state css; | 53 | struct cgroup_subsys_state css; |
| 49 | unsigned int weight; | ||
| 50 | spinlock_t lock; | 54 | spinlock_t lock; |
| 51 | struct hlist_head blkg_list; | 55 | struct hlist_head blkg_list; |
| 52 | 56 | ||
| 53 | /* for policies to test whether associated blkcg has changed */ | 57 | /* for policies to test whether associated blkcg has changed */ |
| 54 | uint64_t id; | 58 | uint64_t id; |
| 59 | |||
| 60 | /* TODO: per-policy storage in blkio_cgroup */ | ||
| 61 | unsigned int cfq_weight; /* belongs to cfq */ | ||
| 55 | }; | 62 | }; |
| 56 | 63 | ||
| 57 | struct blkg_stat { | 64 | struct blkg_stat { |
| @@ -65,7 +72,6 @@ struct blkg_rwstat { | |||
| 65 | }; | 72 | }; |
| 66 | 73 | ||
| 67 | struct blkio_group_conf { | 74 | struct blkio_group_conf { |
| 68 | unsigned int weight; | ||
| 69 | u64 iops[2]; | 75 | u64 iops[2]; |
| 70 | u64 bps[2]; | 76 | u64 bps[2]; |
| 71 | }; | 77 | }; |
| @@ -355,10 +361,6 @@ static inline void blkg_put(struct blkio_group *blkg) { } | |||
| 355 | 361 | ||
| 356 | #endif | 362 | #endif |
| 357 | 363 | ||
| 358 | #define BLKIO_WEIGHT_MIN 10 | ||
| 359 | #define BLKIO_WEIGHT_MAX 1000 | ||
| 360 | #define BLKIO_WEIGHT_DEFAULT 500 | ||
| 361 | |||
| 362 | #ifdef CONFIG_BLK_CGROUP | 364 | #ifdef CONFIG_BLK_CGROUP |
| 363 | extern struct blkio_cgroup blkio_root_cgroup; | 365 | extern struct blkio_cgroup blkio_root_cgroup; |
| 364 | extern struct blkio_cgroup *cgroup_to_blkio_cgroup(struct cgroup *cgroup); | 366 | extern struct blkio_cgroup *cgroup_to_blkio_cgroup(struct cgroup *cgroup); |
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index a1f37dfd1b8b..adab10de6eea 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
| @@ -224,7 +224,7 @@ struct cfq_group { | |||
| 224 | u64 vdisktime; | 224 | u64 vdisktime; |
| 225 | unsigned int weight; | 225 | unsigned int weight; |
| 226 | unsigned int new_weight; | 226 | unsigned int new_weight; |
| 227 | bool needs_update; | 227 | unsigned int dev_weight; |
| 228 | 228 | ||
| 229 | /* number of cfqq currently on this group */ | 229 | /* number of cfqq currently on this group */ |
| 230 | int nr_cfqq; | 230 | int nr_cfqq; |
| @@ -838,7 +838,7 @@ static inline u64 cfq_scale_slice(unsigned long delta, struct cfq_group *cfqg) | |||
| 838 | { | 838 | { |
| 839 | u64 d = delta << CFQ_SERVICE_SHIFT; | 839 | u64 d = delta << CFQ_SERVICE_SHIFT; |
| 840 | 840 | ||
| 841 | d = d * BLKIO_WEIGHT_DEFAULT; | 841 | d = d * CFQ_WEIGHT_DEFAULT; |
| 842 | do_div(d, cfqg->weight); | 842 | do_div(d, cfqg->weight); |
| 843 | return d; | 843 | return d; |
| 844 | } | 844 | } |
| @@ -1165,9 +1165,9 @@ static void | |||
| 1165 | cfq_update_group_weight(struct cfq_group *cfqg) | 1165 | cfq_update_group_weight(struct cfq_group *cfqg) |
| 1166 | { | 1166 | { |
| 1167 | BUG_ON(!RB_EMPTY_NODE(&cfqg->rb_node)); | 1167 | BUG_ON(!RB_EMPTY_NODE(&cfqg->rb_node)); |
| 1168 | if (cfqg->needs_update) { | 1168 | if (cfqg->new_weight) { |
| 1169 | cfqg->weight = cfqg->new_weight; | 1169 | cfqg->weight = cfqg->new_weight; |
| 1170 | cfqg->needs_update = false; | 1170 | cfqg->new_weight = 0; |
| 1171 | } | 1171 | } |
| 1172 | } | 1172 | } |
| 1173 | 1173 | ||
| @@ -1325,21 +1325,12 @@ static void cfq_init_cfqg_base(struct cfq_group *cfqg) | |||
| 1325 | } | 1325 | } |
| 1326 | 1326 | ||
| 1327 | #ifdef CONFIG_CFQ_GROUP_IOSCHED | 1327 | #ifdef CONFIG_CFQ_GROUP_IOSCHED |
| 1328 | static void cfq_update_blkio_group_weight(struct blkio_group *blkg, | ||
| 1329 | unsigned int weight) | ||
| 1330 | { | ||
| 1331 | struct cfq_group *cfqg = blkg_to_cfqg(blkg); | ||
| 1332 | |||
| 1333 | cfqg->new_weight = weight; | ||
| 1334 | cfqg->needs_update = true; | ||
| 1335 | } | ||
| 1336 | |||
| 1337 | static void cfq_init_blkio_group(struct blkio_group *blkg) | 1328 | static void cfq_init_blkio_group(struct blkio_group *blkg) |
| 1338 | { | 1329 | { |
| 1339 | struct cfq_group *cfqg = blkg_to_cfqg(blkg); | 1330 | struct cfq_group *cfqg = blkg_to_cfqg(blkg); |
| 1340 | 1331 | ||
| 1341 | cfq_init_cfqg_base(cfqg); | 1332 | cfq_init_cfqg_base(cfqg); |
| 1342 | cfqg->weight = blkg->blkcg->weight; | 1333 | cfqg->weight = blkg->blkcg->cfq_weight; |
| 1343 | } | 1334 | } |
| 1344 | 1335 | ||
| 1345 | /* | 1336 | /* |
| @@ -1377,36 +1368,38 @@ static void cfq_link_cfqq_cfqg(struct cfq_queue *cfqq, struct cfq_group *cfqg) | |||
| 1377 | cfqg_get(cfqg); | 1368 | cfqg_get(cfqg); |
| 1378 | } | 1369 | } |
| 1379 | 1370 | ||
| 1380 | static u64 blkg_prfill_weight_device(struct seq_file *sf, | 1371 | static u64 cfqg_prfill_weight_device(struct seq_file *sf, |
| 1381 | struct blkg_policy_data *pd, int off) | 1372 | struct blkg_policy_data *pd, int off) |
| 1382 | { | 1373 | { |
| 1383 | if (!pd->conf.weight) | 1374 | struct cfq_group *cfqg = (void *)pd->pdata; |
| 1375 | |||
| 1376 | if (!cfqg->dev_weight) | ||
| 1384 | return 0; | 1377 | return 0; |
| 1385 | return __blkg_prfill_u64(sf, pd, pd->conf.weight); | 1378 | return __blkg_prfill_u64(sf, pd, cfqg->dev_weight); |
| 1386 | } | 1379 | } |
| 1387 | 1380 | ||
| 1388 | static int blkcg_print_weight_device(struct cgroup *cgrp, struct cftype *cft, | 1381 | static int cfqg_print_weight_device(struct cgroup *cgrp, struct cftype *cft, |
| 1389 | struct seq_file *sf) | 1382 | struct seq_file *sf) |
| 1390 | { | 1383 | { |
| 1391 | blkcg_print_blkgs(sf, cgroup_to_blkio_cgroup(cgrp), | 1384 | blkcg_print_blkgs(sf, cgroup_to_blkio_cgroup(cgrp), |
| 1392 | blkg_prfill_weight_device, BLKIO_POLICY_PROP, 0, | 1385 | cfqg_prfill_weight_device, BLKIO_POLICY_PROP, 0, |
| 1393 | false); | 1386 | false); |
| 1394 | return 0; | 1387 | return 0; |
| 1395 | } | 1388 | } |
| 1396 | 1389 | ||
| 1397 | static int blkcg_print_weight(struct cgroup *cgrp, struct cftype *cft, | 1390 | static int cfq_print_weight(struct cgroup *cgrp, struct cftype *cft, |
| 1398 | struct seq_file *sf) | 1391 | struct seq_file *sf) |
| 1399 | { | 1392 | { |
| 1400 | seq_printf(sf, "%u\n", cgroup_to_blkio_cgroup(cgrp)->weight); | 1393 | seq_printf(sf, "%u\n", cgroup_to_blkio_cgroup(cgrp)->cfq_weight); |
| 1401 | return 0; | 1394 | return 0; |
| 1402 | } | 1395 | } |
| 1403 | 1396 | ||
| 1404 | static int blkcg_set_weight_device(struct cgroup *cgrp, struct cftype *cft, | 1397 | static int cfqg_set_weight_device(struct cgroup *cgrp, struct cftype *cft, |
| 1405 | const char *buf) | 1398 | const char *buf) |
| 1406 | { | 1399 | { |
| 1407 | struct blkio_cgroup *blkcg = cgroup_to_blkio_cgroup(cgrp); | 1400 | struct blkio_cgroup *blkcg = cgroup_to_blkio_cgroup(cgrp); |
| 1408 | struct blkg_policy_data *pd; | ||
| 1409 | struct blkg_conf_ctx ctx; | 1401 | struct blkg_conf_ctx ctx; |
| 1402 | struct cfq_group *cfqg; | ||
| 1410 | int ret; | 1403 | int ret; |
| 1411 | 1404 | ||
| 1412 | ret = blkg_conf_prep(blkcg, buf, &ctx); | 1405 | ret = blkg_conf_prep(blkcg, buf, &ctx); |
| @@ -1414,11 +1407,11 @@ static int blkcg_set_weight_device(struct cgroup *cgrp, struct cftype *cft, | |||
| 1414 | return ret; | 1407 | return ret; |
| 1415 | 1408 | ||
| 1416 | ret = -EINVAL; | 1409 | ret = -EINVAL; |
| 1417 | pd = ctx.blkg->pd[BLKIO_POLICY_PROP]; | 1410 | cfqg = blkg_to_cfqg(ctx.blkg); |
| 1418 | if (pd && (!ctx.v || (ctx.v >= BLKIO_WEIGHT_MIN && | 1411 | if (cfqg && (!ctx.v || (ctx.v >= CFQ_WEIGHT_MIN && |
| 1419 | ctx.v <= BLKIO_WEIGHT_MAX))) { | 1412 | ctx.v <= CFQ_WEIGHT_MAX))) { |
| 1420 | pd->conf.weight = ctx.v; | 1413 | cfqg->dev_weight = ctx.v; |
| 1421 | cfq_update_blkio_group_weight(ctx.blkg, ctx.v ?: blkcg->weight); | 1414 | cfqg->new_weight = cfqg->dev_weight ?: blkcg->cfq_weight; |
| 1422 | ret = 0; | 1415 | ret = 0; |
| 1423 | } | 1416 | } |
| 1424 | 1417 | ||
| @@ -1426,23 +1419,23 @@ static int blkcg_set_weight_device(struct cgroup *cgrp, struct cftype *cft, | |||
| 1426 | return ret; | 1419 | return ret; |
| 1427 | } | 1420 | } |
| 1428 | 1421 | ||
| 1429 | static int blkcg_set_weight(struct cgroup *cgrp, struct cftype *cft, u64 val) | 1422 | static int cfq_set_weight(struct cgroup *cgrp, struct cftype *cft, u64 val) |
| 1430 | { | 1423 | { |
| 1431 | struct blkio_cgroup *blkcg = cgroup_to_blkio_cgroup(cgrp); | 1424 | struct blkio_cgroup *blkcg = cgroup_to_blkio_cgroup(cgrp); |
| 1432 | struct blkio_group *blkg; | 1425 | struct blkio_group *blkg; |
| 1433 | struct hlist_node *n; | 1426 | struct hlist_node *n; |
| 1434 | 1427 | ||
| 1435 | if (val < BLKIO_WEIGHT_MIN || val > BLKIO_WEIGHT_MAX) | 1428 | if (val < CFQ_WEIGHT_MIN || val > CFQ_WEIGHT_MAX) |
| 1436 | return -EINVAL; | 1429 | return -EINVAL; |
| 1437 | 1430 | ||
| 1438 | spin_lock_irq(&blkcg->lock); | 1431 | spin_lock_irq(&blkcg->lock); |
| 1439 | blkcg->weight = (unsigned int)val; | 1432 | blkcg->cfq_weight = (unsigned int)val; |
| 1440 | 1433 | ||
| 1441 | hlist_for_each_entry(blkg, n, &blkcg->blkg_list, blkcg_node) { | 1434 | hlist_for_each_entry(blkg, n, &blkcg->blkg_list, blkcg_node) { |
| 1442 | struct blkg_policy_data *pd = blkg->pd[BLKIO_POLICY_PROP]; | 1435 | struct cfq_group *cfqg = blkg_to_cfqg(blkg); |
| 1443 | 1436 | ||
| 1444 | if (pd && !pd->conf.weight) | 1437 | if (cfqg && !cfqg->dev_weight) |
| 1445 | cfq_update_blkio_group_weight(blkg, blkcg->weight); | 1438 | cfqg->new_weight = blkcg->cfq_weight; |
| 1446 | } | 1439 | } |
| 1447 | 1440 | ||
| 1448 | spin_unlock_irq(&blkcg->lock); | 1441 | spin_unlock_irq(&blkcg->lock); |
| @@ -1480,14 +1473,14 @@ static int cfqg_print_avg_queue_size(struct cgroup *cgrp, struct cftype *cft, | |||
| 1480 | static struct cftype cfq_blkcg_files[] = { | 1473 | static struct cftype cfq_blkcg_files[] = { |
| 1481 | { | 1474 | { |
| 1482 | .name = "weight_device", | 1475 | .name = "weight_device", |
| 1483 | .read_seq_string = blkcg_print_weight_device, | 1476 | .read_seq_string = cfqg_print_weight_device, |
| 1484 | .write_string = blkcg_set_weight_device, | 1477 | .write_string = cfqg_set_weight_device, |
| 1485 | .max_write_len = 256, | 1478 | .max_write_len = 256, |
| 1486 | }, | 1479 | }, |
| 1487 | { | 1480 | { |
| 1488 | .name = "weight", | 1481 | .name = "weight", |
| 1489 | .read_seq_string = blkcg_print_weight, | 1482 | .read_seq_string = cfq_print_weight, |
| 1490 | .write_u64 = blkcg_set_weight, | 1483 | .write_u64 = cfq_set_weight, |
| 1491 | }, | 1484 | }, |
| 1492 | { | 1485 | { |
| 1493 | .name = "time", | 1486 | .name = "time", |
| @@ -3983,7 +3976,7 @@ static int cfq_init_queue(struct request_queue *q) | |||
| 3983 | return -ENOMEM; | 3976 | return -ENOMEM; |
| 3984 | } | 3977 | } |
| 3985 | 3978 | ||
| 3986 | cfqd->root_group->weight = 2*BLKIO_WEIGHT_DEFAULT; | 3979 | cfqd->root_group->weight = 2 * CFQ_WEIGHT_DEFAULT; |
| 3987 | 3980 | ||
| 3988 | /* | 3981 | /* |
| 3989 | * Not strictly needed (since RB_ROOT just clears the node and we | 3982 | * Not strictly needed (since RB_ROOT just clears the node and we |
