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. Change-Id: I1c789ca3c2eb93972d742f82ee729cfe5fb7170c Signed-off-by: Paolo Valente <paolo.valente@unimore.it> Signed-off-by: Arianna Avanzini <avanzini@google.com>
98 lines
2.6 KiB
Text
98 lines
2.6 KiB
Text
if BLOCK
|
|
|
|
menu "IO Schedulers"
|
|
|
|
config IOSCHED_NOOP
|
|
bool
|
|
default y
|
|
---help---
|
|
The no-op I/O scheduler is a minimal scheduler that does basic merging
|
|
and sorting. Its main uses include non-disk based block devices like
|
|
memory devices, and specialised software or hardware environments
|
|
that do their own scheduling and require only minimal assistance from
|
|
the kernel.
|
|
|
|
config IOSCHED_TEST
|
|
tristate "Test I/O scheduler"
|
|
depends on DEBUG_FS
|
|
default m
|
|
---help---
|
|
The test I/O scheduler is a duplicate of the noop scheduler with
|
|
addition of test utlity.
|
|
It allows testing a block device by dispatching specific requests
|
|
according to the test case and declare PASS/FAIL according to the
|
|
requests completion error code.
|
|
|
|
config IOSCHED_DEADLINE
|
|
tristate "Deadline I/O scheduler"
|
|
default y
|
|
---help---
|
|
The deadline I/O scheduler is simple and compact. It will provide
|
|
CSCAN service with FIFO expiration of requests, switching to
|
|
a new point in the service tree and doing a batch of IO from there
|
|
in case of expiry.
|
|
|
|
config IOSCHED_CFQ
|
|
tristate "CFQ I/O scheduler"
|
|
default y
|
|
---help---
|
|
The CFQ I/O scheduler tries to distribute bandwidth equally
|
|
among all processes in the system. It should provide a fair
|
|
and low latency working environment, suitable for both desktop
|
|
and server systems.
|
|
|
|
This is the default I/O scheduler.
|
|
|
|
config CFQ_GROUP_IOSCHED
|
|
bool "CFQ Group Scheduling support"
|
|
depends on IOSCHED_CFQ && BLK_CGROUP
|
|
default n
|
|
---help---
|
|
Enable group IO scheduling in CFQ.
|
|
|
|
config IOSCHED_BFQ
|
|
tristate "BFQ I/O scheduler"
|
|
default n
|
|
---help---
|
|
The BFQ I/O scheduler tries to distribute bandwidth among
|
|
all processes according to their weights.
|
|
It aims at distributing the bandwidth as desired, independently of
|
|
the disk parameters and with any workload. It also tries to
|
|
guarantee low latency to interactive and soft real-time
|
|
applications. If compiled built-in (saying Y here), BFQ can
|
|
be configured to support hierarchical scheduling.
|
|
|
|
config BFQ_GROUP_IOSCHED
|
|
bool "BFQ hierarchical scheduling support"
|
|
depends on CGROUPS && IOSCHED_BFQ=y
|
|
default n
|
|
---help---
|
|
Enable hierarchical scheduling in BFQ, using the blkio controller.
|
|
|
|
choice
|
|
prompt "Default I/O scheduler"
|
|
default DEFAULT_CFQ
|
|
help
|
|
Select the I/O scheduler which will be used by default for all
|
|
block devices.
|
|
|
|
config DEFAULT_DEADLINE
|
|
bool "Deadline" if IOSCHED_DEADLINE=y
|
|
|
|
config DEFAULT_CFQ
|
|
bool "CFQ" if IOSCHED_CFQ=y
|
|
|
|
config DEFAULT_NOOP
|
|
bool "No-op"
|
|
|
|
endchoice
|
|
|
|
config DEFAULT_IOSCHED
|
|
string
|
|
default "deadline" if DEFAULT_DEADLINE
|
|
default "cfq" if DEFAULT_CFQ
|
|
default "noop" if DEFAULT_NOOP
|
|
|
|
endmenu
|
|
|
|
endif
|