diff options
author | Tejun Heo <tj@kernel.org> | 2012-03-05 16:15:28 -0500 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2012-03-06 15:27:24 -0500 |
commit | 4f85cb96d9d2fbbb7160db855a6beee1baced5e5 (patch) | |
tree | 5472bba04490da05fa6ca8f780431b37bd7375cb /block/cfq-iosched.c | |
parent | 852c788f8365062c8a383c5a93f7f7289977cb50 (diff) |
block: make block cgroup policies follow bio task association
Implement bio_blkio_cgroup() which returns the blkcg associated with
the bio if exists or %current's blkcg, and use it in blk-throttle and
cfq-iosched propio. This makes both cgroup policies honor task
association for the bio instead of always assuming %current.
As nobody is using bio_set_task() yet, this doesn't introduce any
behavior change.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/cfq-iosched.c')
-rw-r--r-- | block/cfq-iosched.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index abac87337d70..f2387b50f82e 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -467,8 +467,9 @@ static inline int cfqg_busy_async_queues(struct cfq_data *cfqd, | |||
467 | } | 467 | } |
468 | 468 | ||
469 | static void cfq_dispatch_insert(struct request_queue *, struct request *); | 469 | static void cfq_dispatch_insert(struct request_queue *, struct request *); |
470 | static struct cfq_queue *cfq_get_queue(struct cfq_data *, bool, | 470 | static struct cfq_queue *cfq_get_queue(struct cfq_data *cfqd, bool is_sync, |
471 | struct io_context *, gfp_t); | 471 | struct io_context *ioc, struct bio *bio, |
472 | gfp_t gfp_mask); | ||
472 | 473 | ||
473 | static inline struct cfq_io_cq *icq_to_cic(struct io_cq *icq) | 474 | static inline struct cfq_io_cq *icq_to_cic(struct io_cq *icq) |
474 | { | 475 | { |
@@ -2601,7 +2602,7 @@ static void cfq_init_prio_data(struct cfq_queue *cfqq, struct io_context *ioc) | |||
2601 | cfq_clear_cfqq_prio_changed(cfqq); | 2602 | cfq_clear_cfqq_prio_changed(cfqq); |
2602 | } | 2603 | } |
2603 | 2604 | ||
2604 | static void changed_ioprio(struct cfq_io_cq *cic) | 2605 | static void changed_ioprio(struct cfq_io_cq *cic, struct bio *bio) |
2605 | { | 2606 | { |
2606 | struct cfq_data *cfqd = cic_to_cfqd(cic); | 2607 | struct cfq_data *cfqd = cic_to_cfqd(cic); |
2607 | struct cfq_queue *cfqq; | 2608 | struct cfq_queue *cfqq; |
@@ -2613,7 +2614,7 @@ static void changed_ioprio(struct cfq_io_cq *cic) | |||
2613 | if (cfqq) { | 2614 | if (cfqq) { |
2614 | struct cfq_queue *new_cfqq; | 2615 | struct cfq_queue *new_cfqq; |
2615 | new_cfqq = cfq_get_queue(cfqd, BLK_RW_ASYNC, cic->icq.ioc, | 2616 | new_cfqq = cfq_get_queue(cfqd, BLK_RW_ASYNC, cic->icq.ioc, |
2616 | GFP_ATOMIC); | 2617 | bio, GFP_ATOMIC); |
2617 | if (new_cfqq) { | 2618 | if (new_cfqq) { |
2618 | cic->cfqq[BLK_RW_ASYNC] = new_cfqq; | 2619 | cic->cfqq[BLK_RW_ASYNC] = new_cfqq; |
2619 | cfq_put_queue(cfqq); | 2620 | cfq_put_queue(cfqq); |
@@ -2671,7 +2672,7 @@ static void changed_cgroup(struct cfq_io_cq *cic) | |||
2671 | 2672 | ||
2672 | static struct cfq_queue * | 2673 | static struct cfq_queue * |
2673 | cfq_find_alloc_queue(struct cfq_data *cfqd, bool is_sync, | 2674 | cfq_find_alloc_queue(struct cfq_data *cfqd, bool is_sync, |
2674 | struct io_context *ioc, gfp_t gfp_mask) | 2675 | struct io_context *ioc, struct bio *bio, gfp_t gfp_mask) |
2675 | { | 2676 | { |
2676 | struct blkio_cgroup *blkcg; | 2677 | struct blkio_cgroup *blkcg; |
2677 | struct cfq_queue *cfqq, *new_cfqq = NULL; | 2678 | struct cfq_queue *cfqq, *new_cfqq = NULL; |
@@ -2681,7 +2682,7 @@ cfq_find_alloc_queue(struct cfq_data *cfqd, bool is_sync, | |||
2681 | retry: | 2682 | retry: |
2682 | rcu_read_lock(); | 2683 | rcu_read_lock(); |
2683 | 2684 | ||
2684 | blkcg = task_blkio_cgroup(current); | 2685 | blkcg = bio_blkio_cgroup(bio); |
2685 | 2686 | ||
2686 | cfqg = cfq_lookup_create_cfqg(cfqd, blkcg); | 2687 | cfqg = cfq_lookup_create_cfqg(cfqd, blkcg); |
2687 | 2688 | ||
@@ -2746,7 +2747,7 @@ cfq_async_queue_prio(struct cfq_data *cfqd, int ioprio_class, int ioprio) | |||
2746 | 2747 | ||
2747 | static struct cfq_queue * | 2748 | static struct cfq_queue * |
2748 | cfq_get_queue(struct cfq_data *cfqd, bool is_sync, struct io_context *ioc, | 2749 | cfq_get_queue(struct cfq_data *cfqd, bool is_sync, struct io_context *ioc, |
2749 | gfp_t gfp_mask) | 2750 | struct bio *bio, gfp_t gfp_mask) |
2750 | { | 2751 | { |
2751 | const int ioprio = task_ioprio(ioc); | 2752 | const int ioprio = task_ioprio(ioc); |
2752 | const int ioprio_class = task_ioprio_class(ioc); | 2753 | const int ioprio_class = task_ioprio_class(ioc); |
@@ -2759,7 +2760,7 @@ cfq_get_queue(struct cfq_data *cfqd, bool is_sync, struct io_context *ioc, | |||
2759 | } | 2760 | } |
2760 | 2761 | ||
2761 | if (!cfqq) | 2762 | if (!cfqq) |
2762 | cfqq = cfq_find_alloc_queue(cfqd, is_sync, ioc, gfp_mask); | 2763 | cfqq = cfq_find_alloc_queue(cfqd, is_sync, ioc, bio, gfp_mask); |
2763 | 2764 | ||
2764 | /* | 2765 | /* |
2765 | * pin the queue now that it's allocated, scheduler exit will prune it | 2766 | * pin the queue now that it's allocated, scheduler exit will prune it |
@@ -3316,7 +3317,7 @@ cfq_set_request(struct request_queue *q, struct request *rq, struct bio *bio, | |||
3316 | /* handle changed notifications */ | 3317 | /* handle changed notifications */ |
3317 | changed = icq_get_changed(&cic->icq); | 3318 | changed = icq_get_changed(&cic->icq); |
3318 | if (unlikely(changed & ICQ_IOPRIO_CHANGED)) | 3319 | if (unlikely(changed & ICQ_IOPRIO_CHANGED)) |
3319 | changed_ioprio(cic); | 3320 | changed_ioprio(cic, bio); |
3320 | #ifdef CONFIG_CFQ_GROUP_IOSCHED | 3321 | #ifdef CONFIG_CFQ_GROUP_IOSCHED |
3321 | if (unlikely(changed & ICQ_CGROUP_CHANGED)) | 3322 | if (unlikely(changed & ICQ_CGROUP_CHANGED)) |
3322 | changed_cgroup(cic); | 3323 | changed_cgroup(cic); |
@@ -3325,7 +3326,7 @@ cfq_set_request(struct request_queue *q, struct request *rq, struct bio *bio, | |||
3325 | new_queue: | 3326 | new_queue: |
3326 | cfqq = cic_to_cfqq(cic, is_sync); | 3327 | cfqq = cic_to_cfqq(cic, is_sync); |
3327 | if (!cfqq || cfqq == &cfqd->oom_cfqq) { | 3328 | if (!cfqq || cfqq == &cfqd->oom_cfqq) { |
3328 | cfqq = cfq_get_queue(cfqd, is_sync, cic->icq.ioc, gfp_mask); | 3329 | cfqq = cfq_get_queue(cfqd, is_sync, cic->icq.ioc, bio, gfp_mask); |
3329 | cic_set_cfqq(cic, cfqq, is_sync); | 3330 | cic_set_cfqq(cic, cfqq, is_sync); |
3330 | } else { | 3331 | } else { |
3331 | /* | 3332 | /* |