Blame view

block/blk-cgroup.h 10.4 KB
31e4c28d9   Vivek Goyal   blkio: Introduce ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  #ifndef _BLK_CGROUP_H
  #define _BLK_CGROUP_H
  /*
   * Common Block IO controller cgroup interface
   *
   * Based on ideas and code from CFQ, CFS and BFQ:
   * Copyright (C) 2003 Jens Axboe <axboe@kernel.dk>
   *
   * Copyright (C) 2008 Fabio Checconi <fabio@gandalf.sssup.it>
   *		      Paolo Valente <paolo.valente@unimore.it>
   *
   * Copyright (C) 2009 Vivek Goyal <vgoyal@redhat.com>
   * 	              Nauman Rafique <nauman@google.com>
   */
  
  #include <linux/cgroup.h>
062a644d6   Vivek Goyal   blk-cgroup: Prepa...
17
18
  enum blkio_policy_id {
  	BLKIO_POLICY_PROP = 0,		/* Proportional Bandwidth division */
4c9eefa16   Vivek Goyal   blk-cgroup: Intro...
19
  	BLKIO_POLICY_THROTL,		/* Throttling */
062a644d6   Vivek Goyal   blk-cgroup: Prepa...
20
  };
9355aede5   Vivek Goyal   blkio-throttle: l...
21
22
  /* Max limits for throttle policy */
  #define THROTL_IOPS_MAX		UINT_MAX
67523c48a   Ben Blum   cgroups: blkio su...
23
24
25
26
27
28
29
  #if defined(CONFIG_BLK_CGROUP) || defined(CONFIG_BLK_CGROUP_MODULE)
  
  #ifndef CONFIG_BLK_CGROUP
  /* When blk-cgroup is a module, its subsys_id isn't a compile-time constant */
  extern struct cgroup_subsys blkio_subsys;
  #define blkio_subsys_id blkio_subsys.subsys_id
  #endif
2f5ea4771   Jens Axboe   cfq-iosched: fix ...
30

84c124da9   Divyesh Shah   blkio: Changes to...
31
32
33
34
35
36
37
38
39
40
41
  enum stat_type {
  	/* Total time spent (in ns) between request dispatch to the driver and
  	 * request completion for IOs doen by this cgroup. This may not be
  	 * accurate when NCQ is turned on. */
  	BLKIO_STAT_SERVICE_TIME = 0,
  	/* Total bytes transferred */
  	BLKIO_STAT_SERVICE_BYTES,
  	/* Total IOs serviced, post merge */
  	BLKIO_STAT_SERVICED,
  	/* Total time spent waiting in scheduler queue in ns */
  	BLKIO_STAT_WAIT_TIME,
812d40264   Divyesh Shah   blkio: Add io_mer...
42
43
  	/* Number of IOs merged */
  	BLKIO_STAT_MERGED,
cdc1184cf   Divyesh Shah   blkio: Add io_que...
44
45
  	/* Number of IOs queued up */
  	BLKIO_STAT_QUEUED,
84c124da9   Divyesh Shah   blkio: Changes to...
46
47
48
49
  	/* All the single valued stats go below this */
  	BLKIO_STAT_TIME,
  	BLKIO_STAT_SECTORS,
  #ifdef CONFIG_DEBUG_BLK_CGROUP
cdc1184cf   Divyesh Shah   blkio: Add io_que...
50
  	BLKIO_STAT_AVG_QUEUE_SIZE,
812df48d1   Divyesh Shah   blkio: Add more d...
51
52
53
  	BLKIO_STAT_IDLE_TIME,
  	BLKIO_STAT_EMPTY_TIME,
  	BLKIO_STAT_GROUP_WAIT_TIME,
84c124da9   Divyesh Shah   blkio: Changes to...
54
55
56
57
58
59
60
61
62
63
  	BLKIO_STAT_DEQUEUE
  #endif
  };
  
  enum stat_sub_type {
  	BLKIO_STAT_READ = 0,
  	BLKIO_STAT_WRITE,
  	BLKIO_STAT_SYNC,
  	BLKIO_STAT_ASYNC,
  	BLKIO_STAT_TOTAL
303a3acb2   Divyesh Shah   blkio: Add io con...
64
  };
812df48d1   Divyesh Shah   blkio: Add more d...
65
66
67
68
69
70
  /* blkg state flags */
  enum blkg_state_flags {
  	BLKG_waiting = 0,
  	BLKG_idling,
  	BLKG_empty,
  };
062a644d6   Vivek Goyal   blk-cgroup: Prepa...
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  /* cgroup files owned by proportional weight policy */
  enum blkcg_file_name_prop {
  	BLKIO_PROP_weight = 1,
  	BLKIO_PROP_weight_device,
  	BLKIO_PROP_io_service_bytes,
  	BLKIO_PROP_io_serviced,
  	BLKIO_PROP_time,
  	BLKIO_PROP_sectors,
  	BLKIO_PROP_io_service_time,
  	BLKIO_PROP_io_wait_time,
  	BLKIO_PROP_io_merged,
  	BLKIO_PROP_io_queued,
  	BLKIO_PROP_avg_queue_size,
  	BLKIO_PROP_group_wait_time,
  	BLKIO_PROP_idle_time,
  	BLKIO_PROP_empty_time,
  	BLKIO_PROP_dequeue,
  };
4c9eefa16   Vivek Goyal   blk-cgroup: Intro...
89
90
91
92
  /* cgroup files owned by throttle policy */
  enum blkcg_file_name_throtl {
  	BLKIO_THROTL_read_bps_device,
  	BLKIO_THROTL_write_bps_device,
7702e8f45   Vivek Goyal   blk-cgroup: cgrou...
93
94
  	BLKIO_THROTL_read_iops_device,
  	BLKIO_THROTL_write_iops_device,
4c9eefa16   Vivek Goyal   blk-cgroup: Intro...
95
96
97
  	BLKIO_THROTL_io_service_bytes,
  	BLKIO_THROTL_io_serviced,
  };
31e4c28d9   Vivek Goyal   blkio: Introduce ...
98
99
100
101
102
  struct blkio_cgroup {
  	struct cgroup_subsys_state css;
  	unsigned int weight;
  	spinlock_t lock;
  	struct hlist_head blkg_list;
34d0f179d   Gui Jianfeng   io-controller: Ad...
103
  	struct list_head policy_list; /* list of blkio_policy_node */
31e4c28d9   Vivek Goyal   blkio: Introduce ...
104
  };
303a3acb2   Divyesh Shah   blkio: Add io con...
105
106
107
108
  struct blkio_group_stats {
  	/* total disk time and nr sectors dispatched by this group */
  	uint64_t time;
  	uint64_t sectors;
cdc1184cf   Divyesh Shah   blkio: Add io_que...
109
  	uint64_t stat_arr[BLKIO_STAT_QUEUED + 1][BLKIO_STAT_TOTAL];
303a3acb2   Divyesh Shah   blkio: Add io con...
110
  #ifdef CONFIG_DEBUG_BLK_CGROUP
cdc1184cf   Divyesh Shah   blkio: Add io_que...
111
112
113
114
  	/* Sum of number of IOs queued across all samples */
  	uint64_t avg_queue_size_sum;
  	/* Count of samples taken for average */
  	uint64_t avg_queue_size_samples;
303a3acb2   Divyesh Shah   blkio: Add io con...
115
116
  	/* How many times this group has been removed from service tree */
  	unsigned long dequeue;
812df48d1   Divyesh Shah   blkio: Add more d...
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
  
  	/* Total time spent waiting for it to be assigned a timeslice. */
  	uint64_t group_wait_time;
  	uint64_t start_group_wait_time;
  
  	/* Time spent idling for this blkio_group */
  	uint64_t idle_time;
  	uint64_t start_idle_time;
  	/*
  	 * Total time when we have requests queued and do not contain the
  	 * current active queue.
  	 */
  	uint64_t empty_time;
  	uint64_t start_empty_time;
  	uint16_t flags;
303a3acb2   Divyesh Shah   blkio: Add io con...
132
133
  #endif
  };
31e4c28d9   Vivek Goyal   blkio: Introduce ...
134
135
136
137
  struct blkio_group {
  	/* An rcu protected unique identifier for the group */
  	void *key;
  	struct hlist_node blkcg_node;
b1c357696   Vivek Goyal   blkio: Take care ...
138
  	unsigned short blkcg_id;
2868ef7b3   Vivek Goyal   blkio: Some debug...
139
140
  	/* Store cgroup path */
  	char path[128];
220841906   Vivek Goyal   blkio: Export dis...
141
  	/* The device MKDEV(major, minor), this group has been created for */
84c124da9   Divyesh Shah   blkio: Changes to...
142
  	dev_t dev;
062a644d6   Vivek Goyal   blk-cgroup: Prepa...
143
144
  	/* policy which owns this blk group */
  	enum blkio_policy_id plid;
220841906   Vivek Goyal   blkio: Export dis...
145

303a3acb2   Divyesh Shah   blkio: Add io con...
146
147
148
  	/* Need to serialize the stats in the case of reset/update */
  	spinlock_t stats_lock;
  	struct blkio_group_stats stats;
31e4c28d9   Vivek Goyal   blkio: Introduce ...
149
  };
34d0f179d   Gui Jianfeng   io-controller: Ad...
150
151
152
  struct blkio_policy_node {
  	struct list_head node;
  	dev_t dev;
062a644d6   Vivek Goyal   blk-cgroup: Prepa...
153
154
155
156
  	/* This node belongs to max bw policy or porportional weight policy */
  	enum blkio_policy_id plid;
  	/* cgroup file to which this rule belongs to */
  	int fileid;
4c9eefa16   Vivek Goyal   blk-cgroup: Intro...
157
158
159
160
161
162
163
164
165
  
  	union {
  		unsigned int weight;
  		/*
  		 * Rate read/write in terms of byptes per second
  		 * Whether this rate represents read or write is determined
  		 * by file type "fileid".
  		 */
  		u64 bps;
7702e8f45   Vivek Goyal   blk-cgroup: cgrou...
166
  		unsigned int iops;
4c9eefa16   Vivek Goyal   blk-cgroup: Intro...
167
  	} val;
34d0f179d   Gui Jianfeng   io-controller: Ad...
168
169
170
171
  };
  
  extern unsigned int blkcg_get_weight(struct blkio_cgroup *blkcg,
  				     dev_t dev);
4c9eefa16   Vivek Goyal   blk-cgroup: Intro...
172
173
174
175
  extern uint64_t blkcg_get_read_bps(struct blkio_cgroup *blkcg,
  				     dev_t dev);
  extern uint64_t blkcg_get_write_bps(struct blkio_cgroup *blkcg,
  				     dev_t dev);
7702e8f45   Vivek Goyal   blk-cgroup: cgrou...
176
177
178
179
  extern unsigned int blkcg_get_read_iops(struct blkio_cgroup *blkcg,
  				     dev_t dev);
  extern unsigned int blkcg_get_write_iops(struct blkio_cgroup *blkcg,
  				     dev_t dev);
34d0f179d   Gui Jianfeng   io-controller: Ad...
180

3e2520668   Vivek Goyal   blkio: Implement ...
181
  typedef void (blkio_unlink_group_fn) (void *key, struct blkio_group *blkg);
fe0714377   Vivek Goyal   blkio: Recalculat...
182
183
184
185
186
187
188
189
190
191
192
  
  typedef void (blkio_update_group_weight_fn) (void *key,
  			struct blkio_group *blkg, unsigned int weight);
  typedef void (blkio_update_group_read_bps_fn) (void * key,
  			struct blkio_group *blkg, u64 read_bps);
  typedef void (blkio_update_group_write_bps_fn) (void *key,
  			struct blkio_group *blkg, u64 write_bps);
  typedef void (blkio_update_group_read_iops_fn) (void *key,
  			struct blkio_group *blkg, unsigned int read_iops);
  typedef void (blkio_update_group_write_iops_fn) (void *key,
  			struct blkio_group *blkg, unsigned int write_iops);
3e2520668   Vivek Goyal   blkio: Implement ...
193
194
195
196
  
  struct blkio_policy_ops {
  	blkio_unlink_group_fn *blkio_unlink_group_fn;
  	blkio_update_group_weight_fn *blkio_update_group_weight_fn;
4c9eefa16   Vivek Goyal   blk-cgroup: Intro...
197
198
  	blkio_update_group_read_bps_fn *blkio_update_group_read_bps_fn;
  	blkio_update_group_write_bps_fn *blkio_update_group_write_bps_fn;
7702e8f45   Vivek Goyal   blk-cgroup: cgrou...
199
200
  	blkio_update_group_read_iops_fn *blkio_update_group_read_iops_fn;
  	blkio_update_group_write_iops_fn *blkio_update_group_write_iops_fn;
3e2520668   Vivek Goyal   blkio: Implement ...
201
202
203
204
205
  };
  
  struct blkio_policy_type {
  	struct list_head list;
  	struct blkio_policy_ops ops;
062a644d6   Vivek Goyal   blk-cgroup: Prepa...
206
  	enum blkio_policy_id plid;
3e2520668   Vivek Goyal   blkio: Implement ...
207
208
209
210
211
  };
  
  /* Blkio controller policy registration */
  extern void blkio_policy_register(struct blkio_policy_type *);
  extern void blkio_policy_unregister(struct blkio_policy_type *);
afc24d49c   Vivek Goyal   blk-cgroup: confi...
212
213
214
215
  static inline char *blkg_path(struct blkio_group *blkg)
  {
  	return blkg->path;
  }
2f5ea4771   Jens Axboe   cfq-iosched: fix ...
216
217
218
219
  #else
  
  struct blkio_group {
  };
3e2520668   Vivek Goyal   blkio: Implement ...
220
221
222
223
224
  struct blkio_policy_type {
  };
  
  static inline void blkio_policy_register(struct blkio_policy_type *blkiop) { }
  static inline void blkio_policy_unregister(struct blkio_policy_type *blkiop) { }
afc24d49c   Vivek Goyal   blk-cgroup: confi...
225
  static inline char *blkg_path(struct blkio_group *blkg) { return NULL; }
2f5ea4771   Jens Axboe   cfq-iosched: fix ...
226
  #endif
31e4c28d9   Vivek Goyal   blkio: Introduce ...
227
228
229
  #define BLKIO_WEIGHT_MIN	100
  #define BLKIO_WEIGHT_MAX	1000
  #define BLKIO_WEIGHT_DEFAULT	500
2868ef7b3   Vivek Goyal   blkio: Some debug...
230
  #ifdef CONFIG_DEBUG_BLK_CGROUP
a11cdaa7a   Divyesh Shah   block: Update to ...
231
  void blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg);
9195291e5   Divyesh Shah   blkio: Increment ...
232
  void blkiocg_update_dequeue_stats(struct blkio_group *blkg,
220841906   Vivek Goyal   blkio: Export dis...
233
  				unsigned long dequeue);
812df48d1   Divyesh Shah   blkio: Add more d...
234
235
  void blkiocg_update_set_idle_time_stats(struct blkio_group *blkg);
  void blkiocg_update_idle_time_stats(struct blkio_group *blkg);
e5ff082e8   Vivek Goyal   blkio: Fix anothe...
236
  void blkiocg_set_start_empty_time(struct blkio_group *blkg);
812df48d1   Divyesh Shah   blkio: Add more d...
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
  
  #define BLKG_FLAG_FNS(name)						\
  static inline void blkio_mark_blkg_##name(				\
  		struct blkio_group_stats *stats)			\
  {									\
  	stats->flags |= (1 << BLKG_##name);				\
  }									\
  static inline void blkio_clear_blkg_##name(				\
  		struct blkio_group_stats *stats)			\
  {									\
  	stats->flags &= ~(1 << BLKG_##name);				\
  }									\
  static inline int blkio_blkg_##name(struct blkio_group_stats *stats)	\
  {									\
  	return (stats->flags & (1 << BLKG_##name)) != 0;		\
  }									\
  
  BLKG_FLAG_FNS(waiting)
  BLKG_FLAG_FNS(idling)
  BLKG_FLAG_FNS(empty)
  #undef BLKG_FLAG_FNS
2868ef7b3   Vivek Goyal   blkio: Some debug...
258
  #else
a11cdaa7a   Divyesh Shah   block: Update to ...
259
  static inline void blkiocg_update_avg_queue_size_stats(
cdc1184cf   Divyesh Shah   blkio: Add io_que...
260
  						struct blkio_group *blkg) {}
9195291e5   Divyesh Shah   blkio: Increment ...
261
262
  static inline void blkiocg_update_dequeue_stats(struct blkio_group *blkg,
  						unsigned long dequeue) {}
812df48d1   Divyesh Shah   blkio: Add more d...
263
264
265
  static inline void blkiocg_update_set_idle_time_stats(struct blkio_group *blkg)
  {}
  static inline void blkiocg_update_idle_time_stats(struct blkio_group *blkg) {}
e5ff082e8   Vivek Goyal   blkio: Fix anothe...
266
  static inline void blkiocg_set_start_empty_time(struct blkio_group *blkg) {}
2868ef7b3   Vivek Goyal   blkio: Some debug...
267
  #endif
67523c48a   Ben Blum   cgroups: blkio su...
268
  #if defined(CONFIG_BLK_CGROUP) || defined(CONFIG_BLK_CGROUP_MODULE)
31e4c28d9   Vivek Goyal   blkio: Introduce ...
269
270
271
  extern struct blkio_cgroup blkio_root_cgroup;
  extern struct blkio_cgroup *cgroup_to_blkio_cgroup(struct cgroup *cgroup);
  extern void blkiocg_add_blkio_group(struct blkio_cgroup *blkcg,
062a644d6   Vivek Goyal   blk-cgroup: Prepa...
272
273
  	struct blkio_group *blkg, void *key, dev_t dev,
  	enum blkio_policy_id plid);
31e4c28d9   Vivek Goyal   blkio: Introduce ...
274
275
276
  extern int blkiocg_del_blkio_group(struct blkio_group *blkg);
  extern struct blkio_group *blkiocg_lookup_group(struct blkio_cgroup *blkcg,
  						void *key);
303a3acb2   Divyesh Shah   blkio: Add io con...
277
278
  void blkiocg_update_timeslice_used(struct blkio_group *blkg,
  					unsigned long time);
84c124da9   Divyesh Shah   blkio: Changes to...
279
280
281
282
  void blkiocg_update_dispatch_stats(struct blkio_group *blkg, uint64_t bytes,
  						bool direction, bool sync);
  void blkiocg_update_completion_stats(struct blkio_group *blkg,
  	uint64_t start_time, uint64_t io_start_time, bool direction, bool sync);
812d40264   Divyesh Shah   blkio: Add io_mer...
283
284
  void blkiocg_update_io_merged_stats(struct blkio_group *blkg, bool direction,
  					bool sync);
a11cdaa7a   Divyesh Shah   block: Update to ...
285
  void blkiocg_update_io_add_stats(struct blkio_group *blkg,
cdc1184cf   Divyesh Shah   blkio: Add io_que...
286
  		struct blkio_group *curr_blkg, bool direction, bool sync);
a11cdaa7a   Divyesh Shah   block: Update to ...
287
  void blkiocg_update_io_remove_stats(struct blkio_group *blkg,
cdc1184cf   Divyesh Shah   blkio: Add io_que...
288
  					bool direction, bool sync);
31e4c28d9   Vivek Goyal   blkio: Introduce ...
289
  #else
2f5ea4771   Jens Axboe   cfq-iosched: fix ...
290
  struct cgroup;
31e4c28d9   Vivek Goyal   blkio: Introduce ...
291
292
293
294
  static inline struct blkio_cgroup *
  cgroup_to_blkio_cgroup(struct cgroup *cgroup) { return NULL; }
  
  static inline void blkiocg_add_blkio_group(struct blkio_cgroup *blkcg,
062a644d6   Vivek Goyal   blk-cgroup: Prepa...
295
296
  		struct blkio_group *blkg, void *key, dev_t dev,
  		enum blkio_policy_id plid) {}
31e4c28d9   Vivek Goyal   blkio: Introduce ...
297
298
299
300
301
302
  
  static inline int
  blkiocg_del_blkio_group(struct blkio_group *blkg) { return 0; }
  
  static inline struct blkio_group *
  blkiocg_lookup_group(struct blkio_cgroup *blkcg, void *key) { return NULL; }
303a3acb2   Divyesh Shah   blkio: Add io con...
303
  static inline void blkiocg_update_timeslice_used(struct blkio_group *blkg,
9a0785b0d   Divyesh Shah   blkio: Remove per...
304
  						unsigned long time) {}
84c124da9   Divyesh Shah   blkio: Changes to...
305
306
307
308
309
  static inline void blkiocg_update_dispatch_stats(struct blkio_group *blkg,
  				uint64_t bytes, bool direction, bool sync) {}
  static inline void blkiocg_update_completion_stats(struct blkio_group *blkg,
  		uint64_t start_time, uint64_t io_start_time, bool direction,
  		bool sync) {}
812d40264   Divyesh Shah   blkio: Add io_mer...
310
311
  static inline void blkiocg_update_io_merged_stats(struct blkio_group *blkg,
  						bool direction, bool sync) {}
a11cdaa7a   Divyesh Shah   block: Update to ...
312
  static inline void blkiocg_update_io_add_stats(struct blkio_group *blkg,
cdc1184cf   Divyesh Shah   blkio: Add io_que...
313
  		struct blkio_group *curr_blkg, bool direction, bool sync) {}
a11cdaa7a   Divyesh Shah   block: Update to ...
314
  static inline void blkiocg_update_io_remove_stats(struct blkio_group *blkg,
cdc1184cf   Divyesh Shah   blkio: Add io_que...
315
  						bool direction, bool sync) {}
31e4c28d9   Vivek Goyal   blkio: Introduce ...
316
317
  #endif
  #endif /* _BLK_CGROUP_H */