static void fiops_merged_requests(struct request_queue *q, struct request *rq, struct request *next) { struct fiops_ioc *ioc = RQ_CIC(rq); struct fiops_data *fiopsd = q->elevator->elevator_data; fiops_remove_request(next); ioc = RQ_CIC(next); /* * all requests of this task are merged to other tasks, delete it * from the service tree. */ if (fiops_ioc_on_rr(ioc) && RB_EMPTY_ROOT(&ioc->sort_list)) fiops_del_ioc_rr(fiopsd, ioc); }
static void fiops_merged_request(struct request_queue *q, struct request *req, int type) { if (type == ELEVATOR_FRONT_MERGE) { struct fiops_ioc *ioc = RQ_CIC(req); fiops_reposition_rq_rb(ioc, req); } }
static void fiops_insert_request(struct request_queue *q, struct request *rq) { struct fiops_ioc *ioc = RQ_CIC(rq); fiops_init_prio_data(ioc); list_add_tail(&rq->queuelist, &ioc->fifo); fiops_add_rq_rb(rq); }
static void fiops_add_rq_rb(struct request *rq) { struct fiops_ioc *ioc = RQ_CIC(rq); struct fiops_data *fiopsd = ioc->fiopsd; elv_rb_add(&ioc->sort_list, rq); if (!fiops_ioc_on_rr(ioc)) fiops_add_ioc_rr(fiopsd, ioc); }
static void fiops_completed_request(struct request_queue *q, struct request *rq) { struct fiops_data *fiopsd = q->elevator->elevator_data; struct fiops_ioc *ioc = RQ_CIC(rq); fiopsd->in_flight[rq_is_sync(rq)]--; ioc->in_flight--; if (fiopsd->in_flight[0] + fiopsd->in_flight[1] == 0) fiops_schedule_dispatch(fiopsd); }
static int fiops_allow_merge(struct request_queue *q, struct request *rq, struct bio *bio) { struct fiops_data *fiopsd = q->elevator->elevator_data; struct fiops_ioc *cic; /* * Lookup the ioc that this bio will be queued with. Allow * merge only if rq is queued there. */ cic = fiops_cic_lookup(fiopsd, current->io_context); return cic == RQ_CIC(rq); }
/* * rb tree support functions */ static void fiops_del_rq_rb(struct request *rq) { struct fiops_ioc *ioc = RQ_CIC(rq); elv_rb_del(&ioc->sort_list, rq); }