Patchwork [v5,3/3] block: Adding ROW scheduling algorithm

This patch adds the implementation of a new scheduling algorithm - ROW.
The policy of this algorithm is to prioritize READ requests over WRITE
as much as possible without starving the WRITE requests.
The requests are kept in queues according to their priority. The dispatch
is done in a Round Robin manner with a different slice for each queue.
READ request queues get bigger dispatch quantum than the write requests.

The ROW I/O scheduler implements I/O priorities (CLASS_RT, CLASS_BE, CLASS_IDLE).
Dissimilar to CFQ, CLASS_BE requests won’t be starved by CLASS_RT, and
CLASS_IDLE requests won’t be starved by CLASS_RT/CLASS_BE requests.
A tolerance limit is managed to prevent starvation.

For READ request queues ROW IO scheduler allows idling within a
dispatch quantum in order to give the application a chance to insert
more requests. The idling is enabled if the ROW IO scheduler identifies
the application is inserting requests in a high frequency.

ROW scheduler supports additional services for block devices that
supports Urgent Requests. That is, the scheduler may inform the
device driver upon urgent requests using a newly defined callback.
In addition it supports rescheduling of requests that were
interrupted.

Signed-off-by: Tatyana Brokhman <tlinder@codeaurora.org>