block, bfq: add Early Queue Merge (EQM) to BFQ-v7r6

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 QEMU, 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>
Signed-off-by: Paolo Valente <paolo.valente@unimore.it>