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); }
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; } }
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; } }
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); }