Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.38-rc2 335 lines 11 kB view raw
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 18enum blkio_policy_id { 19 BLKIO_POLICY_PROP = 0, /* Proportional Bandwidth division */ 20 BLKIO_POLICY_THROTL, /* Throttling */ 21}; 22 23/* Max limits for throttle policy */ 24#define THROTL_IOPS_MAX UINT_MAX 25 26#if defined(CONFIG_BLK_CGROUP) || defined(CONFIG_BLK_CGROUP_MODULE) 27 28#ifndef CONFIG_BLK_CGROUP 29/* When blk-cgroup is a module, its subsys_id isn't a compile-time constant */ 30extern struct cgroup_subsys blkio_subsys; 31#define blkio_subsys_id blkio_subsys.subsys_id 32#endif 33 34enum stat_type { 35 /* Total time spent (in ns) between request dispatch to the driver and 36 * request completion for IOs doen by this cgroup. This may not be 37 * accurate when NCQ is turned on. */ 38 BLKIO_STAT_SERVICE_TIME = 0, 39 /* Total bytes transferred */ 40 BLKIO_STAT_SERVICE_BYTES, 41 /* Total IOs serviced, post merge */ 42 BLKIO_STAT_SERVICED, 43 /* Total time spent waiting in scheduler queue in ns */ 44 BLKIO_STAT_WAIT_TIME, 45 /* Number of IOs merged */ 46 BLKIO_STAT_MERGED, 47 /* Number of IOs queued up */ 48 BLKIO_STAT_QUEUED, 49 /* All the single valued stats go below this */ 50 BLKIO_STAT_TIME, 51 BLKIO_STAT_SECTORS, 52#ifdef CONFIG_DEBUG_BLK_CGROUP 53 BLKIO_STAT_AVG_QUEUE_SIZE, 54 BLKIO_STAT_IDLE_TIME, 55 BLKIO_STAT_EMPTY_TIME, 56 BLKIO_STAT_GROUP_WAIT_TIME, 57 BLKIO_STAT_DEQUEUE 58#endif 59}; 60 61enum stat_sub_type { 62 BLKIO_STAT_READ = 0, 63 BLKIO_STAT_WRITE, 64 BLKIO_STAT_SYNC, 65 BLKIO_STAT_ASYNC, 66 BLKIO_STAT_TOTAL 67}; 68 69/* blkg state flags */ 70enum blkg_state_flags { 71 BLKG_waiting = 0, 72 BLKG_idling, 73 BLKG_empty, 74}; 75 76/* cgroup files owned by proportional weight policy */ 77enum blkcg_file_name_prop { 78 BLKIO_PROP_weight = 1, 79 BLKIO_PROP_weight_device, 80 BLKIO_PROP_io_service_bytes, 81 BLKIO_PROP_io_serviced, 82 BLKIO_PROP_time, 83 BLKIO_PROP_sectors, 84 BLKIO_PROP_io_service_time, 85 BLKIO_PROP_io_wait_time, 86 BLKIO_PROP_io_merged, 87 BLKIO_PROP_io_queued, 88 BLKIO_PROP_avg_queue_size, 89 BLKIO_PROP_group_wait_time, 90 BLKIO_PROP_idle_time, 91 BLKIO_PROP_empty_time, 92 BLKIO_PROP_dequeue, 93}; 94 95/* cgroup files owned by throttle policy */ 96enum blkcg_file_name_throtl { 97 BLKIO_THROTL_read_bps_device, 98 BLKIO_THROTL_write_bps_device, 99 BLKIO_THROTL_read_iops_device, 100 BLKIO_THROTL_write_iops_device, 101 BLKIO_THROTL_io_service_bytes, 102 BLKIO_THROTL_io_serviced, 103}; 104 105struct blkio_cgroup { 106 struct cgroup_subsys_state css; 107 unsigned int weight; 108 spinlock_t lock; 109 struct hlist_head blkg_list; 110 struct list_head policy_list; /* list of blkio_policy_node */ 111}; 112 113struct blkio_group_stats { 114 /* total disk time and nr sectors dispatched by this group */ 115 uint64_t time; 116 uint64_t sectors; 117 uint64_t stat_arr[BLKIO_STAT_QUEUED + 1][BLKIO_STAT_TOTAL]; 118#ifdef CONFIG_DEBUG_BLK_CGROUP 119 /* Sum of number of IOs queued across all samples */ 120 uint64_t avg_queue_size_sum; 121 /* Count of samples taken for average */ 122 uint64_t avg_queue_size_samples; 123 /* How many times this group has been removed from service tree */ 124 unsigned long dequeue; 125 126 /* Total time spent waiting for it to be assigned a timeslice. */ 127 uint64_t group_wait_time; 128 uint64_t start_group_wait_time; 129 130 /* Time spent idling for this blkio_group */ 131 uint64_t idle_time; 132 uint64_t start_idle_time; 133 /* 134 * Total time when we have requests queued and do not contain the 135 * current active queue. 136 */ 137 uint64_t empty_time; 138 uint64_t start_empty_time; 139 uint16_t flags; 140#endif 141}; 142 143struct blkio_group { 144 /* An rcu protected unique identifier for the group */ 145 void *key; 146 struct hlist_node blkcg_node; 147 unsigned short blkcg_id; 148 /* Store cgroup path */ 149 char path[128]; 150 /* The device MKDEV(major, minor), this group has been created for */ 151 dev_t dev; 152 /* policy which owns this blk group */ 153 enum blkio_policy_id plid; 154 155 /* Need to serialize the stats in the case of reset/update */ 156 spinlock_t stats_lock; 157 struct blkio_group_stats stats; 158}; 159 160struct blkio_policy_node { 161 struct list_head node; 162 dev_t dev; 163 /* This node belongs to max bw policy or porportional weight policy */ 164 enum blkio_policy_id plid; 165 /* cgroup file to which this rule belongs to */ 166 int fileid; 167 168 union { 169 unsigned int weight; 170 /* 171 * Rate read/write in terms of byptes per second 172 * Whether this rate represents read or write is determined 173 * by file type "fileid". 174 */ 175 u64 bps; 176 unsigned int iops; 177 } val; 178}; 179 180extern unsigned int blkcg_get_weight(struct blkio_cgroup *blkcg, 181 dev_t dev); 182extern uint64_t blkcg_get_read_bps(struct blkio_cgroup *blkcg, 183 dev_t dev); 184extern uint64_t blkcg_get_write_bps(struct blkio_cgroup *blkcg, 185 dev_t dev); 186extern unsigned int blkcg_get_read_iops(struct blkio_cgroup *blkcg, 187 dev_t dev); 188extern unsigned int blkcg_get_write_iops(struct blkio_cgroup *blkcg, 189 dev_t dev); 190 191typedef void (blkio_unlink_group_fn) (void *key, struct blkio_group *blkg); 192 193typedef void (blkio_update_group_weight_fn) (void *key, 194 struct blkio_group *blkg, unsigned int weight); 195typedef void (blkio_update_group_read_bps_fn) (void * key, 196 struct blkio_group *blkg, u64 read_bps); 197typedef void (blkio_update_group_write_bps_fn) (void *key, 198 struct blkio_group *blkg, u64 write_bps); 199typedef void (blkio_update_group_read_iops_fn) (void *key, 200 struct blkio_group *blkg, unsigned int read_iops); 201typedef void (blkio_update_group_write_iops_fn) (void *key, 202 struct blkio_group *blkg, unsigned int write_iops); 203 204struct blkio_policy_ops { 205 blkio_unlink_group_fn *blkio_unlink_group_fn; 206 blkio_update_group_weight_fn *blkio_update_group_weight_fn; 207 blkio_update_group_read_bps_fn *blkio_update_group_read_bps_fn; 208 blkio_update_group_write_bps_fn *blkio_update_group_write_bps_fn; 209 blkio_update_group_read_iops_fn *blkio_update_group_read_iops_fn; 210 blkio_update_group_write_iops_fn *blkio_update_group_write_iops_fn; 211}; 212 213struct blkio_policy_type { 214 struct list_head list; 215 struct blkio_policy_ops ops; 216 enum blkio_policy_id plid; 217}; 218 219/* Blkio controller policy registration */ 220extern void blkio_policy_register(struct blkio_policy_type *); 221extern void blkio_policy_unregister(struct blkio_policy_type *); 222 223static inline char *blkg_path(struct blkio_group *blkg) 224{ 225 return blkg->path; 226} 227 228#else 229 230struct blkio_group { 231}; 232 233struct blkio_policy_type { 234}; 235 236static inline void blkio_policy_register(struct blkio_policy_type *blkiop) { } 237static inline void blkio_policy_unregister(struct blkio_policy_type *blkiop) { } 238 239static inline char *blkg_path(struct blkio_group *blkg) { return NULL; } 240 241#endif 242 243#define BLKIO_WEIGHT_MIN 100 244#define BLKIO_WEIGHT_MAX 1000 245#define BLKIO_WEIGHT_DEFAULT 500 246 247#ifdef CONFIG_DEBUG_BLK_CGROUP 248void blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg); 249void blkiocg_update_dequeue_stats(struct blkio_group *blkg, 250 unsigned long dequeue); 251void blkiocg_update_set_idle_time_stats(struct blkio_group *blkg); 252void blkiocg_update_idle_time_stats(struct blkio_group *blkg); 253void blkiocg_set_start_empty_time(struct blkio_group *blkg); 254 255#define BLKG_FLAG_FNS(name) \ 256static inline void blkio_mark_blkg_##name( \ 257 struct blkio_group_stats *stats) \ 258{ \ 259 stats->flags |= (1 << BLKG_##name); \ 260} \ 261static inline void blkio_clear_blkg_##name( \ 262 struct blkio_group_stats *stats) \ 263{ \ 264 stats->flags &= ~(1 << BLKG_##name); \ 265} \ 266static inline int blkio_blkg_##name(struct blkio_group_stats *stats) \ 267{ \ 268 return (stats->flags & (1 << BLKG_##name)) != 0; \ 269} \ 270 271BLKG_FLAG_FNS(waiting) 272BLKG_FLAG_FNS(idling) 273BLKG_FLAG_FNS(empty) 274#undef BLKG_FLAG_FNS 275#else 276static inline void blkiocg_update_avg_queue_size_stats( 277 struct blkio_group *blkg) {} 278static inline void blkiocg_update_dequeue_stats(struct blkio_group *blkg, 279 unsigned long dequeue) {} 280static inline void blkiocg_update_set_idle_time_stats(struct blkio_group *blkg) 281{} 282static inline void blkiocg_update_idle_time_stats(struct blkio_group *blkg) {} 283static inline void blkiocg_set_start_empty_time(struct blkio_group *blkg) {} 284#endif 285 286#if defined(CONFIG_BLK_CGROUP) || defined(CONFIG_BLK_CGROUP_MODULE) 287extern struct blkio_cgroup blkio_root_cgroup; 288extern struct blkio_cgroup *cgroup_to_blkio_cgroup(struct cgroup *cgroup); 289extern void blkiocg_add_blkio_group(struct blkio_cgroup *blkcg, 290 struct blkio_group *blkg, void *key, dev_t dev, 291 enum blkio_policy_id plid); 292extern int blkiocg_del_blkio_group(struct blkio_group *blkg); 293extern struct blkio_group *blkiocg_lookup_group(struct blkio_cgroup *blkcg, 294 void *key); 295void blkiocg_update_timeslice_used(struct blkio_group *blkg, 296 unsigned long time); 297void blkiocg_update_dispatch_stats(struct blkio_group *blkg, uint64_t bytes, 298 bool direction, bool sync); 299void blkiocg_update_completion_stats(struct blkio_group *blkg, 300 uint64_t start_time, uint64_t io_start_time, bool direction, bool sync); 301void blkiocg_update_io_merged_stats(struct blkio_group *blkg, bool direction, 302 bool sync); 303void blkiocg_update_io_add_stats(struct blkio_group *blkg, 304 struct blkio_group *curr_blkg, bool direction, bool sync); 305void blkiocg_update_io_remove_stats(struct blkio_group *blkg, 306 bool direction, bool sync); 307#else 308struct cgroup; 309static inline struct blkio_cgroup * 310cgroup_to_blkio_cgroup(struct cgroup *cgroup) { return NULL; } 311 312static inline void blkiocg_add_blkio_group(struct blkio_cgroup *blkcg, 313 struct blkio_group *blkg, void *key, dev_t dev, 314 enum blkio_policy_id plid) {} 315 316static inline int 317blkiocg_del_blkio_group(struct blkio_group *blkg) { return 0; } 318 319static inline struct blkio_group * 320blkiocg_lookup_group(struct blkio_cgroup *blkcg, void *key) { return NULL; } 321static inline void blkiocg_update_timeslice_used(struct blkio_group *blkg, 322 unsigned long time) {} 323static inline void blkiocg_update_dispatch_stats(struct blkio_group *blkg, 324 uint64_t bytes, bool direction, bool sync) {} 325static inline void blkiocg_update_completion_stats(struct blkio_group *blkg, 326 uint64_t start_time, uint64_t io_start_time, bool direction, 327 bool sync) {} 328static inline void blkiocg_update_io_merged_stats(struct blkio_group *blkg, 329 bool direction, bool sync) {} 330static inline void blkiocg_update_io_add_stats(struct blkio_group *blkg, 331 struct blkio_group *curr_blkg, bool direction, bool sync) {} 332static inline void blkiocg_update_io_remove_stats(struct blkio_group *blkg, 333 bool direction, bool sync) {} 334#endif 335#endif /* _BLK_CGROUP_H */