1 #ifndef _BLK_CGROUP_H 2 #define _BLK_CGROUP_H 3 /* 4 * Common Block IO controller cgroup interface 5 * 6 * Based on ideas and code from CFQ, CFS and BFQ: 7 * Copyright (C) 2003 Jens Axboe <axboe@kernel.dk> 8 * 9 * Copyright (C) 2008 Fabio Checconi <fabio@gandalf.sssup.it> 10 * Paolo Valente <paolo.valente@unimore.it> 11 * 12 * Copyright (C) 2009 Vivek Goyal <vgoyal@redhat.com> 13 * Nauman Rafique <nauman@google.com> 14 */ 15 16 #include <linux/cgroup.h> 17 18 #ifdef CONFIG_BLK_CGROUP 19 20 struct blkio_cgroup { 21 struct cgroup_subsys_state css; 22 unsigned int weight; 23 spinlock_t lock; 24 struct hlist_head blkg_list; 25 }; 26 27 struct blkio_group { 28 /* An rcu protected unique identifier for the group */ 29 void *key; 30 struct hlist_node blkcg_node; 31 unsigned short blkcg_id; 32 #ifdef CONFIG_DEBUG_BLK_CGROUP 33 /* Store cgroup path */ 34 char path[128]; 35 /* How many times this group has been removed from service tree */ 36 unsigned long dequeue; 37 #endif 38 /* The device MKDEV(major, minor), this group has been created for */ 39 dev_t dev; 40 41 /* total disk time and nr sectors dispatched by this group */ 42 unsigned long time; 43 unsigned long sectors; 44 }; 45 46 extern bool blkiocg_css_tryget(struct blkio_cgroup *blkcg); 47 extern void blkiocg_css_put(struct blkio_cgroup *blkcg); 48 49 typedef void (blkio_unlink_group_fn) (void *key, struct blkio_group *blkg); 50 typedef void (blkio_update_group_weight_fn) (struct blkio_group *blkg, 51 unsigned int weight); 52 53 struct blkio_policy_ops { 54 blkio_unlink_group_fn *blkio_unlink_group_fn; 55 blkio_update_group_weight_fn *blkio_update_group_weight_fn; 56 }; 57 58 struct blkio_policy_type { 59 struct list_head list; 60 struct blkio_policy_ops ops; 61 }; 62 63 /* Blkio controller policy registration */ 64 extern void blkio_policy_register(struct blkio_policy_type *); 65 extern void blkio_policy_unregister(struct blkio_policy_type *); 66 67 #else 68 69 struct blkio_group { 70 }; 71 72 struct blkio_policy_type { 73 }; 74 75 static inline void blkio_policy_register(struct blkio_policy_type *blkiop) { } 76 static inline void blkio_policy_unregister(struct blkio_policy_type *blkiop) { } 77 78 #endif 79 80 #define BLKIO_WEIGHT_MIN 100 81 #define BLKIO_WEIGHT_MAX 1000 82 #define BLKIO_WEIGHT_DEFAULT 500 83 84 #ifdef CONFIG_DEBUG_BLK_CGROUP 85 static inline char *blkg_path(struct blkio_group *blkg) 86 { 87 return blkg->path; 88 } 89 void blkiocg_update_blkio_group_dequeue_stats(struct blkio_group *blkg, 90 unsigned long dequeue); 91 #else 92 static inline char *blkg_path(struct blkio_group *blkg) { return NULL; } 93 static inline void blkiocg_update_blkio_group_dequeue_stats( 94 struct blkio_group *blkg, unsigned long dequeue) {} 95 #endif 96 97 #ifdef CONFIG_BLK_CGROUP 98 extern struct blkio_cgroup blkio_root_cgroup; 99 extern struct blkio_cgroup *cgroup_to_blkio_cgroup(struct cgroup *cgroup); 100 extern void blkiocg_add_blkio_group(struct blkio_cgroup *blkcg, 101 struct blkio_group *blkg, void *key, dev_t dev); 102 extern int blkiocg_del_blkio_group(struct blkio_group *blkg); 103 extern struct blkio_group *blkiocg_lookup_group(struct blkio_cgroup *blkcg, 104 void *key); 105 void blkiocg_update_blkio_group_stats(struct blkio_group *blkg, 106 unsigned long time, unsigned long sectors); 107 #else 108 struct cgroup; 109 static inline struct blkio_cgroup * 110 cgroup_to_blkio_cgroup(struct cgroup *cgroup) { return NULL; } 111 112 static inline void blkiocg_add_blkio_group(struct blkio_cgroup *blkcg, 113 struct blkio_group *blkg, void *key, dev_t dev) 114 { 115 } 116 117 static inline int 118 blkiocg_del_blkio_group(struct blkio_group *blkg) { return 0; } 119 120 static inline struct blkio_group * 121 blkiocg_lookup_group(struct blkio_cgroup *blkcg, void *key) { return NULL; } 122 static inline void blkiocg_update_blkio_group_stats(struct blkio_group *blkg, 123 unsigned long time, unsigned long sectors) 124 { 125 } 126 #endif 127 #endif /* _BLK_CGROUP_H */ 128