lkml.org 
[lkml]   [2009]   [Nov]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 20/20] blkio: Drop the reference to queue once the task changes cgroup
    Date
    o If a task changes cgroup, drop reference to the cfqq associated with io
    context so that upon next request arrival we will allocate a new queue in
    new group.

    Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
    ---
    block/cfq-iosched.c | 39 +++++++++++++++++++++++++++++++++++++++
    1 files changed, 39 insertions(+), 0 deletions(-)

    diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
    index d609a10..f23d713 100644
    --- a/block/cfq-iosched.c
    +++ b/block/cfq-iosched.c
    @@ -2330,6 +2330,41 @@ static void cfq_link_cfqq_cfqg(struct cfq_queue *cfqq, struct cfq_group *cfqg)
    cfq_get_cfqg_ref(cfqg);
    }

    +#ifdef CONFIG_CFQ_GROUP_IOSCHED
    +static void changed_cgroup(struct io_context *ioc, struct cfq_io_context *cic)
    +{
    + struct cfq_queue *sync_cfqq = cic_to_cfqq(cic, 1);
    + struct cfq_data *cfqd = cic->key;
    + unsigned long flags;
    + struct request_queue *q;
    +
    + if (unlikely(!cfqd))
    + return;
    +
    + q = cfqd->queue;
    +
    + spin_lock_irqsave(q->queue_lock, flags);
    +
    + if (sync_cfqq) {
    + /*
    + * Drop reference to sync queue. A new sync queue will be
    + * assigned in new group upon arrival of a fresh request.
    + */
    + cfq_log_cfqq(cfqd, sync_cfqq, "changed cgroup");
    + cic_set_cfqq(cic, NULL, 1);
    + cfq_put_queue(sync_cfqq);
    + }
    +
    + spin_unlock_irqrestore(q->queue_lock, flags);
    +}
    +
    +static void cfq_ioc_set_cgroup(struct io_context *ioc)
    +{
    + call_for_each_cic(ioc, changed_cgroup);
    + ioc->cgroup_changed = 0;
    +}
    +#endif /* CONFIG_CFQ_GROUP_IOSCHED */
    +
    static struct cfq_queue *
    cfq_find_alloc_queue(struct cfq_data *cfqd, bool is_sync,
    struct io_context *ioc, gfp_t gfp_mask)
    @@ -2562,6 +2597,10 @@ out:
    if (unlikely(ioc->ioprio_changed))
    cfq_ioc_set_ioprio(ioc);

    +#ifdef CONFIG_CFQ_GROUP_IOSCHED
    + if (unlikely(ioc->cgroup_changed))
    + cfq_ioc_set_cgroup(ioc);
    +#endif
    return cic;
    err_free:
    cfq_cic_free(cic);
    --
    1.6.2.5


    \
     
     \ /
      Last update: 2009-11-04 00:51    [W:4.154 / U:0.168 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site