CFQ: move think time check variables to a separate struct
Move the variables to do think time check to a sepatate struct. This is to prepare adding think time check for service tree and group. No functional change. Signed-off-by: Shaohua Li <shaohua.li@intel.com> Acked-by: Vivek Goyal <vgoyal@redhat.com> Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
This commit is contained in:
parent
4aede84b33
commit
383cd7213f
2 changed files with 33 additions and 21 deletions
|
@ -2008,10 +2008,10 @@ static void cfq_arm_slice_timer(struct cfq_data *cfqd)
|
||||||
* slice, then don't idle. This avoids overrunning the allotted
|
* slice, then don't idle. This avoids overrunning the allotted
|
||||||
* time slice.
|
* time slice.
|
||||||
*/
|
*/
|
||||||
if (sample_valid(cic->ttime_samples) &&
|
if (sample_valid(cic->ttime.ttime_samples) &&
|
||||||
(cfqq->slice_end - jiffies < cic->ttime_mean)) {
|
(cfqq->slice_end - jiffies < cic->ttime.ttime_mean)) {
|
||||||
cfq_log_cfqq(cfqd, cfqq, "Not idling. think_time:%lu",
|
cfq_log_cfqq(cfqd, cfqq, "Not idling. think_time:%lu",
|
||||||
cic->ttime_mean);
|
cic->ttime.ttime_mean);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2819,7 +2819,7 @@ cfq_alloc_io_context(struct cfq_data *cfqd, gfp_t gfp_mask)
|
||||||
cic = kmem_cache_alloc_node(cfq_ioc_pool, gfp_mask | __GFP_ZERO,
|
cic = kmem_cache_alloc_node(cfq_ioc_pool, gfp_mask | __GFP_ZERO,
|
||||||
cfqd->queue->node);
|
cfqd->queue->node);
|
||||||
if (cic) {
|
if (cic) {
|
||||||
cic->last_end_request = jiffies;
|
cic->ttime.last_end_request = jiffies;
|
||||||
INIT_LIST_HEAD(&cic->queue_list);
|
INIT_LIST_HEAD(&cic->queue_list);
|
||||||
INIT_HLIST_NODE(&cic->cic_list);
|
INIT_HLIST_NODE(&cic->cic_list);
|
||||||
cic->dtor = cfq_free_io_context;
|
cic->dtor = cfq_free_io_context;
|
||||||
|
@ -3206,14 +3206,22 @@ err:
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cfq_update_io_thinktime(struct cfq_data *cfqd, struct cfq_io_context *cic)
|
__cfq_update_io_thinktime(struct cfq_ttime *ttime, unsigned long slice_idle)
|
||||||
{
|
{
|
||||||
unsigned long elapsed = jiffies - cic->last_end_request;
|
unsigned long elapsed = jiffies - ttime->last_end_request;
|
||||||
unsigned long ttime = min(elapsed, 2UL * cfqd->cfq_slice_idle);
|
elapsed = min(elapsed, 2UL * slice_idle);
|
||||||
|
|
||||||
cic->ttime_samples = (7*cic->ttime_samples + 256) / 8;
|
ttime->ttime_samples = (7*ttime->ttime_samples + 256) / 8;
|
||||||
cic->ttime_total = (7*cic->ttime_total + 256*ttime) / 8;
|
ttime->ttime_total = (7*ttime->ttime_total + 256*elapsed) / 8;
|
||||||
cic->ttime_mean = (cic->ttime_total + 128) / cic->ttime_samples;
|
ttime->ttime_mean = (ttime->ttime_total + 128) / ttime->ttime_samples;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cfq_update_io_thinktime(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
||||||
|
struct cfq_io_context *cic)
|
||||||
|
{
|
||||||
|
if (cfq_cfqq_sync(cfqq))
|
||||||
|
__cfq_update_io_thinktime(&cic->ttime, cfqd->cfq_slice_idle);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -3262,8 +3270,8 @@ cfq_update_idle_window(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
||||||
else if (!atomic_read(&cic->ioc->nr_tasks) || !cfqd->cfq_slice_idle ||
|
else if (!atomic_read(&cic->ioc->nr_tasks) || !cfqd->cfq_slice_idle ||
|
||||||
(!cfq_cfqq_deep(cfqq) && CFQQ_SEEKY(cfqq)))
|
(!cfq_cfqq_deep(cfqq) && CFQQ_SEEKY(cfqq)))
|
||||||
enable_idle = 0;
|
enable_idle = 0;
|
||||||
else if (sample_valid(cic->ttime_samples)) {
|
else if (sample_valid(cic->ttime.ttime_samples)) {
|
||||||
if (cic->ttime_mean > cfqd->cfq_slice_idle)
|
if (cic->ttime.ttime_mean > cfqd->cfq_slice_idle)
|
||||||
enable_idle = 0;
|
enable_idle = 0;
|
||||||
else
|
else
|
||||||
enable_idle = 1;
|
enable_idle = 1;
|
||||||
|
@ -3389,7 +3397,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
||||||
|
|
||||||
cfqd->rq_queued++;
|
cfqd->rq_queued++;
|
||||||
|
|
||||||
cfq_update_io_thinktime(cfqd, cic);
|
cfq_update_io_thinktime(cfqd, cfqq, cic);
|
||||||
cfq_update_io_seektime(cfqd, cfqq, rq);
|
cfq_update_io_seektime(cfqd, cfqq, rq);
|
||||||
cfq_update_idle_window(cfqd, cfqq, cic);
|
cfq_update_idle_window(cfqd, cfqq, cic);
|
||||||
|
|
||||||
|
@ -3500,8 +3508,8 @@ static bool cfq_should_wait_busy(struct cfq_data *cfqd, struct cfq_queue *cfqq)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
/* if slice left is less than think time, wait busy */
|
/* if slice left is less than think time, wait busy */
|
||||||
if (cic && sample_valid(cic->ttime_samples)
|
if (cic && sample_valid(cic->ttime.ttime_samples)
|
||||||
&& (cfqq->slice_end - jiffies < cic->ttime_mean))
|
&& (cfqq->slice_end - jiffies < cic->ttime.ttime_mean))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3542,7 +3550,7 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
|
||||||
cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]--;
|
cfqd->rq_in_flight[cfq_cfqq_sync(cfqq)]--;
|
||||||
|
|
||||||
if (sync) {
|
if (sync) {
|
||||||
RQ_CIC(rq)->last_end_request = now;
|
RQ_CIC(rq)->ttime.last_end_request = now;
|
||||||
if (!time_after(rq->start_time + cfqd->cfq_fifo_expire[1], now))
|
if (!time_after(rq->start_time + cfqd->cfq_fifo_expire[1], now))
|
||||||
cfqd->last_delayed_sync = now;
|
cfqd->last_delayed_sync = now;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,14 @@
|
||||||
#include <linux/rcupdate.h>
|
#include <linux/rcupdate.h>
|
||||||
|
|
||||||
struct cfq_queue;
|
struct cfq_queue;
|
||||||
|
struct cfq_ttime {
|
||||||
|
unsigned long last_end_request;
|
||||||
|
|
||||||
|
unsigned long ttime_total;
|
||||||
|
unsigned long ttime_samples;
|
||||||
|
unsigned long ttime_mean;
|
||||||
|
};
|
||||||
|
|
||||||
struct cfq_io_context {
|
struct cfq_io_context {
|
||||||
void *key;
|
void *key;
|
||||||
|
|
||||||
|
@ -12,11 +20,7 @@ struct cfq_io_context {
|
||||||
|
|
||||||
struct io_context *ioc;
|
struct io_context *ioc;
|
||||||
|
|
||||||
unsigned long last_end_request;
|
struct cfq_ttime ttime;
|
||||||
|
|
||||||
unsigned long ttime_total;
|
|
||||||
unsigned long ttime_samples;
|
|
||||||
unsigned long ttime_mean;
|
|
||||||
|
|
||||||
struct list_head queue_list;
|
struct list_head queue_list;
|
||||||
struct hlist_node cic_list;
|
struct hlist_node cic_list;
|
||||||
|
|
Loading…
Add table
Reference in a new issue