===================================================================
@@ -129,7 +129,7 @@ static inline u64 min_vdisktime(u64 min_
static void update_min_vdisktime(struct io_service_tree *st)
{
- u64 vdisktime;
+ u64 vdisktime = st->min_vdisktime;
if (st->active_entity)
vdisktime = st->active_entity->vdisktime;
@@ -486,7 +486,8 @@ static void dequeue_io_entity(struct io_
}
static void
-__enqueue_io_entity(struct io_service_tree *st, struct io_entity *entity)
+__enqueue_io_entity(struct io_service_tree *st, struct io_entity *entity,
+ int add_front)
{
struct rb_node **node = &st->active.rb_node;
struct rb_node *parent = NULL;
@@ -498,7 +499,8 @@ __enqueue_io_entity(struct io_service_tr
parent = *node;
entry = rb_entry(parent, struct io_entity, rb_node);
- if (key < entity_key(st, entry)) {
+ if (key < entity_key(st, entry) ||
+ (add_front && (key == entity_key(st, entry)))) {
node = &parent->rb_left;
} else {
node = &parent->rb_right;
@@ -528,7 +530,7 @@ static void enqueue_io_entity(struct io_
sd->nr_active++;
entity->on_st = 1;
place_entity(st, entity, 0);
- __enqueue_io_entity(st, entity);
+ __enqueue_io_entity(st, entity, 0);
debug_update_stats_enqueue(entity);
}
@@ -559,6 +561,7 @@ static struct io_entity *lookup_next_io_
__dequeue_io_entity(st, entity);
st->active_entity = entity;
sd->active_entity = entity;
+ update_min_vdisktime(entity->st);
break;
}
}
@@ -587,7 +590,7 @@ static void requeue_io_entity(struct io_
if (next_entity && next_entity != entity) {
__dequeue_io_entity(st, entity);
place_entity(st, entity, 1);
- __enqueue_io_entity(st, entity);
+ __enqueue_io_entity(st, entity, 1);
}
}
@@ -610,7 +613,7 @@ static void put_prev_io_entity(struct io
io_entity_update_prio(entity);
enqueue_io_entity(entity);
} else
- __enqueue_io_entity(st, entity);
+ __enqueue_io_entity(st, entity, 0);
}
/* Put curr ioq back into rb tree. */