static void fiops_charge_vios(struct fiops_data *fiopsd, struct fiops_ioc *ioc, u64 vios) { struct fiops_rb_root *service_tree = ioc->service_tree; ioc->vios += vios; if (RB_EMPTY_ROOT(&ioc->sort_list)) fiops_del_ioc_rr(fiopsd, ioc); else fiops_resort_rr_list(fiopsd, ioc); fiops_update_min_vios(service_tree); }
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 int fiops_forced_dispatch(struct fiops_data *fiopsd) { struct fiops_ioc *ioc; int dispatched = 0; int i; for (i = RT_WORKLOAD; i >= IDLE_WORKLOAD; i--) { while (!RB_EMPTY_ROOT(&fiopsd->service_tree[i].rb)) { ioc = fiops_rb_first(&fiopsd->service_tree[i]); while (!list_empty(&ioc->fifo)) { fiops_dispatch_request(fiopsd, ioc); dispatched++; } if (fiops_ioc_on_rr(ioc)) fiops_del_ioc_rr(fiopsd, ioc); } } return dispatched; }