Blame view

block/blk-cgroup.h 7.95 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>
67523c48a   Ben Blum   cgroups: blkio su...
17
18
19
20
21
22
23
  #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 ...
24

84c124da9   Divyesh Shah   blkio: Changes to...
25
26
27
28
29
30
31
32
33
34
35
  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...
36
37
  	/* Number of IOs merged */
  	BLKIO_STAT_MERGED,
cdc1184cf   Divyesh Shah   blkio: Add io_que...
38
39
  	/* Number of IOs queued up */
  	BLKIO_STAT_QUEUED,
84c124da9   Divyesh Shah   blkio: Changes to...
40
41
42
43
  	/* 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...
44
  	BLKIO_STAT_AVG_QUEUE_SIZE,
812df48d1   Divyesh Shah   blkio: Add more d...
45
46
47
  	BLKIO_STAT_IDLE_TIME,
  	BLKIO_STAT_EMPTY_TIME,
  	BLKIO_STAT_GROUP_WAIT_TIME,
84c124da9   Divyesh Shah   blkio: Changes to...
48
49
50
51
52
53
54
55
56
57
  	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...
58
  };
812df48d1   Divyesh Shah   blkio: Add more d...
59
60
61
62
63
64
  /* blkg state flags */
  enum blkg_state_flags {
  	BLKG_waiting = 0,
  	BLKG_idling,
  	BLKG_empty,
  };
31e4c28d9   Vivek Goyal   blkio: Introduce ...
65
66
67
68
69
  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...
70
  	struct list_head policy_list; /* list of blkio_policy_node */
31e4c28d9   Vivek Goyal   blkio: Introduce ...
71
  };
303a3acb2   Divyesh Shah   blkio: Add io con...
72
73
74
75
  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...
76
  	uint64_t stat_arr[BLKIO_STAT_QUEUED + 1][BLKIO_STAT_TOTAL];
303a3acb2   Divyesh Shah   blkio: Add io con...
77
  #ifdef CONFIG_DEBUG_BLK_CGROUP
cdc1184cf   Divyesh Shah   blkio: Add io_que...
78
79
80
81
  	/* 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...
82
83
  	/* How many times this group has been removed from service tree */
  	unsigned long dequeue;
812df48d1   Divyesh Shah   blkio: Add more d...
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  
  	/* 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...
99
100
  #endif
  };
31e4c28d9   Vivek Goyal   blkio: Introduce ...
101
102
103
104
  struct blkio_group {
  	/* An rcu protected unique identifier for the group */
  	void *key;
  	struct hlist_node blkcg_node;
b1c357696   Vivek Goyal   blkio: Take care ...
105
  	unsigned short blkcg_id;
2868ef7b3   Vivek Goyal   blkio: Some debug...
106
107
  	/* Store cgroup path */
  	char path[128];
220841906   Vivek Goyal   blkio: Export dis...
108
  	/* The device MKDEV(major, minor), this group has been created for */
84c124da9   Divyesh Shah   blkio: Changes to...
109
  	dev_t dev;
220841906   Vivek Goyal   blkio: Export dis...
110

303a3acb2   Divyesh Shah   blkio: Add io con...
111
112
113
  	/* 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 ...
114
  };
34d0f179d   Gui Jianfeng   io-controller: Ad...
115
116
117
118
119
120
121
122
  struct blkio_policy_node {
  	struct list_head node;
  	dev_t dev;
  	unsigned int weight;
  };
  
  extern unsigned int blkcg_get_weight(struct blkio_cgroup *blkcg,
  				     dev_t dev);
3e2520668   Vivek Goyal   blkio: Implement ...
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  typedef void (blkio_unlink_group_fn) (void *key, struct blkio_group *blkg);
  typedef void (blkio_update_group_weight_fn) (struct blkio_group *blkg,
  						unsigned int weight);
  
  struct blkio_policy_ops {
  	blkio_unlink_group_fn *blkio_unlink_group_fn;
  	blkio_update_group_weight_fn *blkio_update_group_weight_fn;
  };
  
  struct blkio_policy_type {
  	struct list_head list;
  	struct blkio_policy_ops ops;
  };
  
  /* 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...
140
141
142
143
  static inline char *blkg_path(struct blkio_group *blkg)
  {
  	return blkg->path;
  }
2f5ea4771   Jens Axboe   cfq-iosched: fix ...
144
145
146
147
  #else
  
  struct blkio_group {
  };
3e2520668   Vivek Goyal   blkio: Implement ...
148
149
150
151
152
  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...
153
  static inline char *blkg_path(struct blkio_group *blkg) { return NULL; }
2f5ea4771   Jens Axboe   cfq-iosched: fix ...
154
  #endif
31e4c28d9   Vivek Goyal   blkio: Introduce ...
155
156
157
  #define BLKIO_WEIGHT_MIN	100
  #define BLKIO_WEIGHT_MAX	1000
  #define BLKIO_WEIGHT_DEFAULT	500
2868ef7b3   Vivek Goyal   blkio: Some debug...
158
  #ifdef CONFIG_DEBUG_BLK_CGROUP
a11cdaa7a   Divyesh Shah   block: Update to ...
159
  void blkiocg_update_avg_queue_size_stats(struct blkio_group *blkg);
9195291e5   Divyesh Shah   blkio: Increment ...
160
  void blkiocg_update_dequeue_stats(struct blkio_group *blkg,
220841906   Vivek Goyal   blkio: Export dis...
161
  				unsigned long dequeue);
812df48d1   Divyesh Shah   blkio: Add more d...
162
163
  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...
164
  void blkiocg_set_start_empty_time(struct blkio_group *blkg);
812df48d1   Divyesh Shah   blkio: Add more d...
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
  
  #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...
186
  #else
a11cdaa7a   Divyesh Shah   block: Update to ...
187
  static inline void blkiocg_update_avg_queue_size_stats(
cdc1184cf   Divyesh Shah   blkio: Add io_que...
188
  						struct blkio_group *blkg) {}
9195291e5   Divyesh Shah   blkio: Increment ...
189
190
  static inline void blkiocg_update_dequeue_stats(struct blkio_group *blkg,
  						unsigned long dequeue) {}
812df48d1   Divyesh Shah   blkio: Add more d...
191
192
193
  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...
194
  static inline void blkiocg_set_start_empty_time(struct blkio_group *blkg) {}
2868ef7b3   Vivek Goyal   blkio: Some debug...
195
  #endif
67523c48a   Ben Blum   cgroups: blkio su...
196
  #if defined(CONFIG_BLK_CGROUP) || defined(CONFIG_BLK_CGROUP_MODULE)
31e4c28d9   Vivek Goyal   blkio: Introduce ...
197
198
199
  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,
220841906   Vivek Goyal   blkio: Export dis...
200
  			struct blkio_group *blkg, void *key, dev_t dev);
31e4c28d9   Vivek Goyal   blkio: Introduce ...
201
202
203
  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...
204
205
  void blkiocg_update_timeslice_used(struct blkio_group *blkg,
  					unsigned long time);
84c124da9   Divyesh Shah   blkio: Changes to...
206
207
208
209
  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...
210
211
  void blkiocg_update_io_merged_stats(struct blkio_group *blkg, bool direction,
  					bool sync);
a11cdaa7a   Divyesh Shah   block: Update to ...
212
  void blkiocg_update_io_add_stats(struct blkio_group *blkg,
cdc1184cf   Divyesh Shah   blkio: Add io_que...
213
  		struct blkio_group *curr_blkg, bool direction, bool sync);
a11cdaa7a   Divyesh Shah   block: Update to ...
214
  void blkiocg_update_io_remove_stats(struct blkio_group *blkg,
cdc1184cf   Divyesh Shah   blkio: Add io_que...
215
  					bool direction, bool sync);
31e4c28d9   Vivek Goyal   blkio: Introduce ...
216
  #else
2f5ea4771   Jens Axboe   cfq-iosched: fix ...
217
  struct cgroup;
31e4c28d9   Vivek Goyal   blkio: Introduce ...
218
219
220
221
  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,
84c124da9   Divyesh Shah   blkio: Changes to...
222
  			struct blkio_group *blkg, void *key, dev_t dev) {}
31e4c28d9   Vivek Goyal   blkio: Introduce ...
223
224
225
226
227
228
  
  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...
229
  static inline void blkiocg_update_timeslice_used(struct blkio_group *blkg,
9a0785b0d   Divyesh Shah   blkio: Remove per...
230
  						unsigned long time) {}
84c124da9   Divyesh Shah   blkio: Changes to...
231
232
233
234
235
  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...
236
237
  static inline void blkiocg_update_io_merged_stats(struct blkio_group *blkg,
  						bool direction, bool sync) {}
a11cdaa7a   Divyesh Shah   block: Update to ...
238
  static inline void blkiocg_update_io_add_stats(struct blkio_group *blkg,
cdc1184cf   Divyesh Shah   blkio: Add io_que...
239
  		struct blkio_group *curr_blkg, bool direction, bool sync) {}
a11cdaa7a   Divyesh Shah   block: Update to ...
240
  static inline void blkiocg_update_io_remove_stats(struct blkio_group *blkg,
cdc1184cf   Divyesh Shah   blkio: Add io_que...
241
  						bool direction, bool sync) {}
31e4c28d9   Vivek Goyal   blkio: Introduce ...
242
243
  #endif
  #endif /* _BLK_CGROUP_H */