block, bfq: add Early Queue Merge (EQM) to BFQ-v7r2 for
 3.4.0

A set of processes may happen  to  perform interleaved reads, i.e.,
requests
whose union would give rise to a  sequential read  pattern.  There are
two
typical  cases: in the first  case,   processes  read  fixed-size chunks
of
data at a fixed distance from each other, while in the second case
processes
may read variable-size chunks at  variable distances. The latter case
occurs
for  example with  KVM, which  splits the  I/O generated  by the  guest
into
multiple chunks,  and lets these chunks  be served by a  pool of
cooperating
processes,  iteratively  assigning  the  next  chunk of  I/O  to  the
first
available  process. CFQ  uses actual  queue merging  for the  first type
of
rocesses, whereas it  uses preemption to get a sequential  read pattern
out
of the read requests  performed by the second type of  processes. In the
end
it uses  two different  mechanisms to  achieve the  same goal: boosting
the
throughput with interleaved I/O.

This patch introduces  Early Queue Merge (EQM), a unified mechanism to
get a
sequential  read pattern  with both  types of  processes. The  main idea
is
checking newly arrived requests against the next request of the active
queue
both in case of actual request insert and in case of request merge. By
doing
so, both the types of processes can be handled by just merging their
queues.
EQM is  then simpler and  more compact than the  pair of mechanisms used
in
CFQ.

Finally, EQM  also preserves the  typical low-latency properties of BFQ,
by
properly restoring the weight-raising state of  a queue when it gets
back to
a non-merged state.

Signed-off-by: Mauro Andreolini <mauro.andreolini@unimore.it>
Signed-off-by: Arianna Avanzini <avanzini.arianna@gmail.com>
Reviewed-by: Paolo Valente <paolo.valente@unimore.it>