mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
![Arianna Avanzini](/assets/img/avatar_default.png)
Add complete support for full hierarchical scheduling, with a cgroups interface. Full hierarchical scheduling is implemented through the 'entity' abstraction: both bfq_queues, i.e., the internal BFQ queues associated with processes, and groups are represented in general by entities. Given the bfq_queues associated with the processes belonging to a given group, the entities representing these queues are sons of the entity representing the group. At higher levels, if a group, say G, contains other groups, then the entity representing G is the parent entity of the entities representing the groups in G. Hierarchical scheduling is performed as follows: if the timestamps of a leaf entity (i.e., of a bfq_queue) change, and such a change lets the entity become the next-to-serve entity for its parent entity, then the timestamps of the parent entity are recomputed as a function of the budget of its new next-to-serve leaf entity. If the parent entity belongs, in its turn, to a group, and its new timestamps let it become the next-to-serve for its parent entity, then the timestamps of the latter parent entity are recomputed as well, and so on. When a new bfq_queue must be set in service, the reverse path is followed: the next-to-serve highest-level entity is chosen, then its next-to-serve child entity, and so on, until the next-to-serve leaf entity is reached, and the bfq_queue that this entity represents is set in service. Writeback is accounted for on a per-group basis, i.e., for each group, the async I/O requests of the processes of the group are enqueued in a distinct bfq_queue, and the entity associated with this queue is a child of the entity associated with the group. Weights can be assigned explicitly to groups and processes through the cgroups interface, differently from what happens, for single processes, if the cgroups interface is not used (as explained in the description of the previous patch). In particular, since each node has a full scheduler, each group can be assigned its own weight. Signed-off-by: Fabio Checconi <fchecconi@gmail.com> Signed-off-by: Paolo Valente <paolo.valente@linaro.org> Signed-off-by: Arianna Avanzini <avanzini.arianna@gmail.com> Signed-off-by: Jens Axboe <axboe@fb.com>
104 lines
2.7 KiB
Text
104 lines
2.7 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_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.
|
|
|
|
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
|
|
|
|
config MQ_IOSCHED_DEADLINE
|
|
tristate "MQ deadline I/O scheduler"
|
|
default y
|
|
---help---
|
|
MQ version of the deadline IO scheduler.
|
|
|
|
config MQ_IOSCHED_KYBER
|
|
tristate "Kyber I/O scheduler"
|
|
default y
|
|
---help---
|
|
The Kyber I/O scheduler is a low-overhead scheduler suitable for
|
|
multiqueue and other fast devices. Given target latencies for reads and
|
|
synchronous writes, it will self-tune queue depths to achieve that
|
|
goal.
|
|
|
|
config IOSCHED_BFQ
|
|
tristate "BFQ I/O scheduler"
|
|
default n
|
|
---help---
|
|
BFQ I/O scheduler for BLK-MQ. BFQ distributes the bandwidth of
|
|
of the device among all processes according to their weights,
|
|
regardless of the device parameters and with any workload. It
|
|
also guarantees a low latency to interactive and soft
|
|
real-time applications. Details in
|
|
Documentation/block/bfq-iosched.txt
|
|
|
|
config BFQ_GROUP_IOSCHED
|
|
bool "BFQ hierarchical scheduling support"
|
|
depends on IOSCHED_BFQ && BLK_CGROUP
|
|
default n
|
|
---help---
|
|
|
|
Enable hierarchical scheduling in BFQ, using the blkio
|
|
(cgroups-v1) or io (cgroups-v2) controller.
|
|
|
|
endmenu
|
|
|
|
endif
|