From: Vivek Goyal <vgoyal@redhat.com>
To: Justin TerAvest <teravest@google.com>
Cc: jaxboe@fusionio.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/2] cfq-iosched: Don't set active queue in preempt
Date: Tue, 22 Mar 2011 16:59:05 -0400 [thread overview]
Message-ID: <20110322205905.GM3757@redhat.com> (raw)
In-Reply-To: <1300825050-11371-2-git-send-email-teravest@google.com>
On Tue, Mar 22, 2011 at 01:17:29PM -0700, Justin TerAvest wrote:
> Commit "Add unaccounted time to timeslice_used" changed the behavior of
> cfq_preempt_queue to set cfqq active. Vivek pointed out that other
> preemption rules might get involved, so we shouldn't manually set which
> queue is active.
>
> This cleans up the code to just clear the queue stats at preemption
> time.
>
> Signed-off-by: Justin TerAvest <teravest@google.com>
> ---
> block/cfq-iosched.c | 39 +++++++++++++++++++++++----------------
> 1 files changed, 23 insertions(+), 16 deletions(-)
>
> diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
> index 12e380b..69208d7 100644
> --- a/block/cfq-iosched.c
> +++ b/block/cfq-iosched.c
> @@ -1620,27 +1620,33 @@ static inline void cfq_del_timer(struct cfq_data *cfqd, struct cfq_queue *cfqq)
> cfq_blkiocg_update_idle_time_stats(&cfqq->cfqg->blkg);
> }
>
> +static void cfq_clear_queue_stats(struct cfq_data *cfqd,
> + struct cfq_queue *cfqq)
> +{
> + cfq_blkiocg_update_avg_queue_size_stats(&cfqq->cfqg->blkg);
> + cfqq->slice_start = 0;
> + cfqq->dispatch_start = jiffies;
> + cfqq->allocated_slice = 0;
> + cfqq->slice_end = 0;
> + cfqq->slice_dispatch = 0;
> + cfqq->nr_sectors = 0;
> +
> + cfq_clear_cfqq_wait_request(cfqq);
> + cfq_clear_cfqq_must_dispatch(cfqq);
> + cfq_clear_cfqq_must_alloc_slice(cfqq);
> + cfq_clear_cfqq_fifo_expire(cfqq);
> + cfq_mark_cfqq_slice_new(cfqq);
> +
> + cfq_del_timer(cfqd, cfqq);
> +}
> +
> static void __cfq_set_active_queue(struct cfq_data *cfqd,
> struct cfq_queue *cfqq)
> {
> if (cfqq) {
> cfq_log_cfqq(cfqd, cfqq, "set_active wl_prio:%d wl_type:%d",
> cfqd->serving_prio, cfqd->serving_type);
> - cfq_blkiocg_update_avg_queue_size_stats(&cfqq->cfqg->blkg);
> - cfqq->slice_start = 0;
> - cfqq->dispatch_start = jiffies;
> - cfqq->allocated_slice = 0;
> - cfqq->slice_end = 0;
> - cfqq->slice_dispatch = 0;
> - cfqq->nr_sectors = 0;
> -
> - cfq_clear_cfqq_wait_request(cfqq);
> - cfq_clear_cfqq_must_dispatch(cfqq);
> - cfq_clear_cfqq_must_alloc_slice(cfqq);
> - cfq_clear_cfqq_fifo_expire(cfqq);
> - cfq_mark_cfqq_slice_new(cfqq);
> -
> - cfq_del_timer(cfqd, cfqq);
> + cfq_clear_queue_stats(cfqd, cfqq);
> }
>
> cfqd->active_queue = cfqq;
> @@ -3332,7 +3338,8 @@ static void cfq_preempt_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq)
> BUG_ON(!cfq_cfqq_on_rr(cfqq));
>
> cfq_service_tree_add(cfqd, cfqq, 1);
> - __cfq_set_active_queue(cfqd, cfqq);
> +
> + cfq_clear_queue_stats(cfqd, cfqq);
Hi Justin,
Why do we have to clear queue stats here for the preempting queue?
Especially look at cfqq->dispatch_start = jiffies. We have not started
the dispatch yet. When this queue is selected next, then we will start
the dispatch.
So this patch has introduced another bug now. Now after preemption if
we don't select this group, then we have a queue with wrong dispatch
start and that will result in huge slice_used for the queue and
it will not get its fair share.
Thanks
Vivek
next prev parent reply other threads:[~2011-03-22 20:59 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-22 20:17 [PATCH 0/2] cfq: Fixes for unaccounted_time variable Justin TerAvest
2011-03-22 20:17 ` [PATCH 1/2] cfq-iosched: Don't set active queue in preempt Justin TerAvest
2011-03-22 20:59 ` Vivek Goyal [this message]
2011-03-22 21:58 ` Justin TerAvest
2011-03-22 22:06 ` Vivek Goyal
2011-03-22 20:17 ` [PATCH 2/2] blk-cgroup: Only give unaccounted_time under debug Justin TerAvest
2011-03-22 20:27 ` [PATCH 0/2] cfq: Fixes for unaccounted_time variable Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110322205905.GM3757@redhat.com \
--to=vgoyal@redhat.com \
--cc=jaxboe@fusionio.com \
--cc=linux-kernel@vger.kernel.org \
--cc=teravest@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox