diff options
-rw-r--r-- | Documentation/cgroups/blkio-controller.txt | 35 | ||||
-rw-r--r-- | block/Kconfig | 23 | ||||
-rw-r--r-- | block/Kconfig.iosched | 16 | ||||
-rw-r--r-- | block/blk-cgroup.c | 2 | ||||
-rw-r--r-- | block/blk-cgroup.h | 14 | ||||
-rw-r--r-- | block/cfq-iosched.c | 2 | ||||
-rw-r--r-- | init/Kconfig | 27 |
7 files changed, 55 insertions, 64 deletions
diff --git a/Documentation/cgroups/blkio-controller.txt b/Documentation/cgroups/blkio-controller.txt index d422b410a995..48e0b21b0059 100644 --- a/Documentation/cgroups/blkio-controller.txt +++ b/Documentation/cgroups/blkio-controller.txt | |||
@@ -17,6 +17,9 @@ HOWTO | |||
17 | You can do a very simple testing of running two dd threads in two different | 17 | You can do a very simple testing of running two dd threads in two different |
18 | cgroups. Here is what you can do. | 18 | cgroups. Here is what you can do. |
19 | 19 | ||
20 | - Enable Block IO controller | ||
21 | CONFIG_BLK_CGROUP=y | ||
22 | |||
20 | - Enable group scheduling in CFQ | 23 | - Enable group scheduling in CFQ |
21 | CONFIG_CFQ_GROUP_IOSCHED=y | 24 | CONFIG_CFQ_GROUP_IOSCHED=y |
22 | 25 | ||
@@ -54,24 +57,16 @@ cgroups. Here is what you can do. | |||
54 | 57 | ||
55 | Various user visible config options | 58 | Various user visible config options |
56 | =================================== | 59 | =================================== |
57 | CONFIG_CFQ_GROUP_IOSCHED | ||
58 | - Enables group scheduling in CFQ. Currently only 1 level of group | ||
59 | creation is allowed. | ||
60 | |||
61 | CONFIG_DEBUG_CFQ_IOSCHED | ||
62 | - Enables some debugging messages in blktrace. Also creates extra | ||
63 | cgroup file blkio.dequeue. | ||
64 | |||
65 | Config options selected automatically | ||
66 | ===================================== | ||
67 | These config options are not user visible and are selected/deselected | ||
68 | automatically based on IO scheduler configuration. | ||
69 | |||
70 | CONFIG_BLK_CGROUP | 60 | CONFIG_BLK_CGROUP |
71 | - Block IO controller. Selected by CONFIG_CFQ_GROUP_IOSCHED. | 61 | - Block IO controller. |
72 | 62 | ||
73 | CONFIG_DEBUG_BLK_CGROUP | 63 | CONFIG_DEBUG_BLK_CGROUP |
74 | - Debug help. Selected by CONFIG_DEBUG_CFQ_IOSCHED. | 64 | - Debug help. Right now some additional stats file show up in cgroup |
65 | if this option is enabled. | ||
66 | |||
67 | CONFIG_CFQ_GROUP_IOSCHED | ||
68 | - Enables group scheduling in CFQ. Currently only 1 level of group | ||
69 | creation is allowed. | ||
75 | 70 | ||
76 | Details of cgroup files | 71 | Details of cgroup files |
77 | ======================= | 72 | ======================= |
@@ -174,13 +169,13 @@ Details of cgroup files | |||
174 | write, sync or async. | 169 | write, sync or async. |
175 | 170 | ||
176 | - blkio.avg_queue_size | 171 | - blkio.avg_queue_size |
177 | - Debugging aid only enabled if CONFIG_DEBUG_CFQ_IOSCHED=y. | 172 | - Debugging aid only enabled if CONFIG_DEBUG_BLK_CGROUP=y. |
178 | The average queue size for this cgroup over the entire time of this | 173 | The average queue size for this cgroup over the entire time of this |
179 | cgroup's existence. Queue size samples are taken each time one of the | 174 | cgroup's existence. Queue size samples are taken each time one of the |
180 | queues of this cgroup gets a timeslice. | 175 | queues of this cgroup gets a timeslice. |
181 | 176 | ||
182 | - blkio.group_wait_time | 177 | - blkio.group_wait_time |
183 | - Debugging aid only enabled if CONFIG_DEBUG_CFQ_IOSCHED=y. | 178 | - Debugging aid only enabled if CONFIG_DEBUG_BLK_CGROUP=y. |
184 | This is the amount of time the cgroup had to wait since it became busy | 179 | This is the amount of time the cgroup had to wait since it became busy |
185 | (i.e., went from 0 to 1 request queued) to get a timeslice for one of | 180 | (i.e., went from 0 to 1 request queued) to get a timeslice for one of |
186 | its queues. This is different from the io_wait_time which is the | 181 | its queues. This is different from the io_wait_time which is the |
@@ -191,7 +186,7 @@ Details of cgroup files | |||
191 | got a timeslice and will not include the current delta. | 186 | got a timeslice and will not include the current delta. |
192 | 187 | ||
193 | - blkio.empty_time | 188 | - blkio.empty_time |
194 | - Debugging aid only enabled if CONFIG_DEBUG_CFQ_IOSCHED=y. | 189 | - Debugging aid only enabled if CONFIG_DEBUG_BLK_CGROUP=y. |
195 | This is the amount of time a cgroup spends without any pending | 190 | This is the amount of time a cgroup spends without any pending |
196 | requests when not being served, i.e., it does not include any time | 191 | requests when not being served, i.e., it does not include any time |
197 | spent idling for one of the queues of the cgroup. This is in | 192 | spent idling for one of the queues of the cgroup. This is in |
@@ -200,7 +195,7 @@ Details of cgroup files | |||
200 | time it had a pending request and will not include the current delta. | 195 | time it had a pending request and will not include the current delta. |
201 | 196 | ||
202 | - blkio.idle_time | 197 | - blkio.idle_time |
203 | - Debugging aid only enabled if CONFIG_DEBUG_CFQ_IOSCHED=y. | 198 | - Debugging aid only enabled if CONFIG_DEBUG_BLK_CGROUP=y. |
204 | This is the amount of time spent by the IO scheduler idling for a | 199 | This is the amount of time spent by the IO scheduler idling for a |
205 | given cgroup in anticipation of a better request than the exising ones | 200 | given cgroup in anticipation of a better request than the exising ones |
206 | from other queues/cgroups. This is in nanoseconds. If this is read | 201 | from other queues/cgroups. This is in nanoseconds. If this is read |
@@ -209,7 +204,7 @@ Details of cgroup files | |||
209 | the current delta. | 204 | the current delta. |
210 | 205 | ||
211 | - blkio.dequeue | 206 | - blkio.dequeue |
212 | - Debugging aid only enabled if CONFIG_DEBUG_CFQ_IOSCHED=y. This | 207 | - Debugging aid only enabled if CONFIG_DEBUG_BLK_CGROUP=y. This |
213 | gives the statistics about how many a times a group was dequeued | 208 | gives the statistics about how many a times a group was dequeued |
214 | from service tree of the device. First two fields specify the major | 209 | from service tree of the device. First two fields specify the major |
215 | and minor number of the device and third field specifies the number | 210 | and minor number of the device and third field specifies the number |
diff --git a/block/Kconfig b/block/Kconfig index f9e89f4d94bb..9be0b56eaee1 100644 --- a/block/Kconfig +++ b/block/Kconfig | |||
@@ -77,29 +77,6 @@ config BLK_DEV_INTEGRITY | |||
77 | T10/SCSI Data Integrity Field or the T13/ATA External Path | 77 | T10/SCSI Data Integrity Field or the T13/ATA External Path |
78 | Protection. If in doubt, say N. | 78 | Protection. If in doubt, say N. |
79 | 79 | ||
80 | config BLK_CGROUP | ||
81 | tristate "Block cgroup support" | ||
82 | depends on CGROUPS | ||
83 | depends on CFQ_GROUP_IOSCHED | ||
84 | default n | ||
85 | ---help--- | ||
86 | Generic block IO controller cgroup interface. This is the common | ||
87 | cgroup interface which should be used by various IO controlling | ||
88 | policies. | ||
89 | |||
90 | Currently, CFQ IO scheduler uses it to recognize task groups and | ||
91 | control disk bandwidth allocation (proportional time slice allocation) | ||
92 | to such task groups. | ||
93 | |||
94 | config DEBUG_BLK_CGROUP | ||
95 | bool | ||
96 | depends on BLK_CGROUP | ||
97 | default n | ||
98 | ---help--- | ||
99 | Enable some debugging help. Currently it stores the cgroup path | ||
100 | in the blk group which can be used by cfq for tracing various | ||
101 | group related activity. | ||
102 | |||
103 | endif # BLOCK | 80 | endif # BLOCK |
104 | 81 | ||
105 | config BLOCK_COMPAT | 82 | config BLOCK_COMPAT |
diff --git a/block/Kconfig.iosched b/block/Kconfig.iosched index fc71cf071fb2..3199b76f795d 100644 --- a/block/Kconfig.iosched +++ b/block/Kconfig.iosched | |||
@@ -23,7 +23,8 @@ config IOSCHED_DEADLINE | |||
23 | 23 | ||
24 | config IOSCHED_CFQ | 24 | config IOSCHED_CFQ |
25 | tristate "CFQ I/O scheduler" | 25 | tristate "CFQ I/O scheduler" |
26 | select BLK_CGROUP if CFQ_GROUP_IOSCHED | 26 | # If BLK_CGROUP is a module, CFQ has to be built as module. |
27 | depends on (BLK_CGROUP=m && m) || !BLK_CGROUP || BLK_CGROUP=y | ||
27 | default y | 28 | default y |
28 | ---help--- | 29 | ---help--- |
29 | The CFQ I/O scheduler tries to distribute bandwidth equally | 30 | The CFQ I/O scheduler tries to distribute bandwidth equally |
@@ -33,22 +34,15 @@ config IOSCHED_CFQ | |||
33 | 34 | ||
34 | This is the default I/O scheduler. | 35 | This is the default I/O scheduler. |
35 | 36 | ||
37 | Note: If BLK_CGROUP=m, then CFQ can be built only as module. | ||
38 | |||
36 | config CFQ_GROUP_IOSCHED | 39 | config CFQ_GROUP_IOSCHED |
37 | bool "CFQ Group Scheduling support" | 40 | bool "CFQ Group Scheduling support" |
38 | depends on IOSCHED_CFQ && CGROUPS | 41 | depends on IOSCHED_CFQ && BLK_CGROUP |
39 | default n | 42 | default n |
40 | ---help--- | 43 | ---help--- |
41 | Enable group IO scheduling in CFQ. | 44 | Enable group IO scheduling in CFQ. |
42 | 45 | ||
43 | config DEBUG_CFQ_IOSCHED | ||
44 | bool "Debug CFQ Scheduling" | ||
45 | depends on CFQ_GROUP_IOSCHED | ||
46 | select DEBUG_BLK_CGROUP | ||
47 | default n | ||
48 | ---help--- | ||
49 | Enable CFQ IO scheduling debugging in CFQ. Currently it makes | ||
50 | blktrace output more verbose. | ||
51 | |||
52 | choice | 46 | choice |
53 | prompt "Default I/O scheduler" | 47 | prompt "Default I/O scheduler" |
54 | default DEFAULT_CFQ | 48 | default DEFAULT_CFQ |
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index af42efbb0c1d..d02bbf88de13 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c | |||
@@ -351,10 +351,8 @@ void blkiocg_add_blkio_group(struct blkio_cgroup *blkcg, | |||
351 | blkg->blkcg_id = css_id(&blkcg->css); | 351 | blkg->blkcg_id = css_id(&blkcg->css); |
352 | hlist_add_head_rcu(&blkg->blkcg_node, &blkcg->blkg_list); | 352 | hlist_add_head_rcu(&blkg->blkcg_node, &blkcg->blkg_list); |
353 | spin_unlock_irqrestore(&blkcg->lock, flags); | 353 | spin_unlock_irqrestore(&blkcg->lock, flags); |
354 | #ifdef CONFIG_DEBUG_BLK_CGROUP | ||
355 | /* Need to take css reference ? */ | 354 | /* Need to take css reference ? */ |
356 | cgroup_path(blkcg->css.cgroup, blkg->path, sizeof(blkg->path)); | 355 | cgroup_path(blkcg->css.cgroup, blkg->path, sizeof(blkg->path)); |
357 | #endif | ||
358 | blkg->dev = dev; | 356 | blkg->dev = dev; |
359 | } | 357 | } |
360 | EXPORT_SYMBOL_GPL(blkiocg_add_blkio_group); | 358 | EXPORT_SYMBOL_GPL(blkiocg_add_blkio_group); |
diff --git a/block/blk-cgroup.h b/block/blk-cgroup.h index a491a6d56ecf..2b866ec1dcea 100644 --- a/block/blk-cgroup.h +++ b/block/blk-cgroup.h | |||
@@ -108,10 +108,8 @@ struct blkio_group { | |||
108 | void *key; | 108 | void *key; |
109 | struct hlist_node blkcg_node; | 109 | struct hlist_node blkcg_node; |
110 | unsigned short blkcg_id; | 110 | unsigned short blkcg_id; |
111 | #ifdef CONFIG_DEBUG_BLK_CGROUP | ||
112 | /* Store cgroup path */ | 111 | /* Store cgroup path */ |
113 | char path[128]; | 112 | char path[128]; |
114 | #endif | ||
115 | /* The device MKDEV(major, minor), this group has been created for */ | 113 | /* The device MKDEV(major, minor), this group has been created for */ |
116 | dev_t dev; | 114 | dev_t dev; |
117 | 115 | ||
@@ -147,6 +145,11 @@ struct blkio_policy_type { | |||
147 | extern void blkio_policy_register(struct blkio_policy_type *); | 145 | extern void blkio_policy_register(struct blkio_policy_type *); |
148 | extern void blkio_policy_unregister(struct blkio_policy_type *); | 146 | extern void blkio_policy_unregister(struct blkio_policy_type *); |
149 | 147 | ||
148 | static inline char *blkg_path(struct blkio_group *blkg) | ||
149 | { | ||
150 | return blkg->path; | ||
151 | } | ||
152 | |||
150 | #else | 153 | #else |
151 | 154 | ||
152 | struct blkio_group { | 155 | struct blkio_group { |
@@ -158,6 +161,8 @@ struct blkio_policy_type { | |||
158 | static inline void blkio_policy_register(struct blkio_policy_type *blkiop) { } | 161 | static inline void blkio_policy_register(struct blkio_policy_type *blkiop) { } |
159 | static inline void blkio_policy_unregister(struct blkio_policy_type *blkiop) { } | 162 | static inline void blkio_policy_unregister(struct blkio_policy_type *blkiop) { } |
160 | 163 | ||
164 | static inline char *blkg_path(struct blkio_group *blkg) { return NULL; } | ||
165 | |||
161 | #endif | 166 | #endif |
162 | 167 | ||
163 | #define BLKIO_WEIGHT_MIN 100 | 168 | #define BLKIO_WEIGHT_MIN 100 |
@@ -165,10 +170,6 @@ static inline void blkio_policy_unregister(struct blkio_policy_type *blkiop) { } | |||
165 | #define BLKIO_WEIGHT_DEFAULT 500 | 170 | #define BLKIO_WEIGHT_DEFAULT 500 |
166 | 171 | ||
167 | #ifdef CONFIG_DEBUG_BLK_CGROUP | 172 | #ifdef CONFIG_DEBUG_BLK_CGROUP |
168 | static inline char *blkg_path(struct blkio_group *blkg) | ||
169 | { | ||
170 | return blkg->path; | ||
171 | } | ||
172 | void blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg); | 173 | void blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg); |
173 | void blkiocg_update_dequeue_stats(struct blkio_group *blkg, | 174 | void blkiocg_update_dequeue_stats(struct blkio_group *blkg, |
174 | unsigned long dequeue); | 175 | unsigned long dequeue); |
@@ -197,7 +198,6 @@ BLKG_FLAG_FNS(idling) | |||
197 | BLKG_FLAG_FNS(empty) | 198 | BLKG_FLAG_FNS(empty) |
198 | #undef BLKG_FLAG_FNS | 199 | #undef BLKG_FLAG_FNS |
199 | #else | 200 | #else |
200 | static inline char *blkg_path(struct blkio_group *blkg) { return NULL; } | ||
201 | static inline void blkiocg_update_avg_queue_size_stats( | 201 | static inline void blkiocg_update_avg_queue_size_stats( |
202 | struct blkio_group *blkg) {} | 202 | struct blkio_group *blkg) {} |
203 | static inline void blkiocg_update_dequeue_stats(struct blkio_group *blkg, | 203 | static inline void blkiocg_update_dequeue_stats(struct blkio_group *blkg, |
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 002a5b621653..286008cf889e 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -345,7 +345,7 @@ CFQ_CFQQ_FNS(deep); | |||
345 | CFQ_CFQQ_FNS(wait_busy); | 345 | CFQ_CFQQ_FNS(wait_busy); |
346 | #undef CFQ_CFQQ_FNS | 346 | #undef CFQ_CFQQ_FNS |
347 | 347 | ||
348 | #ifdef CONFIG_DEBUG_CFQ_IOSCHED | 348 | #ifdef CONFIG_CFQ_GROUP_IOSCHED |
349 | #define cfq_log_cfqq(cfqd, cfqq, fmt, args...) \ | 349 | #define cfq_log_cfqq(cfqd, cfqq, fmt, args...) \ |
350 | blk_add_trace_msg((cfqd)->queue, "cfq%d%c %s " fmt, (cfqq)->pid, \ | 350 | blk_add_trace_msg((cfqd)->queue, "cfq%d%c %s " fmt, (cfqq)->pid, \ |
351 | cfq_cfqq_sync((cfqq)) ? 'S' : 'A', \ | 351 | cfq_cfqq_sync((cfqq)) ? 'S' : 'A', \ |
diff --git a/init/Kconfig b/init/Kconfig index eb77e8ccde1c..087c14f3c595 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -612,6 +612,33 @@ config RT_GROUP_SCHED | |||
612 | 612 | ||
613 | endif #CGROUP_SCHED | 613 | endif #CGROUP_SCHED |
614 | 614 | ||
615 | config BLK_CGROUP | ||
616 | tristate "Block IO controller" | ||
617 | depends on CGROUPS && BLOCK | ||
618 | default n | ||
619 | ---help--- | ||
620 | Generic block IO controller cgroup interface. This is the common | ||
621 | cgroup interface which should be used by various IO controlling | ||
622 | policies. | ||
623 | |||
624 | Currently, CFQ IO scheduler uses it to recognize task groups and | ||
625 | control disk bandwidth allocation (proportional time slice allocation) | ||
626 | to such task groups. | ||
627 | |||
628 | This option only enables generic Block IO controller infrastructure. | ||
629 | One needs to also enable actual IO controlling logic in CFQ for it | ||
630 | to take effect. (CONFIG_CFQ_GROUP_IOSCHED=y). | ||
631 | |||
632 | See Documentation/cgroups/blkio-controller.txt for more information. | ||
633 | |||
634 | config DEBUG_BLK_CGROUP | ||
635 | bool "Enable Block IO controller debugging" | ||
636 | depends on BLK_CGROUP | ||
637 | default n | ||
638 | ---help--- | ||
639 | Enable some debugging help. Currently it exports additional stat | ||
640 | files in a cgroup which can be useful for debugging. | ||
641 | |||
615 | endif # CGROUPS | 642 | endif # CGROUPS |
616 | 643 | ||
617 | config MM_OWNER | 644 | config MM_OWNER |