34bfcefdd924c0c5e7f222c726ca5d30f05aed26
[linux-2.6.git] / block / blk-cgroup.c
1 /*
2  * Common Block IO controller cgroup interface
3  *
4  * Based on ideas and code from CFQ, CFS and BFQ:
5  * Copyright (C) 2003 Jens Axboe <axboe@kernel.dk>
6  *
7  * Copyright (C) 2008 Fabio Checconi <fabio@gandalf.sssup.it>
8  *                    Paolo Valente <paolo.valente@unimore.it>
9  *
10  * Copyright (C) 2009 Vivek Goyal <vgoyal@redhat.com>
11  *                    Nauman Rafique <nauman@google.com>
12  */
13 #include <linux/ioprio.h>
14 #include <linux/seq_file.h>
15 #include <linux/kdev_t.h>
16 #include <linux/module.h>
17 #include <linux/err.h>
18 #include <linux/blkdev.h>
19 #include <linux/slab.h>
20 #include "blk-cgroup.h"
21 #include <linux/genhd.h>
22
23 #define MAX_KEY_LEN 100
24
25 static DEFINE_SPINLOCK(blkio_list_lock);
26 static LIST_HEAD(blkio_list);
27
28 struct blkio_cgroup blkio_root_cgroup = { .weight = 2*BLKIO_WEIGHT_DEFAULT };
29 EXPORT_SYMBOL_GPL(blkio_root_cgroup);
30
31 static struct cgroup_subsys_state *blkiocg_create(struct cgroup_subsys *,
32                                                   struct cgroup *);
33 static int blkiocg_can_attach(struct cgroup_subsys *, struct cgroup *,
34                               struct task_struct *, bool);
35 static void blkiocg_attach(struct cgroup_subsys *, struct cgroup *,
36                            struct cgroup *, struct task_struct *, bool);
37 static void blkiocg_destroy(struct cgroup_subsys *, struct cgroup *);
38 static int blkiocg_populate(struct cgroup_subsys *, struct cgroup *);
39
40 /* for encoding cft->private value on file */
41 #define BLKIOFILE_PRIVATE(x, val)       (((x) << 16) | (val))
42 /* What policy owns the file, proportional or throttle */
43 #define BLKIOFILE_POLICY(val)           (((val) >> 16) & 0xffff)
44 #define BLKIOFILE_ATTR(val)             ((val) & 0xffff)
45
46 struct cgroup_subsys blkio_subsys = {
47         .name = "blkio",
48         .create = blkiocg_create,
49         .can_attach = blkiocg_can_attach,
50         .attach = blkiocg_attach,
51         .destroy = blkiocg_destroy,
52         .populate = blkiocg_populate,
53 #ifdef CONFIG_BLK_CGROUP
54         /* note: blkio_subsys_id is otherwise defined in blk-cgroup.h */
55         .subsys_id = blkio_subsys_id,
56 #endif
57         .use_id = 1,
58         .module = THIS_MODULE,
59 };
60 EXPORT_SYMBOL_GPL(blkio_subsys);
61
62 static inline void blkio_policy_insert_node(struct blkio_cgroup *blkcg,
63                                             struct blkio_policy_node *pn)
64 {
65         list_add(&pn->node, &blkcg->policy_list);
66 }
67
68 static inline bool cftype_blkg_same_policy(struct cftype *cft,
69                         struct blkio_group *blkg)
70 {
71         enum blkio_policy_id plid = BLKIOFILE_POLICY(cft->private);
72
73         if (blkg->plid == plid)
74                 return 1;
75
76         return 0;
77 }
78
79 /* Determines if policy node matches cgroup file being accessed */
80 static inline bool pn_matches_cftype(struct cftype *cft,
81                         struct blkio_policy_node *pn)
82 {
83         enum blkio_policy_id plid = BLKIOFILE_POLICY(cft->private);
84         int fileid = BLKIOFILE_ATTR(cft->private);
85
86         return (plid == pn->plid && fileid == pn->fileid);
87 }
88
89 /* Must be called with blkcg->lock held */
90 static inline void blkio_policy_delete_node(struct blkio_policy_node *pn)
91 {
92         list_del(&pn->node);
93 }
94
95 /* Must be called with blkcg->lock held */
96 static struct blkio_policy_node *
97 blkio_policy_search_node(const struct blkio_cgroup *blkcg, dev_t dev,
98                 enum blkio_policy_id plid, int fileid)
99 {
100         struct blkio_policy_node *pn;
101
102         list_for_each_entry(pn, &blkcg->policy_list, node) {
103                 if (pn->dev == dev && pn->plid == plid && pn->fileid == fileid)
104                         return pn;
105         }
106
107         return NULL;
108 }
109
110 struct blkio_cgroup *cgroup_to_blkio_cgroup(struct cgroup *cgroup)
111 {
112         return container_of(cgroup_subsys_state(cgroup, blkio_subsys_id),
113                             struct blkio_cgroup, css);
114 }
115 EXPORT_SYMBOL_GPL(cgroup_to_blkio_cgroup);
116
117 struct blkio_cgroup *task_blkio_cgroup(struct task_struct *tsk)
118 {
119         return container_of(task_subsys_state(tsk, blkio_subsys_id),
120                             struct blkio_cgroup, css);
121 }
122 EXPORT_SYMBOL_GPL(task_blkio_cgroup);
123
124 static inline void
125 blkio_update_group_weight(struct blkio_group *blkg, unsigned int weight)
126 {
127         struct blkio_policy_type *blkiop;
128
129         list_for_each_entry(blkiop, &blkio_list, list) {
130                 /* If this policy does not own the blkg, do not send updates */
131                 if (blkiop->plid != blkg->plid)
132                         continue;
133                 if (blkiop->ops.blkio_update_group_weight_fn)
134                         blkiop->ops.blkio_update_group_weight_fn(blkg->key,
135                                                         blkg, weight);
136         }
137 }
138
139 static inline void blkio_update_group_bps(struct blkio_group *blkg, u64 bps,
140                                 int fileid)
141 {
142         struct blkio_policy_type *blkiop;
143
144         list_for_each_entry(blkiop, &blkio_list, list) {
145
146                 /* If this policy does not own the blkg, do not send updates */
147                 if (blkiop->plid != blkg->plid)
148                         continue;
149
150                 if (fileid == BLKIO_THROTL_read_bps_device
151                     && blkiop->ops.blkio_update_group_read_bps_fn)
152                         blkiop->ops.blkio_update_group_read_bps_fn(blkg->key,
153                                                                 blkg, bps);
154
155                 if (fileid == BLKIO_THROTL_write_bps_device
156                     && blkiop->ops.blkio_update_group_write_bps_fn)
157                         blkiop->ops.blkio_update_group_write_bps_fn(blkg->key,
158                                                                 blkg, bps);
159         }
160 }
161
162 static inline void blkio_update_group_iops(struct blkio_group *blkg,
163                         unsigned int iops, int fileid)
164 {
165         struct blkio_policy_type *blkiop;
166
167         list_for_each_entry(blkiop, &blkio_list, list) {
168
169                 /* If this policy does not own the blkg, do not send updates */
170                 if (blkiop->plid != blkg->plid)
171                         continue;
172
173                 if (fileid == BLKIO_THROTL_read_iops_device
174                     && blkiop->ops.blkio_update_group_read_iops_fn)
175                         blkiop->ops.blkio_update_group_read_iops_fn(blkg->key,
176                                                                 blkg, iops);
177
178                 if (fileid == BLKIO_THROTL_write_iops_device
179                     && blkiop->ops.blkio_update_group_write_iops_fn)
180                         blkiop->ops.blkio_update_group_write_iops_fn(blkg->key,
181                                                                 blkg,iops);
182         }
183 }
184
185 /*
186  * Add to the appropriate stat variable depending on the request type.
187  * This should be called with the blkg->stats_lock held.
188  */
189 static void blkio_add_stat(uint64_t *stat, uint64_t add, bool direction,
190                                 bool sync)
191 {
192         if (direction)
193                 stat[BLKIO_STAT_WRITE] += add;
194         else
195                 stat[BLKIO_STAT_READ] += add;
196         if (sync)
197                 stat[BLKIO_STAT_SYNC] += add;
198         else
199                 stat[BLKIO_STAT_ASYNC] += add;
200 }
201
202 /*
203  * Decrements the appropriate stat variable if non-zero depending on the
204  * request type. Panics on value being zero.
205  * This should be called with the blkg->stats_lock held.
206  */
207 static void blkio_check_and_dec_stat(uint64_t *stat, bool direction, bool sync)
208 {
209         if (direction) {
210                 BUG_ON(stat[BLKIO_STAT_WRITE] == 0);
211                 stat[BLKIO_STAT_WRITE]--;
212         } else {
213                 BUG_ON(stat[BLKIO_STAT_READ] == 0);
214                 stat[BLKIO_STAT_READ]--;
215         }
216         if (sync) {
217                 BUG_ON(stat[BLKIO_STAT_SYNC] == 0);
218                 stat[BLKIO_STAT_SYNC]--;
219         } else {
220                 BUG_ON(stat[BLKIO_STAT_ASYNC] == 0);
221                 stat[BLKIO_STAT_ASYNC]--;
222         }
223 }
224
225 #ifdef CONFIG_DEBUG_BLK_CGROUP
226 /* This should be called with the blkg->stats_lock held. */
227 static void blkio_set_start_group_wait_time(struct blkio_group *blkg,
228                                                 struct blkio_group *curr_blkg)
229 {
230         if (blkio_blkg_waiting(&blkg->stats))
231                 return;
232         if (blkg == curr_blkg)
233                 return;
234         blkg->stats.start_group_wait_time = sched_clock();
235         blkio_mark_blkg_waiting(&blkg->stats);
236 }
237
238 /* This should be called with the blkg->stats_lock held. */
239 static void blkio_update_group_wait_time(struct blkio_group_stats *stats)
240 {
241         unsigned long long now;
242
243         if (!blkio_blkg_waiting(stats))
244                 return;
245
246         now = sched_clock();
247         if (time_after64(now, stats->start_group_wait_time))
248                 stats->group_wait_time += now - stats->start_group_wait_time;
249         blkio_clear_blkg_waiting(stats);
250 }
251
252 /* This should be called with the blkg->stats_lock held. */
253 static void blkio_end_empty_time(struct blkio_group_stats *stats)
254 {
255         unsigned long long now;
256
257         if (!blkio_blkg_empty(stats))
258                 return;
259
260         now = sched_clock();
261         if (time_after64(now, stats->start_empty_time))
262                 stats->empty_time += now - stats->start_empty_time;
263         blkio_clear_blkg_empty(stats);
264 }
265
266 void blkiocg_update_set_idle_time_stats(struct blkio_group *blkg)
267 {
268         unsigned long flags;
269
270         spin_lock_irqsave(&blkg->stats_lock, flags);
271         BUG_ON(blkio_blkg_idling(&blkg->stats));
272         blkg->stats.start_idle_time = sched_clock();
273         blkio_mark_blkg_idling(&blkg->stats);
274         spin_unlock_irqrestore(&blkg->stats_lock, flags);
275 }
276 EXPORT_SYMBOL_GPL(blkiocg_update_set_idle_time_stats);
277
278 void blkiocg_update_idle_time_stats(struct blkio_group *blkg)
279 {
280         unsigned long flags;
281         unsigned long long now;
282         struct blkio_group_stats *stats;
283
284         spin_lock_irqsave(&blkg->stats_lock, flags);
285         stats = &blkg->stats;
286         if (blkio_blkg_idling(stats)) {
287                 now = sched_clock();
288                 if (time_after64(now, stats->start_idle_time))
289                         stats->idle_time += now - stats->start_idle_time;
290                 blkio_clear_blkg_idling(stats);
291         }
292         spin_unlock_irqrestore(&blkg->stats_lock, flags);
293 }
294 EXPORT_SYMBOL_GPL(blkiocg_update_idle_time_stats);
295
296 void blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg)
297 {
298         unsigned long flags;
299         struct blkio_group_stats *stats;
300
301         spin_lock_irqsave(&blkg->stats_lock, flags);
302         stats = &blkg->stats;
303         stats->avg_queue_size_sum +=
304                         stats->stat_arr[BLKIO_STAT_QUEUED][BLKIO_STAT_READ] +
305                         stats->stat_arr[BLKIO_STAT_QUEUED][BLKIO_STAT_WRITE];
306         stats->avg_queue_size_samples++;
307         blkio_update_group_wait_time(stats);
308         spin_unlock_irqrestore(&blkg->stats_lock, flags);
309 }
310 EXPORT_SYMBOL_GPL(blkiocg_update_avg_queue_size_stats);
311
312 void blkiocg_set_start_empty_time(struct blkio_group *blkg)
313 {
314         unsigned long flags;
315         struct blkio_group_stats *stats;
316
317         spin_lock_irqsave(&blkg->stats_lock, flags);
318         stats = &blkg->stats;
319
320         if (stats->stat_arr[BLKIO_STAT_QUEUED][BLKIO_STAT_READ] ||
321                         stats->stat_arr[BLKIO_STAT_QUEUED][BLKIO_STAT_WRITE]) {
322                 spin_unlock_irqrestore(&blkg->stats_lock, flags);
323                 return;
324         }
325
326         /*
327          * group is already marked empty. This can happen if cfqq got new
328          * request in parent group and moved to this group while being added
329          * to service tree. Just ignore the event and move on.
330          */
331         if(blkio_blkg_empty(stats)) {
332                 spin_unlock_irqrestore(&blkg->stats_lock, flags);
333                 return;
334         }
335
336         stats->start_empty_time = sched_clock();
337         blkio_mark_blkg_empty(stats);
338         spin_unlock_irqrestore(&blkg->stats_lock, flags);
339 }
340 EXPORT_SYMBOL_GPL(blkiocg_set_start_empty_time);
341
342 void blkiocg_update_dequeue_stats(struct blkio_group *blkg,
343                         unsigned long dequeue)
344 {
345         blkg->stats.dequeue += dequeue;
346 }
347 EXPORT_SYMBOL_GPL(blkiocg_update_dequeue_stats);
348 #else
349 static inline void blkio_set_start_group_wait_time(struct blkio_group *blkg,
350                                         struct blkio_group *curr_blkg) {}
351 static inline void blkio_end_empty_time(struct blkio_group_stats *stats) {}
352 #endif
353
354 void blkiocg_update_io_add_stats(struct blkio_group *blkg,
355                         struct blkio_group *curr_blkg, bool direction,
356                         bool sync)
357 {
358         unsigned long flags;
359
360         spin_lock_irqsave(&blkg->stats_lock, flags);
361         blkio_add_stat(blkg->stats.stat_arr[BLKIO_STAT_QUEUED], 1, direction,
362                         sync);
363         blkio_end_empty_time(&blkg->stats);
364         blkio_set_start_group_wait_time(blkg, curr_blkg);
365         spin_unlock_irqrestore(&blkg->stats_lock, flags);
366 }
367 EXPORT_SYMBOL_GPL(blkiocg_update_io_add_stats);
368
369 void blkiocg_update_io_remove_stats(struct blkio_group *blkg,
370                                                 bool direction, bool sync)
371 {
372         unsigned long flags;
373
374         spin_lock_irqsave(&blkg->stats_lock, flags);
375         blkio_check_and_dec_stat(blkg->stats.stat_arr[BLKIO_STAT_QUEUED],
376                                         direction, sync);
377         spin_unlock_irqrestore(&blkg->stats_lock, flags);
378 }
379 EXPORT_SYMBOL_GPL(blkiocg_update_io_remove_stats);
380
381 void blkiocg_update_timeslice_used(struct blkio_group *blkg, unsigned long time,
382                                 unsigned long unaccounted_time)
383 {
384         unsigned long flags;
385
386         spin_lock_irqsave(&blkg->stats_lock, flags);
387         blkg->stats.time += time;
388 #ifdef CONFIG_DEBUG_BLK_CGROUP
389         blkg->stats.unaccounted_time += unaccounted_time;
390 #endif
391         spin_unlock_irqrestore(&blkg->stats_lock, flags);
392 }
393 EXPORT_SYMBOL_GPL(blkiocg_update_timeslice_used);
394
395 /*
396  * should be called under rcu read lock or queue lock to make sure blkg pointer
397  * is valid.
398  */
399 void blkiocg_update_dispatch_stats(struct blkio_group *blkg,
400                                 uint64_t bytes, bool direction, bool sync)
401 {
402         struct blkio_group_stats_cpu *stats_cpu;
403
404         stats_cpu = this_cpu_ptr(blkg->stats_cpu);
405
406         stats_cpu->sectors += bytes >> 9;
407         blkio_add_stat(stats_cpu->stat_arr_cpu[BLKIO_STAT_CPU_SERVICED],
408                         1, direction, sync);
409         blkio_add_stat(stats_cpu->stat_arr_cpu[BLKIO_STAT_CPU_SERVICE_BYTES],
410                         bytes, direction, sync);
411 }
412 EXPORT_SYMBOL_GPL(blkiocg_update_dispatch_stats);
413
414 void blkiocg_update_completion_stats(struct blkio_group *blkg,
415         uint64_t start_time, uint64_t io_start_time, bool direction, bool sync)
416 {
417         struct blkio_group_stats *stats;
418         unsigned long flags;
419         unsigned long long now = sched_clock();
420
421         spin_lock_irqsave(&blkg->stats_lock, flags);
422         stats = &blkg->stats;
423         if (time_after64(now, io_start_time))
424                 blkio_add_stat(stats->stat_arr[BLKIO_STAT_SERVICE_TIME],
425                                 now - io_start_time, direction, sync);
426         if (time_after64(io_start_time, start_time))
427                 blkio_add_stat(stats->stat_arr[BLKIO_STAT_WAIT_TIME],
428                                 io_start_time - start_time, direction, sync);
429         spin_unlock_irqrestore(&blkg->stats_lock, flags);
430 }
431 EXPORT_SYMBOL_GPL(blkiocg_update_completion_stats);
432
433 void blkiocg_update_io_merged_stats(struct blkio_group *blkg, bool direction,
434                                         bool sync)
435 {
436         unsigned long flags;
437
438         spin_lock_irqsave(&blkg->stats_lock, flags);
439         blkio_add_stat(blkg->stats.stat_arr[BLKIO_STAT_MERGED], 1, direction,
440                         sync);
441         spin_unlock_irqrestore(&blkg->stats_lock, flags);
442 }
443 EXPORT_SYMBOL_GPL(blkiocg_update_io_merged_stats);
444
445 /*
446  * This function allocates the per cpu stats for blkio_group. Should be called
447  * from sleepable context as alloc_per_cpu() requires that.
448  */
449 int blkio_alloc_blkg_stats(struct blkio_group *blkg)
450 {
451         /* Allocate memory for per cpu stats */
452         blkg->stats_cpu = alloc_percpu(struct blkio_group_stats_cpu);
453         if (!blkg->stats_cpu)
454                 return -ENOMEM;
455         return 0;
456 }
457 EXPORT_SYMBOL_GPL(blkio_alloc_blkg_stats);
458
459 void blkiocg_add_blkio_group(struct blkio_cgroup *blkcg,
460                 struct blkio_group *blkg, void *key, dev_t dev,
461                 enum blkio_policy_id plid)
462 {
463         unsigned long flags;
464
465         spin_lock_irqsave(&blkcg->lock, flags);
466         spin_lock_init(&blkg->stats_lock);
467         rcu_assign_pointer(blkg->key, key);
468         blkg->blkcg_id = css_id(&blkcg->css);
469         hlist_add_head_rcu(&blkg->blkcg_node, &blkcg->blkg_list);
470         blkg->plid = plid;
471         spin_unlock_irqrestore(&blkcg->lock, flags);
472         /* Need to take css reference ? */
473         cgroup_path(blkcg->css.cgroup, blkg->path, sizeof(blkg->path));
474         blkg->dev = dev;
475 }
476 EXPORT_SYMBOL_GPL(blkiocg_add_blkio_group);
477
478 static void __blkiocg_del_blkio_group(struct blkio_group *blkg)
479 {
480         hlist_del_init_rcu(&blkg->blkcg_node);
481         blkg->blkcg_id = 0;
482 }
483
484 /*
485  * returns 0 if blkio_group was still on cgroup list. Otherwise returns 1
486  * indicating that blk_group was unhashed by the time we got to it.
487  */
488 int blkiocg_del_blkio_group(struct blkio_group *blkg)
489 {
490         struct blkio_cgroup *blkcg;
491         unsigned long flags;
492         struct cgroup_subsys_state *css;
493         int ret = 1;
494
495         rcu_read_lock();
496         css = css_lookup(&blkio_subsys, blkg->blkcg_id);
497         if (css) {
498                 blkcg = container_of(css, struct blkio_cgroup, css);
499                 spin_lock_irqsave(&blkcg->lock, flags);
500                 if (!hlist_unhashed(&blkg->blkcg_node)) {
501                         __blkiocg_del_blkio_group(blkg);
502                         ret = 0;
503                 }
504                 spin_unlock_irqrestore(&blkcg->lock, flags);
505         }
506
507         rcu_read_unlock();
508         return ret;
509 }
510 EXPORT_SYMBOL_GPL(blkiocg_del_blkio_group);
511
512 /* called under rcu_read_lock(). */
513 struct blkio_group *blkiocg_lookup_group(struct blkio_cgroup *blkcg, void *key)
514 {
515         struct blkio_group *blkg;
516         struct hlist_node *n;
517         void *__key;
518
519         hlist_for_each_entry_rcu(blkg, n, &blkcg->blkg_list, blkcg_node) {
520                 __key = blkg->key;
521                 if (__key == key)
522                         return blkg;
523         }
524
525         return NULL;
526 }
527 EXPORT_SYMBOL_GPL(blkiocg_lookup_group);
528
529 static int
530 blkiocg_reset_stats(struct cgroup *cgroup, struct cftype *cftype, u64 val)
531 {
532         struct blkio_cgroup *blkcg;
533         struct blkio_group *blkg;
534         struct blkio_group_stats *stats;
535         struct hlist_node *n;
536         uint64_t queued[BLKIO_STAT_TOTAL];
537         int i;
538 #ifdef CONFIG_DEBUG_BLK_CGROUP
539         bool idling, waiting, empty;
540         unsigned long long now = sched_clock();
541 #endif
542
543         blkcg = cgroup_to_blkio_cgroup(cgroup);
544         spin_lock_irq(&blkcg->lock);
545         hlist_for_each_entry(blkg, n, &blkcg->blkg_list, blkcg_node) {
546                 spin_lock(&blkg->stats_lock);
547                 stats = &blkg->stats;
548 #ifdef CONFIG_DEBUG_BLK_CGROUP
549                 idling = blkio_blkg_idling(stats);
550                 waiting = blkio_blkg_waiting(stats);
551                 empty = blkio_blkg_empty(stats);
552 #endif
553                 for (i = 0; i < BLKIO_STAT_TOTAL; i++)
554                         queued[i] = stats->stat_arr[BLKIO_STAT_QUEUED][i];
555                 memset(stats, 0, sizeof(struct blkio_group_stats));
556                 for (i = 0; i < BLKIO_STAT_TOTAL; i++)
557                         stats->stat_arr[BLKIO_STAT_QUEUED][i] = queued[i];
558 #ifdef CONFIG_DEBUG_BLK_CGROUP
559                 if (idling) {
560                         blkio_mark_blkg_idling(stats);
561                         stats->start_idle_time = now;
562                 }
563                 if (waiting) {
564                         blkio_mark_blkg_waiting(stats);
565                         stats->start_group_wait_time = now;
566                 }
567                 if (empty) {
568                         blkio_mark_blkg_empty(stats);
569                         stats->start_empty_time = now;
570                 }
571 #endif
572                 spin_unlock(&blkg->stats_lock);
573         }
574         spin_unlock_irq(&blkcg->lock);
575         return 0;
576 }
577
578 static void blkio_get_key_name(enum stat_sub_type type, dev_t dev, char *str,
579                                 int chars_left, bool diskname_only)
580 {
581         snprintf(str, chars_left, "%d:%d", MAJOR(dev), MINOR(dev));
582         chars_left -= strlen(str);
583         if (chars_left <= 0) {
584                 printk(KERN_WARNING
585                         "Possibly incorrect cgroup stat display format");
586                 return;
587         }
588         if (diskname_only)
589                 return;
590         switch (type) {
591         case BLKIO_STAT_READ:
592                 strlcat(str, " Read", chars_left);
593                 break;
594         case BLKIO_STAT_WRITE:
595                 strlcat(str, " Write", chars_left);
596                 break;
597         case BLKIO_STAT_SYNC:
598                 strlcat(str, " Sync", chars_left);
599                 break;
600         case BLKIO_STAT_ASYNC:
601                 strlcat(str, " Async", chars_left);
602                 break;
603         case BLKIO_STAT_TOTAL:
604                 strlcat(str, " Total", chars_left);
605                 break;
606         default:
607                 strlcat(str, " Invalid", chars_left);
608         }
609 }
610
611 static uint64_t blkio_fill_stat(char *str, int chars_left, uint64_t val,
612                                 struct cgroup_map_cb *cb, dev_t dev)
613 {
614         blkio_get_key_name(0, dev, str, chars_left, true);
615         cb->fill(cb, str, val);
616         return val;
617 }
618
619
620 static uint64_t blkio_read_stat_cpu(struct blkio_group *blkg,
621                         enum stat_type_cpu type, enum stat_sub_type sub_type)
622 {
623         int cpu;
624         struct blkio_group_stats_cpu *stats_cpu;
625         uint64_t val = 0;
626
627         for_each_possible_cpu(cpu) {
628                 stats_cpu  = per_cpu_ptr(blkg->stats_cpu, cpu);
629
630                 if (type == BLKIO_STAT_CPU_SECTORS)
631                         val += stats_cpu->sectors;
632                 else
633                         val += stats_cpu->stat_arr_cpu[type][sub_type];
634         }
635
636         return val;
637 }
638
639 static uint64_t blkio_get_stat_cpu(struct blkio_group *blkg,
640                 struct cgroup_map_cb *cb, dev_t dev, enum stat_type_cpu type)
641 {
642         uint64_t disk_total, val;
643         char key_str[MAX_KEY_LEN];
644         enum stat_sub_type sub_type;
645
646         if (type == BLKIO_STAT_CPU_SECTORS) {
647                 val = blkio_read_stat_cpu(blkg, type, 0);
648                 return blkio_fill_stat(key_str, MAX_KEY_LEN - 1, val, cb, dev);
649         }
650
651         for (sub_type = BLKIO_STAT_READ; sub_type < BLKIO_STAT_TOTAL;
652                         sub_type++) {
653                 blkio_get_key_name(sub_type, dev, key_str, MAX_KEY_LEN, false);
654                 val = blkio_read_stat_cpu(blkg, type, sub_type);
655                 cb->fill(cb, key_str, val);
656         }
657
658         disk_total = blkio_read_stat_cpu(blkg, type, BLKIO_STAT_READ) +
659                         blkio_read_stat_cpu(blkg, type, BLKIO_STAT_WRITE);
660
661         blkio_get_key_name(BLKIO_STAT_TOTAL, dev, key_str, MAX_KEY_LEN, false);
662         cb->fill(cb, key_str, disk_total);
663         return disk_total;
664 }
665
666 /* This should be called with blkg->stats_lock held */
667 static uint64_t blkio_get_stat(struct blkio_group *blkg,
668                 struct cgroup_map_cb *cb, dev_t dev, enum stat_type type)
669 {
670         uint64_t disk_total;
671         char key_str[MAX_KEY_LEN];
672         enum stat_sub_type sub_type;
673
674         if (type == BLKIO_STAT_TIME)
675                 return blkio_fill_stat(key_str, MAX_KEY_LEN - 1,
676                                         blkg->stats.time, cb, dev);
677 #ifdef CONFIG_DEBUG_BLK_CGROUP
678         if (type == BLKIO_STAT_UNACCOUNTED_TIME)
679                 return blkio_fill_stat(key_str, MAX_KEY_LEN - 1,
680                                         blkg->stats.unaccounted_time, cb, dev);
681         if (type == BLKIO_STAT_AVG_QUEUE_SIZE) {
682                 uint64_t sum = blkg->stats.avg_queue_size_sum;
683                 uint64_t samples = blkg->stats.avg_queue_size_samples;
684                 if (samples)
685                         do_div(sum, samples);
686                 else
687                         sum = 0;
688                 return blkio_fill_stat(key_str, MAX_KEY_LEN - 1, sum, cb, dev);
689         }
690         if (type == BLKIO_STAT_GROUP_WAIT_TIME)
691                 return blkio_fill_stat(key_str, MAX_KEY_LEN - 1,
692                                         blkg->stats.group_wait_time, cb, dev);
693         if (type == BLKIO_STAT_IDLE_TIME)
694                 return blkio_fill_stat(key_str, MAX_KEY_LEN - 1,
695                                         blkg->stats.idle_time, cb, dev);
696         if (type == BLKIO_STAT_EMPTY_TIME)
697                 return blkio_fill_stat(key_str, MAX_KEY_LEN - 1,
698                                         blkg->stats.empty_time, cb, dev);
699         if (type == BLKIO_STAT_DEQUEUE)
700                 return blkio_fill_stat(key_str, MAX_KEY_LEN - 1,
701                                         blkg->stats.dequeue, cb, dev);
702 #endif
703
704         for (sub_type = BLKIO_STAT_READ; sub_type < BLKIO_STAT_TOTAL;
705                         sub_type++) {
706                 blkio_get_key_name(sub_type, dev, key_str, MAX_KEY_LEN, false);
707                 cb->fill(cb, key_str, blkg->stats.stat_arr[type][sub_type]);
708         }
709         disk_total = blkg->stats.stat_arr[type][BLKIO_STAT_READ] +
710                         blkg->stats.stat_arr[type][BLKIO_STAT_WRITE];
711         blkio_get_key_name(BLKIO_STAT_TOTAL, dev, key_str, MAX_KEY_LEN, false);
712         cb->fill(cb, key_str, disk_total);
713         return disk_total;
714 }
715
716 static int blkio_check_dev_num(dev_t dev)
717 {
718         int part = 0;
719         struct gendisk *disk;
720
721         disk = get_gendisk(dev, &part);
722         if (!disk || part)
723                 return -ENODEV;
724
725         return 0;
726 }
727
728 static int blkio_policy_parse_and_set(char *buf,
729         struct blkio_policy_node *newpn, enum blkio_policy_id plid, int fileid)
730 {
731         char *s[4], *p, *major_s = NULL, *minor_s = NULL;
732         int ret;
733         unsigned long major, minor, temp;
734         int i = 0;
735         dev_t dev;
736         u64 bps, iops;
737
738         memset(s, 0, sizeof(s));
739
740         while ((p = strsep(&buf, " ")) != NULL) {
741                 if (!*p)
742                         continue;
743
744                 s[i++] = p;
745
746                 /* Prevent from inputing too many things */
747                 if (i == 3)
748                         break;
749         }
750
751         if (i != 2)
752                 return -EINVAL;
753
754         p = strsep(&s[0], ":");
755         if (p != NULL)
756                 major_s = p;
757         else
758                 return -EINVAL;
759
760         minor_s = s[0];
761         if (!minor_s)
762                 return -EINVAL;
763
764         ret = strict_strtoul(major_s, 10, &major);
765         if (ret)
766                 return -EINVAL;
767
768         ret = strict_strtoul(minor_s, 10, &minor);
769         if (ret)
770                 return -EINVAL;
771
772         dev = MKDEV(major, minor);
773
774         ret = blkio_check_dev_num(dev);
775         if (ret)
776                 return ret;
777
778         newpn->dev = dev;
779
780         if (s[1] == NULL)
781                 return -EINVAL;
782
783         switch (plid) {
784         case BLKIO_POLICY_PROP:
785                 ret = strict_strtoul(s[1], 10, &temp);
786                 if (ret || (temp < BLKIO_WEIGHT_MIN && temp > 0) ||
787                         temp > BLKIO_WEIGHT_MAX)
788                         return -EINVAL;
789
790                 newpn->plid = plid;
791                 newpn->fileid = fileid;
792                 newpn->val.weight = temp;
793                 break;
794         case BLKIO_POLICY_THROTL:
795                 switch(fileid) {
796                 case BLKIO_THROTL_read_bps_device:
797                 case BLKIO_THROTL_write_bps_device:
798                         ret = strict_strtoull(s[1], 10, &bps);
799                         if (ret)
800                                 return -EINVAL;
801
802                         newpn->plid = plid;
803                         newpn->fileid = fileid;
804                         newpn->val.bps = bps;
805                         break;
806                 case BLKIO_THROTL_read_iops_device:
807                 case BLKIO_THROTL_write_iops_device:
808                         ret = strict_strtoull(s[1], 10, &iops);
809                         if (ret)
810                                 return -EINVAL;
811
812                         if (iops > THROTL_IOPS_MAX)
813                                 return -EINVAL;
814
815                         newpn->plid = plid;
816                         newpn->fileid = fileid;
817                         newpn->val.iops = (unsigned int)iops;
818                         break;
819                 }
820                 break;
821         default:
822                 BUG();
823         }
824
825         return 0;
826 }
827
828 unsigned int blkcg_get_weight(struct blkio_cgroup *blkcg,
829                               dev_t dev)
830 {
831         struct blkio_policy_node *pn;
832
833         pn = blkio_policy_search_node(blkcg, dev, BLKIO_POLICY_PROP,
834                                 BLKIO_PROP_weight_device);
835         if (pn)
836                 return pn->val.weight;
837         else
838                 return blkcg->weight;
839 }
840 EXPORT_SYMBOL_GPL(blkcg_get_weight);
841
842 uint64_t blkcg_get_read_bps(struct blkio_cgroup *blkcg, dev_t dev)
843 {
844         struct blkio_policy_node *pn;
845
846         pn = blkio_policy_search_node(blkcg, dev, BLKIO_POLICY_THROTL,
847                                 BLKIO_THROTL_read_bps_device);
848         if (pn)
849                 return pn->val.bps;
850         else
851                 return -1;
852 }
853
854 uint64_t blkcg_get_write_bps(struct blkio_cgroup *blkcg, dev_t dev)
855 {
856         struct blkio_policy_node *pn;
857         pn = blkio_policy_search_node(blkcg, dev, BLKIO_POLICY_THROTL,
858                                 BLKIO_THROTL_write_bps_device);
859         if (pn)
860                 return pn->val.bps;
861         else
862                 return -1;
863 }
864
865 unsigned int blkcg_get_read_iops(struct blkio_cgroup *blkcg, dev_t dev)
866 {
867         struct blkio_policy_node *pn;
868
869         pn = blkio_policy_search_node(blkcg, dev, BLKIO_POLICY_THROTL,
870                                 BLKIO_THROTL_read_iops_device);
871         if (pn)
872                 return pn->val.iops;
873         else
874                 return -1;
875 }
876
877 unsigned int blkcg_get_write_iops(struct blkio_cgroup *blkcg, dev_t dev)
878 {
879         struct blkio_policy_node *pn;
880         pn = blkio_policy_search_node(blkcg, dev, BLKIO_POLICY_THROTL,
881                                 BLKIO_THROTL_write_iops_device);
882         if (pn)
883                 return pn->val.iops;
884         else
885                 return -1;
886 }
887
888 /* Checks whether user asked for deleting a policy rule */
889 static bool blkio_delete_rule_command(struct blkio_policy_node *pn)
890 {
891         switch(pn->plid) {
892         case BLKIO_POLICY_PROP:
893                 if (pn->val.weight == 0)
894                         return 1;
895                 break;
896         case BLKIO_POLICY_THROTL:
897                 switch(pn->fileid) {
898                 case BLKIO_THROTL_read_bps_device:
899                 case BLKIO_THROTL_write_bps_device:
900                         if (pn->val.bps == 0)
901                                 return 1;
902                         break;
903                 case BLKIO_THROTL_read_iops_device:
904                 case BLKIO_THROTL_write_iops_device:
905                         if (pn->val.iops == 0)
906                                 return 1;
907                 }
908                 break;
909         default:
910                 BUG();
911         }
912
913         return 0;
914 }
915
916 static void blkio_update_policy_rule(struct blkio_policy_node *oldpn,
917                                         struct blkio_policy_node *newpn)
918 {
919         switch(oldpn->plid) {
920         case BLKIO_POLICY_PROP:
921                 oldpn->val.weight = newpn->val.weight;
922                 break;
923         case BLKIO_POLICY_THROTL:
924                 switch(newpn->fileid) {
925                 case BLKIO_THROTL_read_bps_device:
926                 case BLKIO_THROTL_write_bps_device:
927                         oldpn->val.bps = newpn->val.bps;
928                         break;
929                 case BLKIO_THROTL_read_iops_device:
930                 case BLKIO_THROTL_write_iops_device:
931                         oldpn->val.iops = newpn->val.iops;
932                 }
933                 break;
934         default:
935                 BUG();
936         }
937 }
938
939 /*
940  * Some rules/values in blkg have changed. Propagate those to respective
941  * policies.
942  */
943 static void blkio_update_blkg_policy(struct blkio_cgroup *blkcg,
944                 struct blkio_group *blkg, struct blkio_policy_node *pn)
945 {
946         unsigned int weight, iops;
947         u64 bps;
948
949         switch(pn->plid) {
950         case BLKIO_POLICY_PROP:
951                 weight = pn->val.weight ? pn->val.weight :
952                                 blkcg->weight;
953                 blkio_update_group_weight(blkg, weight);
954                 break;
955         case BLKIO_POLICY_THROTL:
956                 switch(pn->fileid) {
957                 case BLKIO_THROTL_read_bps_device:
958                 case BLKIO_THROTL_write_bps_device:
959                         bps = pn->val.bps ? pn->val.bps : (-1);
960                         blkio_update_group_bps(blkg, bps, pn->fileid);
961                         break;
962                 case BLKIO_THROTL_read_iops_device:
963                 case BLKIO_THROTL_write_iops_device:
964                         iops = pn->val.iops ? pn->val.iops : (-1);
965                         blkio_update_group_iops(blkg, iops, pn->fileid);
966                         break;
967                 }
968                 break;
969         default:
970                 BUG();
971         }
972 }
973
974 /*
975  * A policy node rule has been updated. Propagate this update to all the
976  * block groups which might be affected by this update.
977  */
978 static void blkio_update_policy_node_blkg(struct blkio_cgroup *blkcg,
979                                 struct blkio_policy_node *pn)
980 {
981         struct blkio_group *blkg;
982         struct hlist_node *n;
983
984         spin_lock(&blkio_list_lock);
985         spin_lock_irq(&blkcg->lock);
986
987         hlist_for_each_entry(blkg, n, &blkcg->blkg_list, blkcg_node) {
988                 if (pn->dev != blkg->dev || pn->plid != blkg->plid)
989                         continue;
990                 blkio_update_blkg_policy(blkcg, blkg, pn);
991         }
992
993         spin_unlock_irq(&blkcg->lock);
994         spin_unlock(&blkio_list_lock);
995 }
996
997 static int blkiocg_file_write(struct cgroup *cgrp, struct cftype *cft,
998                                        const char *buffer)
999 {
1000         int ret = 0;
1001         char *buf;
1002         struct blkio_policy_node *newpn, *pn;
1003         struct blkio_cgroup *blkcg;
1004         int keep_newpn = 0;
1005         enum blkio_policy_id plid = BLKIOFILE_POLICY(cft->private);
1006         int fileid = BLKIOFILE_ATTR(cft->private);
1007
1008         buf = kstrdup(buffer, GFP_KERNEL);
1009         if (!buf)
1010                 return -ENOMEM;
1011
1012         newpn = kzalloc(sizeof(*newpn), GFP_KERNEL);
1013         if (!newpn) {
1014                 ret = -ENOMEM;
1015                 goto free_buf;
1016         }
1017
1018         ret = blkio_policy_parse_and_set(buf, newpn, plid, fileid);
1019         if (ret)
1020                 goto free_newpn;
1021
1022         blkcg = cgroup_to_blkio_cgroup(cgrp);
1023
1024         spin_lock_irq(&blkcg->lock);
1025
1026         pn = blkio_policy_search_node(blkcg, newpn->dev, plid, fileid);
1027         if (!pn) {
1028                 if (!blkio_delete_rule_command(newpn)) {
1029                         blkio_policy_insert_node(blkcg, newpn);
1030                         keep_newpn = 1;
1031                 }
1032                 spin_unlock_irq(&blkcg->lock);
1033                 goto update_io_group;
1034         }
1035
1036         if (blkio_delete_rule_command(newpn)) {
1037                 blkio_policy_delete_node(pn);
1038                 spin_unlock_irq(&blkcg->lock);
1039                 goto update_io_group;
1040         }
1041         spin_unlock_irq(&blkcg->lock);
1042
1043         blkio_update_policy_rule(pn, newpn);
1044
1045 update_io_group:
1046         blkio_update_policy_node_blkg(blkcg, newpn);
1047
1048 free_newpn:
1049         if (!keep_newpn)
1050                 kfree(newpn);
1051 free_buf:
1052         kfree(buf);
1053         return ret;
1054 }
1055
1056 static void
1057 blkio_print_policy_node(struct seq_file *m, struct blkio_policy_node *pn)
1058 {
1059         switch(pn->plid) {
1060                 case BLKIO_POLICY_PROP:
1061                         if (pn->fileid == BLKIO_PROP_weight_device)
1062                                 seq_printf(m, "%u:%u\t%u\n", MAJOR(pn->dev),
1063                                         MINOR(pn->dev), pn->val.weight);
1064                         break;
1065                 case BLKIO_POLICY_THROTL:
1066                         switch(pn->fileid) {
1067                         case BLKIO_THROTL_read_bps_device:
1068                         case BLKIO_THROTL_write_bps_device:
1069                                 seq_printf(m, "%u:%u\t%llu\n", MAJOR(pn->dev),
1070                                         MINOR(pn->dev), pn->val.bps);
1071                                 break;
1072                         case BLKIO_THROTL_read_iops_device:
1073                         case BLKIO_THROTL_write_iops_device:
1074                                 seq_printf(m, "%u:%u\t%u\n", MAJOR(pn->dev),
1075                                         MINOR(pn->dev), pn->val.iops);
1076                                 break;
1077                         }
1078                         break;
1079                 default:
1080                         BUG();
1081         }
1082 }
1083
1084 /* cgroup files which read their data from policy nodes end up here */
1085 static void blkio_read_policy_node_files(struct cftype *cft,
1086                         struct blkio_cgroup *blkcg, struct seq_file *m)
1087 {
1088         struct blkio_policy_node *pn;
1089
1090         if (!list_empty(&blkcg->policy_list)) {
1091                 spin_lock_irq(&blkcg->lock);
1092                 list_for_each_entry(pn, &blkcg->policy_list, node) {
1093                         if (!pn_matches_cftype(cft, pn))
1094                                 continue;
1095                         blkio_print_policy_node(m, pn);
1096                 }
1097                 spin_unlock_irq(&blkcg->lock);
1098         }
1099 }
1100
1101 static int blkiocg_file_read(struct cgroup *cgrp, struct cftype *cft,
1102                                 struct seq_file *m)
1103 {
1104         struct blkio_cgroup *blkcg;
1105         enum blkio_policy_id plid = BLKIOFILE_POLICY(cft->private);
1106         int name = BLKIOFILE_ATTR(cft->private);
1107
1108         blkcg = cgroup_to_blkio_cgroup(cgrp);
1109
1110         switch(plid) {
1111         case BLKIO_POLICY_PROP:
1112                 switch(name) {
1113                 case BLKIO_PROP_weight_device:
1114                         blkio_read_policy_node_files(cft, blkcg, m);
1115                         return 0;
1116                 default:
1117                         BUG();
1118                 }
1119                 break;
1120         case BLKIO_POLICY_THROTL:
1121                 switch(name){
1122                 case BLKIO_THROTL_read_bps_device:
1123                 case BLKIO_THROTL_write_bps_device:
1124                 case BLKIO_THROTL_read_iops_device:
1125                 case BLKIO_THROTL_write_iops_device:
1126                         blkio_read_policy_node_files(cft, blkcg, m);
1127                         return 0;
1128                 default:
1129                         BUG();
1130                 }
1131                 break;
1132         default:
1133                 BUG();
1134         }
1135
1136         return 0;
1137 }
1138
1139 static int blkio_read_blkg_stats(struct blkio_cgroup *blkcg,
1140                 struct cftype *cft, struct cgroup_map_cb *cb,
1141                 enum stat_type type, bool show_total, bool pcpu)
1142 {
1143         struct blkio_group *blkg;
1144         struct hlist_node *n;
1145         uint64_t cgroup_total = 0;
1146
1147         rcu_read_lock();
1148         hlist_for_each_entry_rcu(blkg, n, &blkcg->blkg_list, blkcg_node) {
1149                 if (blkg->dev) {
1150                         if (!cftype_blkg_same_policy(cft, blkg))
1151                                 continue;
1152                         if (pcpu)
1153                                 cgroup_total += blkio_get_stat_cpu(blkg, cb,
1154                                                 blkg->dev, type);
1155                         else {
1156                                 spin_lock_irq(&blkg->stats_lock);
1157                                 cgroup_total += blkio_get_stat(blkg, cb,
1158                                                 blkg->dev, type);
1159                                 spin_unlock_irq(&blkg->stats_lock);
1160                         }
1161                 }
1162         }
1163         if (show_total)
1164                 cb->fill(cb, "Total", cgroup_total);
1165         rcu_read_unlock();
1166         return 0;
1167 }
1168
1169 /* All map kind of cgroup file get serviced by this function */
1170 static int blkiocg_file_read_map(struct cgroup *cgrp, struct cftype *cft,
1171                                 struct cgroup_map_cb *cb)
1172 {
1173         struct blkio_cgroup *blkcg;
1174         enum blkio_policy_id plid = BLKIOFILE_POLICY(cft->private);
1175         int name = BLKIOFILE_ATTR(cft->private);
1176
1177         blkcg = cgroup_to_blkio_cgroup(cgrp);
1178
1179         switch(plid) {
1180         case BLKIO_POLICY_PROP:
1181                 switch(name) {
1182                 case BLKIO_PROP_time:
1183                         return blkio_read_blkg_stats(blkcg, cft, cb,
1184                                                 BLKIO_STAT_TIME, 0, 0);
1185                 case BLKIO_PROP_sectors:
1186                         return blkio_read_blkg_stats(blkcg, cft, cb,
1187                                                 BLKIO_STAT_CPU_SECTORS, 0, 1);
1188                 case BLKIO_PROP_io_service_bytes:
1189                         return blkio_read_blkg_stats(blkcg, cft, cb,
1190                                         BLKIO_STAT_CPU_SERVICE_BYTES, 1, 1);
1191                 case BLKIO_PROP_io_serviced:
1192                         return blkio_read_blkg_stats(blkcg, cft, cb,
1193                                                 BLKIO_STAT_CPU_SERVICED, 1, 1);
1194                 case BLKIO_PROP_io_service_time:
1195                         return blkio_read_blkg_stats(blkcg, cft, cb,
1196                                                 BLKIO_STAT_SERVICE_TIME, 1, 0);
1197                 case BLKIO_PROP_io_wait_time:
1198                         return blkio_read_blkg_stats(blkcg, cft, cb,
1199                                                 BLKIO_STAT_WAIT_TIME, 1, 0);
1200                 case BLKIO_PROP_io_merged:
1201                         return blkio_read_blkg_stats(blkcg, cft, cb,
1202                                                 BLKIO_STAT_MERGED, 1, 0);
1203                 case BLKIO_PROP_io_queued:
1204                         return blkio_read_blkg_stats(blkcg, cft, cb,
1205                                                 BLKIO_STAT_QUEUED, 1, 0);
1206 #ifdef CONFIG_DEBUG_BLK_CGROUP
1207                 case BLKIO_PROP_unaccounted_time:
1208                         return blkio_read_blkg_stats(blkcg, cft, cb,
1209                                         BLKIO_STAT_UNACCOUNTED_TIME, 0, 0);
1210                 case BLKIO_PROP_dequeue:
1211                         return blkio_read_blkg_stats(blkcg, cft, cb,
1212                                                 BLKIO_STAT_DEQUEUE, 0, 0);
1213                 case BLKIO_PROP_avg_queue_size:
1214                         return blkio_read_blkg_stats(blkcg, cft, cb,
1215                                         BLKIO_STAT_AVG_QUEUE_SIZE, 0, 0);
1216                 case BLKIO_PROP_group_wait_time:
1217                         return blkio_read_blkg_stats(blkcg, cft, cb,
1218                                         BLKIO_STAT_GROUP_WAIT_TIME, 0, 0);
1219                 case BLKIO_PROP_idle_time:
1220                         return blkio_read_blkg_stats(blkcg, cft, cb,
1221                                                 BLKIO_STAT_IDLE_TIME, 0, 0);
1222                 case BLKIO_PROP_empty_time:
1223                         return blkio_read_blkg_stats(blkcg, cft, cb,
1224                                                 BLKIO_STAT_EMPTY_TIME, 0, 0);
1225 #endif
1226                 default:
1227                         BUG();
1228                 }
1229                 break;
1230         case BLKIO_POLICY_THROTL:
1231                 switch(name){
1232                 case BLKIO_THROTL_io_service_bytes:
1233                         return blkio_read_blkg_stats(blkcg, cft, cb,
1234                                                 BLKIO_STAT_CPU_SERVICE_BYTES, 1, 1);
1235                 case BLKIO_THROTL_io_serviced:
1236                         return blkio_read_blkg_stats(blkcg, cft, cb,
1237                                                 BLKIO_STAT_CPU_SERVICED, 1, 1);
1238                 default:
1239                         BUG();
1240                 }
1241                 break;
1242         default:
1243                 BUG();
1244         }
1245
1246         return 0;
1247 }
1248
1249 static int blkio_weight_write(struct blkio_cgroup *blkcg, u64 val)
1250 {
1251         struct blkio_group *blkg;
1252         struct hlist_node *n;
1253         struct blkio_policy_node *pn;
1254
1255         if (val < BLKIO_WEIGHT_MIN || val > BLKIO_WEIGHT_MAX)
1256                 return -EINVAL;
1257
1258         spin_lock(&blkio_list_lock);
1259         spin_lock_irq(&blkcg->lock);
1260         blkcg->weight = (unsigned int)val;
1261
1262         hlist_for_each_entry(blkg, n, &blkcg->blkg_list, blkcg_node) {
1263                 pn = blkio_policy_search_node(blkcg, blkg->dev,
1264                                 BLKIO_POLICY_PROP, BLKIO_PROP_weight_device);
1265                 if (pn)
1266                         continue;
1267
1268                 blkio_update_group_weight(blkg, blkcg->weight);
1269         }
1270         spin_unlock_irq(&blkcg->lock);
1271         spin_unlock(&blkio_list_lock);
1272         return 0;
1273 }
1274
1275 static u64 blkiocg_file_read_u64 (struct cgroup *cgrp, struct cftype *cft) {
1276         struct blkio_cgroup *blkcg;
1277         enum blkio_policy_id plid = BLKIOFILE_POLICY(cft->private);
1278         int name = BLKIOFILE_ATTR(cft->private);
1279
1280         blkcg = cgroup_to_blkio_cgroup(cgrp);
1281
1282         switch(plid) {
1283         case BLKIO_POLICY_PROP:
1284                 switch(name) {
1285                 case BLKIO_PROP_weight:
1286                         return (u64)blkcg->weight;
1287                 }
1288                 break;
1289         default:
1290                 BUG();
1291         }
1292         return 0;
1293 }
1294
1295 static int
1296 blkiocg_file_write_u64(struct cgroup *cgrp, struct cftype *cft, u64 val)
1297 {
1298         struct blkio_cgroup *blkcg;
1299         enum blkio_policy_id plid = BLKIOFILE_POLICY(cft->private);
1300         int name = BLKIOFILE_ATTR(cft->private);
1301
1302         blkcg = cgroup_to_blkio_cgroup(cgrp);
1303
1304         switch(plid) {
1305         case BLKIO_POLICY_PROP:
1306                 switch(name) {
1307                 case BLKIO_PROP_weight:
1308                         return blkio_weight_write(blkcg, val);
1309                 }
1310                 break;
1311         default:
1312                 BUG();
1313         }
1314
1315         return 0;
1316 }
1317
1318 struct cftype blkio_files[] = {
1319         {
1320                 .name = "weight_device",
1321                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1322                                 BLKIO_PROP_weight_device),
1323                 .read_seq_string = blkiocg_file_read,
1324                 .write_string = blkiocg_file_write,
1325                 .max_write_len = 256,
1326         },
1327         {
1328                 .name = "weight",
1329                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1330                                 BLKIO_PROP_weight),
1331                 .read_u64 = blkiocg_file_read_u64,
1332                 .write_u64 = blkiocg_file_write_u64,
1333         },
1334         {
1335                 .name = "time",
1336                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1337                                 BLKIO_PROP_time),
1338                 .read_map = blkiocg_file_read_map,
1339         },
1340         {
1341                 .name = "sectors",
1342                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1343                                 BLKIO_PROP_sectors),
1344                 .read_map = blkiocg_file_read_map,
1345         },
1346         {
1347                 .name = "io_service_bytes",
1348                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1349                                 BLKIO_PROP_io_service_bytes),
1350                 .read_map = blkiocg_file_read_map,
1351         },
1352         {
1353                 .name = "io_serviced",
1354                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1355                                 BLKIO_PROP_io_serviced),
1356                 .read_map = blkiocg_file_read_map,
1357         },
1358         {
1359                 .name = "io_service_time",
1360                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1361                                 BLKIO_PROP_io_service_time),
1362                 .read_map = blkiocg_file_read_map,
1363         },
1364         {
1365                 .name = "io_wait_time",
1366                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1367                                 BLKIO_PROP_io_wait_time),
1368                 .read_map = blkiocg_file_read_map,
1369         },
1370         {
1371                 .name = "io_merged",
1372                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1373                                 BLKIO_PROP_io_merged),
1374                 .read_map = blkiocg_file_read_map,
1375         },
1376         {
1377                 .name = "io_queued",
1378                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1379                                 BLKIO_PROP_io_queued),
1380                 .read_map = blkiocg_file_read_map,
1381         },
1382         {
1383                 .name = "reset_stats",
1384                 .write_u64 = blkiocg_reset_stats,
1385         },
1386 #ifdef CONFIG_BLK_DEV_THROTTLING
1387         {
1388                 .name = "throttle.read_bps_device",
1389                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_THROTL,
1390                                 BLKIO_THROTL_read_bps_device),
1391                 .read_seq_string = blkiocg_file_read,
1392                 .write_string = blkiocg_file_write,
1393                 .max_write_len = 256,
1394         },
1395
1396         {
1397                 .name = "throttle.write_bps_device",
1398                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_THROTL,
1399                                 BLKIO_THROTL_write_bps_device),
1400                 .read_seq_string = blkiocg_file_read,
1401                 .write_string = blkiocg_file_write,
1402                 .max_write_len = 256,
1403         },
1404
1405         {
1406                 .name = "throttle.read_iops_device",
1407                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_THROTL,
1408                                 BLKIO_THROTL_read_iops_device),
1409                 .read_seq_string = blkiocg_file_read,
1410                 .write_string = blkiocg_file_write,
1411                 .max_write_len = 256,
1412         },
1413
1414         {
1415                 .name = "throttle.write_iops_device",
1416                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_THROTL,
1417                                 BLKIO_THROTL_write_iops_device),
1418                 .read_seq_string = blkiocg_file_read,
1419                 .write_string = blkiocg_file_write,
1420                 .max_write_len = 256,
1421         },
1422         {
1423                 .name = "throttle.io_service_bytes",
1424                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_THROTL,
1425                                 BLKIO_THROTL_io_service_bytes),
1426                 .read_map = blkiocg_file_read_map,
1427         },
1428         {
1429                 .name = "throttle.io_serviced",
1430                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_THROTL,
1431                                 BLKIO_THROTL_io_serviced),
1432                 .read_map = blkiocg_file_read_map,
1433         },
1434 #endif /* CONFIG_BLK_DEV_THROTTLING */
1435
1436 #ifdef CONFIG_DEBUG_BLK_CGROUP
1437         {
1438                 .name = "avg_queue_size",
1439                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1440                                 BLKIO_PROP_avg_queue_size),
1441                 .read_map = blkiocg_file_read_map,
1442         },
1443         {
1444                 .name = "group_wait_time",
1445                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1446                                 BLKIO_PROP_group_wait_time),
1447                 .read_map = blkiocg_file_read_map,
1448         },
1449         {
1450                 .name = "idle_time",
1451                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1452                                 BLKIO_PROP_idle_time),
1453                 .read_map = blkiocg_file_read_map,
1454         },
1455         {
1456                 .name = "empty_time",
1457                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1458                                 BLKIO_PROP_empty_time),
1459                 .read_map = blkiocg_file_read_map,
1460         },
1461         {
1462                 .name = "dequeue",
1463                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1464                                 BLKIO_PROP_dequeue),
1465                 .read_map = blkiocg_file_read_map,
1466         },
1467         {
1468                 .name = "unaccounted_time",
1469                 .private = BLKIOFILE_PRIVATE(BLKIO_POLICY_PROP,
1470                                 BLKIO_PROP_unaccounted_time),
1471                 .read_map = blkiocg_file_read_map,
1472         },
1473 #endif
1474 };
1475
1476 static int blkiocg_populate(struct cgroup_subsys *subsys, struct cgroup *cgroup)
1477 {
1478         return cgroup_add_files(cgroup, subsys, blkio_files,
1479                                 ARRAY_SIZE(blkio_files));
1480 }
1481
1482 static void blkiocg_destroy(struct cgroup_subsys *subsys, struct cgroup *cgroup)
1483 {
1484         struct blkio_cgroup *blkcg = cgroup_to_blkio_cgroup(cgroup);
1485         unsigned long flags;
1486         struct blkio_group *blkg;
1487         void *key;
1488         struct blkio_policy_type *blkiop;
1489         struct blkio_policy_node *pn, *pntmp;
1490
1491         rcu_read_lock();
1492         do {
1493                 spin_lock_irqsave(&blkcg->lock, flags);
1494
1495                 if (hlist_empty(&blkcg->blkg_list)) {
1496                         spin_unlock_irqrestore(&blkcg->lock, flags);
1497                         break;
1498                 }
1499
1500                 blkg = hlist_entry(blkcg->blkg_list.first, struct blkio_group,
1501                                         blkcg_node);
1502                 key = rcu_dereference(blkg->key);
1503                 __blkiocg_del_blkio_group(blkg);
1504
1505                 spin_unlock_irqrestore(&blkcg->lock, flags);
1506
1507                 /*
1508                  * This blkio_group is being unlinked as associated cgroup is
1509                  * going away. Let all the IO controlling policies know about
1510                  * this event.
1511                  */
1512                 spin_lock(&blkio_list_lock);
1513                 list_for_each_entry(blkiop, &blkio_list, list) {
1514                         if (blkiop->plid != blkg->plid)
1515                                 continue;
1516                         blkiop->ops.blkio_unlink_group_fn(key, blkg);
1517                 }
1518                 spin_unlock(&blkio_list_lock);
1519         } while (1);
1520
1521         list_for_each_entry_safe(pn, pntmp, &blkcg->policy_list, node) {
1522                 blkio_policy_delete_node(pn);
1523                 kfree(pn);
1524         }
1525
1526         free_css_id(&blkio_subsys, &blkcg->css);
1527         rcu_read_unlock();
1528         if (blkcg != &blkio_root_cgroup)
1529                 kfree(blkcg);
1530 }
1531
1532 static struct cgroup_subsys_state *
1533 blkiocg_create(struct cgroup_subsys *subsys, struct cgroup *cgroup)
1534 {
1535         struct blkio_cgroup *blkcg;
1536         struct cgroup *parent = cgroup->parent;
1537
1538         if (!parent) {
1539                 blkcg = &blkio_root_cgroup;
1540                 goto done;
1541         }
1542
1543         blkcg = kzalloc(sizeof(*blkcg), GFP_KERNEL);
1544         if (!blkcg)
1545                 return ERR_PTR(-ENOMEM);
1546
1547         blkcg->weight = BLKIO_WEIGHT_DEFAULT;
1548 done:
1549         spin_lock_init(&blkcg->lock);
1550         INIT_HLIST_HEAD(&blkcg->blkg_list);
1551
1552         INIT_LIST_HEAD(&blkcg->policy_list);
1553         return &blkcg->css;
1554 }
1555
1556 /*
1557  * We cannot support shared io contexts, as we have no mean to support
1558  * two tasks with the same ioc in two different groups without major rework
1559  * of the main cic data structures.  For now we allow a task to change
1560  * its cgroup only if it's the only owner of its ioc.
1561  */
1562 static int blkiocg_can_attach(struct cgroup_subsys *subsys,
1563                                 struct cgroup *cgroup, struct task_struct *tsk,
1564                                 bool threadgroup)
1565 {
1566         struct io_context *ioc;
1567         int ret = 0;
1568
1569         /* task_lock() is needed to avoid races with exit_io_context() */
1570         task_lock(tsk);
1571         ioc = tsk->io_context;
1572         if (ioc && atomic_read(&ioc->nr_tasks) > 1)
1573                 ret = -EINVAL;
1574         task_unlock(tsk);
1575
1576         return ret;
1577 }
1578
1579 static void blkiocg_attach(struct cgroup_subsys *subsys, struct cgroup *cgroup,
1580                                 struct cgroup *prev, struct task_struct *tsk,
1581                                 bool threadgroup)
1582 {
1583         struct io_context *ioc;
1584
1585         task_lock(tsk);
1586         ioc = tsk->io_context;
1587         if (ioc)
1588                 ioc->cgroup_changed = 1;
1589         task_unlock(tsk);
1590 }
1591
1592 void blkio_policy_register(struct blkio_policy_type *blkiop)
1593 {
1594         spin_lock(&blkio_list_lock);
1595         list_add_tail(&blkiop->list, &blkio_list);
1596         spin_unlock(&blkio_list_lock);
1597 }
1598 EXPORT_SYMBOL_GPL(blkio_policy_register);
1599
1600 void blkio_policy_unregister(struct blkio_policy_type *blkiop)
1601 {
1602         spin_lock(&blkio_list_lock);
1603         list_del_init(&blkiop->list);
1604         spin_unlock(&blkio_list_lock);
1605 }
1606 EXPORT_SYMBOL_GPL(blkio_policy_unregister);
1607
1608 static int __init init_cgroup_blkio(void)
1609 {
1610         return cgroup_load_subsys(&blkio_subsys);
1611 }
1612
1613 static void __exit exit_cgroup_blkio(void)
1614 {
1615         cgroup_unload_subsys(&blkio_subsys);
1616 }
1617
1618 module_init(init_cgroup_blkio);
1619 module_exit(exit_cgroup_blkio);
1620 MODULE_LICENSE("GPL");