block, bfq: add Early Queue Merge (EQM) to BFQ-v7r4 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>
Signed-off-by: poondog
<markj338@gmail.com>

idea is taken here -
https://github.com/poondog/kangaroo-m7-mkIII/commit/59aaa490b7575a3ff47933082f1a18af31e0cec4