void ElvDeadline::ElvMergedRequest(request *rq, int type)
{
	if (type == ELEVATOR_FRONT_MERGE) {
		elv_rb_del(RQ_RB_ROOT(rq), rq);
		deadline_add_rq_rb(rq);
	}

	Elevator::ElvMergedRequest(rq, type);
}
void ElvDeadline::deadline_del_rq_rb(request *rq)
{
	if (next_rq[rq->cmd] == rq) {
		rb_node *next = Rbtree::rb_next(&rq->rbnode);

		next_rq[rq->cmd] = NULL;
		if (next)
			next_rq[rq->cmd] = rb_entry_rq(next);
	}

	elv_rb_del(RQ_RB_ROOT(rq), rq);
}
Esempio n. 3
0
static void
deadline_add_rq_rb(struct deadline_data *dd, struct request *rq)
{
    struct rb_root *root = RQ_RB_ROOT(dd, rq);
    struct request *__alias;

retry:
    __alias = elv_rb_add(root, rq);
    if (unlikely(__alias)) {
        deadline_move_request(dd, __alias);
        goto retry;
    }
}
Esempio n. 4
0
static void deadline_merged_request(request_queue_t *q, struct request *req,
                                    int type)
{
    struct deadline_data *dd = q->elevator->elevator_data;

    /*
     * if the merge was a front merge, we need to reposition request
     */
    if (type == ELEVATOR_FRONT_MERGE) {
        elv_rb_del(RQ_RB_ROOT(dd, req), req);
        deadline_add_rq_rb(dd, req);
    }
}
void ElvDeadline::deadline_add_rq_rb(request *rq)
{
	Rbtree *tree = RQ_RB_ROOT(rq);
	request *__alias;

retry:
	__alias = elv_rb_add(tree, rq);
	if (__alias) {
		/* TODO: move to dispatch queue */
		assert(0);
		deadline_move_request(__alias);
		goto retry;
	}
}
Esempio n. 6
0
static inline void
deadline_del_rq_rb(struct deadline_data *dd, struct request *rq)
{
    const int data_dir = rq_data_dir(rq);

    if (dd->next_rq[data_dir] == rq) {
        struct rb_node *rbnext = rb_next(&rq->rb_node);

        dd->next_rq[data_dir] = NULL;
        if (rbnext)
            dd->next_rq[data_dir] = rb_entry_rq(rbnext);
    }

    elv_rb_del(RQ_RB_ROOT(dd, rq), rq);
}