block: bfq: cgroups, kconfig, build bits for BFQ-v7r1 for 3.4

Update Kconfig.iosched to include kernel configuration options
for BFQ. Add a Kconfig option and do the related Makefile changes
to compile the scheduler. Also let the cgroups subsystem know about
the BFQ I/O controller.

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

Conflicts:
	block/Kconfig.iosched
	block/Makefile

Conflicts:
	block/Kconfig.iosched
	block/Makefile

Conflicts:
	block/Makefile
block: bfq: introduce the BFQ-v7r1 I/O sched for 3.4

Add the BFQ-v7r1 I/O scheduler to 3.4.
The general structure is borrowed from CFQ, as much of the code for
handling I/O contexts Over time, several useful features have been
ported from CFQ as well (details in the changelog in README.BFQ). A
(bfq_)queue is associated to each task doing I/O on a device, and each
time a scheduling decision has to be made a queue is selected and served
until it expires.

    - Slices are given in the service domain: tasks are assigned
      budgets, measured in number of sectors. Once got the disk, a task
      must however consume its assigned budget within a configurable
      maximum time (by default, the maximum possible value of the
      budgets is automatically computed to comply with this timeout).
      This allows the desired latency vs "throughput boosting" tradeoff
      to be set.

    - Budgets are scheduled according to a variant of WF2Q+, implemented
      using an augmented rb-tree to take eligibility into account while
      preserving an O(log N) overall complexity.

    - A low-latency tunable is provided; if enabled, both interactive
      and soft real-time applications are guaranteed a very low latency.

    - Latency guarantees are preserved also in the presence of NCQ.

    - Also with flash-based devices, a high throughput is achieved
      while still preserving latency guarantees.

    - BFQ features Early Queue Merge (EQM), a sort of fusion of the
      cooperating-queue-merging and the preemption mechanisms present
      in CFQ. EQM is in fact a unified mechanism that tries to get a
      sequential read pattern, and hence a high throughput, with any
      set of processes performing interleaved I/O over a contiguous
      sequence of sectors.

    - BFQ supports full hierarchical scheduling, exporting a cgroups
      interface.  Since each node has a full scheduler, each group can
      be assigned its own weight.

    - If the cgroups interface is not used, only I/O priorities can be
      assigned to processes, with ioprio values mapped to weights
      with the relation weight = IOPRIO_BE_NR - ioprio.

    - ioprio classes are served in strict priority order, i.e., lower
      priority queues are not served as long as there are higher
      priority queues.  Among queues in the same class the bandwidth is
      distributed in proportion to the weight of each queue. A very
      thin extra bandwidth is however guaranteed to the Idle class, to
      prevent it from starving.
block: bfq: add Early Queue Merge (EQM) to BFQ-v7r1 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>
bfq-iosched: Tuning for SSD
bfq-iosched: Set bfq_back_penalty = 1
ak_flo_defconfig: enable BFQ
Kernel Version: AK.018.XGENESIS.FLO