Blame view

block/blk.h 7.5 KB
8324aa91d   Jens Axboe   block: split tag ...
1
2
  #ifndef BLK_INTERNAL_H
  #define BLK_INTERNAL_H
a73f730d0   Tejun Heo   block, cfq: move ...
3
  #include <linux/idr.h>
86db1e297   Jens Axboe   block: continue l...
4
5
6
7
8
  /* Amount of time in which a process may batch requests */
  #define BLK_BATCH_TIME	(HZ/50UL)
  
  /* Number of requests a "batching" process may submit */
  #define BLK_BATCH_REQ	32
8324aa91d   Jens Axboe   block: split tag ...
9
10
  extern struct kmem_cache *blk_requestq_cachep;
  extern struct kobj_type blk_queue_ktype;
a73f730d0   Tejun Heo   block, cfq: move ...
11
  extern struct ida blk_queue_ida;
8324aa91d   Jens Axboe   block: split tag ...
12

09ac46c42   Tejun Heo   block: misc updat...
13
14
15
16
  static inline void __blk_get_queue(struct request_queue *q)
  {
  	kobject_get(&q->kobj);
  }
86db1e297   Jens Axboe   block: continue l...
17
18
19
  void init_request_from_bio(struct request *req, struct bio *bio);
  void blk_rq_bio_prep(struct request_queue *q, struct request *rq,
  			struct bio *bio);
a411f4bbb   Boaz Harrosh   block: Un-export ...
20
21
  int blk_rq_append_bio(struct request_queue *q, struct request *rq,
  		      struct bio *bio);
c9a929dde   Tejun Heo   block: fix reques...
22
  void blk_drain_queue(struct request_queue *q, bool drain_all);
9934c8c04   Tejun Heo   block: implement ...
23
  void blk_dequeue_request(struct request *rq);
8324aa91d   Jens Axboe   block: split tag ...
24
  void __blk_queue_free_tags(struct request_queue *q);
4853abaae   Jeff Moyer   block: fix flush ...
25
26
  bool __blk_end_bidi_request(struct request *rq, int error,
  			    unsigned int nr_bytes, unsigned int bidi_bytes);
8324aa91d   Jens Axboe   block: split tag ...
27

242f9dcb8   Jens Axboe   block: unify requ...
28
29
30
  void blk_rq_timed_out_timer(unsigned long data);
  void blk_delete_timer(struct request *);
  void blk_add_timer(struct request *);
f73e2d13a   Jens Axboe   block: remove __g...
31
  void __generic_unplug_device(struct request_queue *);
242f9dcb8   Jens Axboe   block: unify requ...
32
33
34
35
36
37
38
39
40
41
  
  /*
   * Internal atomic flags for request handling
   */
  enum rq_atomic_flags {
  	REQ_ATOM_COMPLETE = 0,
  };
  
  /*
   * EH timer and IO completion will both attempt to 'grab' the request, make
25985edce   Lucas De Marchi   Fix common misspe...
42
   * sure that only one of them succeeds
242f9dcb8   Jens Axboe   block: unify requ...
43
44
45
46
47
48
49
50
51
52
   */
  static inline int blk_mark_rq_complete(struct request *rq)
  {
  	return test_and_set_bit(REQ_ATOM_COMPLETE, &rq->atomic_flags);
  }
  
  static inline void blk_clear_rq_complete(struct request *rq)
  {
  	clear_bit(REQ_ATOM_COMPLETE, &rq->atomic_flags);
  }
86db1e297   Jens Axboe   block: continue l...
53

158dbda00   Tejun Heo   block: reorganize...
54
55
56
57
  /*
   * Internal elevator interface
   */
  #define ELV_ON_HASH(rq)		(!hlist_unhashed(&(rq)->hash))
ae1b15396   Tejun Heo   block: reimplemen...
58
59
  void blk_insert_flush(struct request *rq);
  void blk_abort_flushes(struct request_queue *q);
dd831006d   Tejun Heo   block: misc clean...
60

158dbda00   Tejun Heo   block: reorganize...
61
62
63
64
65
  static inline struct request *__elv_next_request(struct request_queue *q)
  {
  	struct request *rq;
  
  	while (1) {
ae1b15396   Tejun Heo   block: reimplemen...
66
  		if (!list_empty(&q->queue_head)) {
158dbda00   Tejun Heo   block: reorganize...
67
  			rq = list_entry_rq(q->queue_head.next);
ae1b15396   Tejun Heo   block: reimplemen...
68
  			return rq;
158dbda00   Tejun Heo   block: reorganize...
69
  		}
3ac0cc450   shaohua.li@intel.com   block: hold queue...
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  		/*
  		 * Flush request is running and flush request isn't queueable
  		 * in the drive, we can hold the queue till flush request is
  		 * finished. Even we don't do this, driver can't dispatch next
  		 * requests and will requeue them. And this can improve
  		 * throughput too. For example, we have request flush1, write1,
  		 * flush 2. flush1 is dispatched, then queue is hold, write1
  		 * isn't inserted to queue. After flush1 is finished, flush2
  		 * will be dispatched. Since disk cache is already clean,
  		 * flush2 will be finished very soon, so looks like flush2 is
  		 * folded to flush1.
  		 * Since the queue is hold, a flag is set to indicate the queue
  		 * should be restarted later. Please see flush_end_io() for
  		 * details.
  		 */
  		if (q->flush_pending_idx != q->flush_running_idx &&
  				!queue_flush_queueable(q)) {
  			q->flush_queue_delayed = 1;
  			return NULL;
  		}
34f6055c8   Tejun Heo   block: add blk_qu...
90
  		if (unlikely(blk_queue_dead(q)) ||
22f746e23   Tejun Heo   block: remove ele...
91
  		    !q->elevator->type->ops.elevator_dispatch_fn(q, 0))
158dbda00   Tejun Heo   block: reorganize...
92
93
94
95
96
97
98
  			return NULL;
  	}
  }
  
  static inline void elv_activate_rq(struct request_queue *q, struct request *rq)
  {
  	struct elevator_queue *e = q->elevator;
22f746e23   Tejun Heo   block: remove ele...
99
100
  	if (e->type->ops.elevator_activate_req_fn)
  		e->type->ops.elevator_activate_req_fn(q, rq);
158dbda00   Tejun Heo   block: reorganize...
101
102
103
104
105
  }
  
  static inline void elv_deactivate_rq(struct request_queue *q, struct request *rq)
  {
  	struct elevator_queue *e = q->elevator;
22f746e23   Tejun Heo   block: remove ele...
106
107
  	if (e->type->ops.elevator_deactivate_req_fn)
  		e->type->ops.elevator_deactivate_req_fn(q, rq);
158dbda00   Tejun Heo   block: reorganize...
108
  }
581d4e28d   Jens Axboe   block: add fault ...
109
110
111
112
113
114
115
116
117
118
119
  #ifdef CONFIG_FAIL_IO_TIMEOUT
  int blk_should_fake_timeout(struct request_queue *);
  ssize_t part_timeout_show(struct device *, struct device_attribute *, char *);
  ssize_t part_timeout_store(struct device *, struct device_attribute *,
  				const char *, size_t);
  #else
  static inline int blk_should_fake_timeout(struct request_queue *q)
  {
  	return 0;
  }
  #endif
d6d481969   Jens Axboe   block: ll_rw_blk....
120
121
122
123
124
125
  int ll_back_merge_fn(struct request_queue *q, struct request *req,
  		     struct bio *bio);
  int ll_front_merge_fn(struct request_queue *q, struct request *req, 
  		      struct bio *bio);
  int attempt_back_merge(struct request_queue *q, struct request *rq);
  int attempt_front_merge(struct request_queue *q, struct request *rq);
5e84ea3a9   Jens Axboe   block: attempt to...
126
127
  int blk_attempt_req_merge(struct request_queue *q, struct request *rq,
  				struct request *next);
d6d481969   Jens Axboe   block: ll_rw_blk....
128
  void blk_recalc_rq_segments(struct request *rq);
80a761fd3   Tejun Heo   block: implement ...
129
  void blk_rq_set_mixed_merge(struct request *rq);
d6d481969   Jens Axboe   block: ll_rw_blk....
130

8324aa91d   Jens Axboe   block: split tag ...
131
  void blk_queue_congestion_threshold(struct request_queue *q);
ff88972c8   Adrian Bunk   proper prototype ...
132
  int blk_dev_init(void);
f253b86b4   Jens Axboe   Revert "block: fi...
133
134
  void elv_quiesce_start(struct request_queue *q);
  void elv_quiesce_end(struct request_queue *q);
8324aa91d   Jens Axboe   block: split tag ...
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  /*
   * Return the threshold (number of used requests) at which the queue is
   * considered to be congested.  It include a little hysteresis to keep the
   * context switch rate down.
   */
  static inline int queue_congestion_on_threshold(struct request_queue *q)
  {
  	return q->nr_congestion_on;
  }
  
  /*
   * The threshold at which a queue is considered to be uncongested
   */
  static inline int queue_congestion_off_threshold(struct request_queue *q)
  {
  	return q->nr_congestion_off;
  }
c7c22e4d5   Jens Axboe   block: add suppor...
152
153
  static inline int blk_cpu_to_group(int cpu)
  {
be14eb619   Brian King   block: Range chec...
154
  	int group = NR_CPUS;
c7c22e4d5   Jens Axboe   block: add suppor...
155
  #ifdef CONFIG_SCHED_MC
be4d638c1   Rusty Russell   cpumask: Replace ...
156
  	const struct cpumask *mask = cpu_coregroup_mask(cpu);
be14eb619   Brian King   block: Range chec...
157
  	group = cpumask_first(mask);
c7c22e4d5   Jens Axboe   block: add suppor...
158
  #elif defined(CONFIG_SCHED_SMT)
be14eb619   Brian King   block: Range chec...
159
  	group = cpumask_first(topology_thread_cpumask(cpu));
c7c22e4d5   Jens Axboe   block: add suppor...
160
161
162
  #else
  	return cpu;
  #endif
be14eb619   Brian King   block: Range chec...
163
164
165
  	if (likely(group < NR_CPUS))
  		return group;
  	return cpu;
c7c22e4d5   Jens Axboe   block: add suppor...
166
  }
c2553b584   Jens Axboe   block: make blk_d...
167
168
169
170
171
  /*
   * Contribute to IO statistics IFF:
   *
   *	a) it's attached to a gendisk, and
   *	b) the queue had IO stats enabled when this request was started, and
3c4198e87   Kiyoshi Ueda   block: fix no dis...
172
   *	c) it's a file system request or a discard request
c2553b584   Jens Axboe   block: make blk_d...
173
   */
26308eab6   Jerome Marchand   block: fix incons...
174
  static inline int blk_do_io_stat(struct request *rq)
fb8ec18c3   Jens Axboe   block: fix oops i...
175
  {
33659ebba   Christoph Hellwig   block: remove wra...
176
177
178
179
  	return rq->rq_disk &&
  	       (rq->cmd_flags & REQ_IO_STAT) &&
  	       (rq->cmd_type == REQ_TYPE_FS ||
  	        (rq->cmd_flags & REQ_DISCARD));
fb8ec18c3   Jens Axboe   block: fix oops i...
180
  }
f2dbd76a0   Tejun Heo   block, cfq: repla...
181
182
183
184
  /*
   * Internal io_context interface
   */
  void get_io_context(struct io_context *ioc);
47fdd4ca9   Tejun Heo   block, cfq: move ...
185
  struct io_cq *ioc_lookup_icq(struct io_context *ioc, struct request_queue *q);
f1f8cc946   Tejun Heo   block, cfq: move ...
186
  struct io_cq *ioc_create_icq(struct request_queue *q, gfp_t gfp_mask);
7e5a87944   Tejun Heo   block, cfq: move ...
187
  void ioc_clear_queue(struct request_queue *q);
f2dbd76a0   Tejun Heo   block, cfq: repla...
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
  
  void create_io_context_slowpath(struct task_struct *task, gfp_t gfp_mask,
  				int node);
  
  /**
   * create_io_context - try to create task->io_context
   * @task: target task
   * @gfp_mask: allocation mask
   * @node: allocation node
   *
   * If @task->io_context is %NULL, allocate a new io_context and install it.
   * Returns the current @task->io_context which may be %NULL if allocation
   * failed.
   *
   * Note that this function can't be called with IRQ disabled because
   * task_lock which protects @task->io_context is IRQ-unsafe.
   */
  static inline struct io_context *create_io_context(struct task_struct *task,
  						   gfp_t gfp_mask, int node)
  {
  	WARN_ON_ONCE(irqs_disabled());
  	if (unlikely(!task->io_context))
  		create_io_context_slowpath(task, gfp_mask, node);
  	return task->io_context;
  }
  
  /*
   * Internal throttling interface
   */
bc9fcbf9c   Tejun Heo   block: move blk_t...
217
  #ifdef CONFIG_BLK_DEV_THROTTLING
bc16a4f93   Tejun Heo   block: reorganize...
218
  extern bool blk_throtl_bio(struct request_queue *q, struct bio *bio);
c9a929dde   Tejun Heo   block: fix reques...
219
  extern void blk_throtl_drain(struct request_queue *q);
bc9fcbf9c   Tejun Heo   block: move blk_t...
220
221
  extern int blk_throtl_init(struct request_queue *q);
  extern void blk_throtl_exit(struct request_queue *q);
c9a929dde   Tejun Heo   block: fix reques...
222
  extern void blk_throtl_release(struct request_queue *q);
bc9fcbf9c   Tejun Heo   block: move blk_t...
223
  #else /* CONFIG_BLK_DEV_THROTTLING */
bc16a4f93   Tejun Heo   block: reorganize...
224
  static inline bool blk_throtl_bio(struct request_queue *q, struct bio *bio)
bc9fcbf9c   Tejun Heo   block: move blk_t...
225
  {
bc16a4f93   Tejun Heo   block: reorganize...
226
  	return false;
bc9fcbf9c   Tejun Heo   block: move blk_t...
227
  }
c9a929dde   Tejun Heo   block: fix reques...
228
  static inline void blk_throtl_drain(struct request_queue *q) { }
bc9fcbf9c   Tejun Heo   block: move blk_t...
229
230
  static inline int blk_throtl_init(struct request_queue *q) { return 0; }
  static inline void blk_throtl_exit(struct request_queue *q) { }
c9a929dde   Tejun Heo   block: fix reques...
231
  static inline void blk_throtl_release(struct request_queue *q) { }
bc9fcbf9c   Tejun Heo   block: move blk_t...
232
233
234
  #endif /* CONFIG_BLK_DEV_THROTTLING */
  
  #endif /* BLK_INTERNAL_H */