blk-merge.c 10.8 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
/*
 * Functions related to segment and merge handling
 */
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/bio.h>
#include <linux/blkdev.h>
#include <linux/scatterlist.h>

#include "blk.h"

12
static unsigned int __blk_recalc_rq_segments(struct request_queue *q,
13
					     struct bio *bio)
14
15
16
{
	unsigned int phys_size;
	struct bio_vec *bv, *bvprv = NULL;
17
18
	int cluster, i, high, highprv = 1;
	unsigned int seg_size, nr_phys_segs;
19
	struct bio *fbio, *bbio;
20

21
22
	if (!bio)
		return 0;
23

24
	fbio = bio;
25
	cluster = test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
Mikulas Patocka's avatar
Mikulas Patocka committed
26
27
	seg_size = 0;
	phys_size = nr_phys_segs = 0;
28
29
30
31
32
33
34
	for_each_bio(bio) {
		bio_for_each_segment(bv, bio, i) {
			/*
			 * the trick here is making sure that a high page is
			 * never considered part of another segment, since that
			 * might change with the bounce page.
			 */
35
			high = page_to_pfn(bv->bv_page) > queue_bounce_pfn(q);
36
			if (high || highprv)
37
				goto new_segment;
38
			if (cluster) {
39
40
				if (seg_size + bv->bv_len
				    > queue_max_segment_size(q))
41
42
43
44
45
					goto new_segment;
				if (!BIOVEC_PHYS_MERGEABLE(bvprv, bv))
					goto new_segment;
				if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bv))
					goto new_segment;
46

47
48
49
50
				seg_size += bv->bv_len;
				bvprv = bv;
				continue;
			}
51
new_segment:
52
53
54
			if (nr_phys_segs == 1 && seg_size >
			    fbio->bi_seg_front_size)
				fbio->bi_seg_front_size = seg_size;
55

56
57
58
59
60
			nr_phys_segs++;
			bvprv = bv;
			seg_size = bv->bv_len;
			highprv = high;
		}
61
		bbio = bio;
62
63
	}

64
65
66
67
	if (nr_phys_segs == 1 && seg_size > fbio->bi_seg_front_size)
		fbio->bi_seg_front_size = seg_size;
	if (seg_size > bbio->bi_seg_back_size)
		bbio->bi_seg_back_size = seg_size;
68
69
70
71
72
73

	return nr_phys_segs;
}

void blk_recalc_rq_segments(struct request *rq)
{
74
	rq->nr_phys_segments = __blk_recalc_rq_segments(rq->q, rq->bio);
75
76
77
78
79
}

void blk_recount_segments(struct request_queue *q, struct bio *bio)
{
	struct bio *nxt = bio->bi_next;
80

81
	bio->bi_next = NULL;
82
	bio->bi_phys_segments = __blk_recalc_rq_segments(q, bio);
83
84
85
86
87
88
89
90
	bio->bi_next = nxt;
	bio->bi_flags |= (1 << BIO_SEG_VALID);
}
EXPORT_SYMBOL(blk_recount_segments);

static int blk_phys_contig_segment(struct request_queue *q, struct bio *bio,
				   struct bio *nxt)
{
91
	if (!test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags))
92
93
		return 0;

94
	if (bio->bi_seg_back_size + nxt->bi_seg_front_size >
95
	    queue_max_segment_size(q))
96
97
		return 0;

98
99
100
101
102
103
	if (!bio_has_data(bio))
		return 1;

	if (!BIOVEC_PHYS_MERGEABLE(__BVEC_END(bio), __BVEC_START(nxt)))
		return 0;

104
	/*
105
	 * bio and nxt are contiguous in memory; check if the queue allows
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
	 * these two to be merged into one
	 */
	if (BIO_SEG_BOUNDARY(q, bio, nxt))
		return 1;

	return 0;
}

/*
 * map a request to scatterlist, return number of sg entries setup. Caller
 * must make sure sg can hold rq->nr_phys_segments entries
 */
int blk_rq_map_sg(struct request_queue *q, struct request *rq,
		  struct scatterlist *sglist)
{
	struct bio_vec *bvec, *bvprv;
	struct req_iterator iter;
	struct scatterlist *sg;
	int nsegs, cluster;

	nsegs = 0;
127
	cluster = test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
128
129
130
131
132
133
134
135
136
137

	/*
	 * for each bio in rq
	 */
	bvprv = NULL;
	sg = NULL;
	rq_for_each_segment(bvec, rq, iter) {
		int nbytes = bvec->bv_len;

		if (bvprv && cluster) {
138
			if (sg->length + nbytes > queue_max_segment_size(q))
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
				goto new_segment;

			if (!BIOVEC_PHYS_MERGEABLE(bvprv, bvec))
				goto new_segment;
			if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bvec))
				goto new_segment;

			sg->length += nbytes;
		} else {
new_segment:
			if (!sg)
				sg = sglist;
			else {
				/*
				 * If the driver previously mapped a shorter
				 * list, we could see a termination bit
				 * prematurely unless it fully inits the sg
				 * table on each mapping. We KNOW that there
				 * must be more entries here or the driver
				 * would be buggy, so force clear the
				 * termination bit to avoid doing a full
				 * sg_init_table() in drivers for each command.
				 */
				sg->page_link &= ~0x02;
				sg = sg_next(sg);
			}

			sg_set_page(sg, bvec->bv_page, nbytes, bvec->bv_offset);
			nsegs++;
		}
		bvprv = bvec;
	} /* segments in rq */

172
173

	if (unlikely(rq->cmd_flags & REQ_COPY_USER) &&
174
175
176
	    (blk_rq_bytes(rq) & q->dma_pad_mask)) {
		unsigned int pad_len =
			(q->dma_pad_mask & ~blk_rq_bytes(rq)) + 1;
177
178
179
180
181

		sg->length += pad_len;
		rq->extra_len += pad_len;
	}

182
	if (q->dma_drain_size && q->dma_drain_needed(rq)) {
183
184
185
		if (rq->cmd_flags & REQ_RW)
			memset(q->dma_drain_buffer, 0, q->dma_drain_size);

186
187
188
189
190
191
192
		sg->page_link &= ~0x02;
		sg = sg_next(sg);
		sg_set_page(sg, virt_to_page(q->dma_drain_buffer),
			    q->dma_drain_size,
			    ((unsigned long)q->dma_drain_buffer) &
			    (PAGE_SIZE - 1));
		nsegs++;
193
		rq->extra_len += q->dma_drain_size;
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
	}

	if (sg)
		sg_mark_end(sg);

	return nsegs;
}
EXPORT_SYMBOL(blk_rq_map_sg);

static inline int ll_new_hw_segment(struct request_queue *q,
				    struct request *req,
				    struct bio *bio)
{
	int nr_phys_segs = bio_phys_segments(q, bio);

209
210
	if (req->nr_phys_segments + nr_phys_segs > queue_max_hw_segments(q) ||
	    req->nr_phys_segments + nr_phys_segs > queue_max_phys_segments(q)) {
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
		req->cmd_flags |= REQ_NOMERGE;
		if (req == q->last_merge)
			q->last_merge = NULL;
		return 0;
	}

	/*
	 * This will form the start of a new hw segment.  Bump both
	 * counters.
	 */
	req->nr_phys_segments += nr_phys_segs;
	return 1;
}

int ll_back_merge_fn(struct request_queue *q, struct request *req,
		     struct bio *bio)
{
	unsigned short max_sectors;

	if (unlikely(blk_pc_request(req)))
231
		max_sectors = queue_max_hw_sectors(q);
232
	else
233
		max_sectors = queue_max_sectors(q);
234

235
	if (blk_rq_sectors(req) + bio_sectors(bio) > max_sectors) {
236
237
238
239
240
		req->cmd_flags |= REQ_NOMERGE;
		if (req == q->last_merge)
			q->last_merge = NULL;
		return 0;
	}
241
	if (!bio_flagged(req->biotail, BIO_SEG_VALID))
242
		blk_recount_segments(q, req->biotail);
243
	if (!bio_flagged(bio, BIO_SEG_VALID))
244
245
246
247
248
		blk_recount_segments(q, bio);

	return ll_new_hw_segment(q, req, bio);
}

249
int ll_front_merge_fn(struct request_queue *q, struct request *req,
250
251
252
253
254
		      struct bio *bio)
{
	unsigned short max_sectors;

	if (unlikely(blk_pc_request(req)))
255
		max_sectors = queue_max_hw_sectors(q);
256
	else
257
		max_sectors = queue_max_sectors(q);
258
259


260
	if (blk_rq_sectors(req) + bio_sectors(bio) > max_sectors) {
261
262
263
264
265
		req->cmd_flags |= REQ_NOMERGE;
		if (req == q->last_merge)
			q->last_merge = NULL;
		return 0;
	}
266
	if (!bio_flagged(bio, BIO_SEG_VALID))
267
		blk_recount_segments(q, bio);
268
	if (!bio_flagged(req->bio, BIO_SEG_VALID))
269
270
271
272
273
274
275
276
277
		blk_recount_segments(q, req->bio);

	return ll_new_hw_segment(q, req, bio);
}

static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
				struct request *next)
{
	int total_phys_segments;
278
279
	unsigned int seg_size =
		req->biotail->bi_seg_back_size + next->bio->bi_seg_front_size;
280
281
282
283
284
285
286
287
288
289
290

	/*
	 * First check if the either of the requests are re-queued
	 * requests.  Can't merge them if they are.
	 */
	if (req->special || next->special)
		return 0;

	/*
	 * Will it become too large?
	 */
291
	if ((blk_rq_sectors(req) + blk_rq_sectors(next)) > queue_max_sectors(q))
292
293
294
		return 0;

	total_phys_segments = req->nr_phys_segments + next->nr_phys_segments;
295
296
297
298
299
	if (blk_phys_contig_segment(q, req->biotail, next->bio)) {
		if (req->nr_phys_segments == 1)
			req->bio->bi_seg_front_size = seg_size;
		if (next->nr_phys_segments == 1)
			next->biotail->bi_seg_back_size = seg_size;
300
		total_phys_segments--;
301
	}
302

303
	if (total_phys_segments > queue_max_phys_segments(q))
304
305
		return 0;

306
	if (total_phys_segments > queue_max_hw_segments(q))
307
308
309
310
311
312
313
		return 0;

	/* Merge is OK... */
	req->nr_phys_segments = total_phys_segments;
	return 1;
}

314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
/**
 * blk_rq_set_mixed_merge - mark a request as mixed merge
 * @rq: request to mark as mixed merge
 *
 * Description:
 *     @rq is about to be mixed merged.  Make sure the attributes
 *     which can be mixed are set in each bio and mark @rq as mixed
 *     merged.
 */
void blk_rq_set_mixed_merge(struct request *rq)
{
	unsigned int ff = rq->cmd_flags & REQ_FAILFAST_MASK;
	struct bio *bio;

	if (rq->cmd_flags & REQ_MIXED_MERGE)
		return;

	/*
	 * @rq will no longer represent mixable attributes for all the
	 * contained bios.  It will just track those of the first one.
	 * Distributes the attributs to each bio.
	 */
	for (bio = rq->bio; bio; bio = bio->bi_next) {
		WARN_ON_ONCE((bio->bi_rw & REQ_FAILFAST_MASK) &&
			     (bio->bi_rw & REQ_FAILFAST_MASK) != ff);
		bio->bi_rw |= ff;
	}
	rq->cmd_flags |= REQ_MIXED_MERGE;
}

344
345
346
347
348
349
350
static void blk_account_io_merge(struct request *req)
{
	if (blk_do_io_stat(req)) {
		struct hd_struct *part;
		int cpu;

		cpu = part_stat_lock();
351
		part = disk_map_sector_rcu(req->rq_disk, blk_rq_pos(req));
352
353
354
355
356
357
358
359

		part_round_stats(cpu, part);
		part_dec_in_flight(part);

		part_stat_unlock();
	}
}

360
361
362
363
364
365
366
367
368
369
370
371
/*
 * Has to be called with the request spinlock acquired
 */
static int attempt_merge(struct request_queue *q, struct request *req,
			  struct request *next)
{
	if (!rq_mergeable(req) || !rq_mergeable(next))
		return 0;

	/*
	 * not contiguous
	 */
372
	if (blk_rq_pos(req) + blk_rq_sectors(req) != blk_rq_pos(next))
373
374
375
376
377
378
379
		return 0;

	if (rq_data_dir(req) != rq_data_dir(next)
	    || req->rq_disk != next->rq_disk
	    || next->special)
		return 0;

380
381
382
	if (blk_integrity_rq(req) != blk_integrity_rq(next))
		return 0;

383
384
385
386
387
388
389
390
391
	/*
	 * If we are allowed to merge, then append bio list
	 * from next to rq and release next. merge_requests_fn
	 * will have updated segment counts, update sector
	 * counts here.
	 */
	if (!ll_merge_requests_fn(q, req, next))
		return 0;

392
393
394
395
396
397
398
399
400
401
402
403
404
	/*
	 * If failfast settings disagree or any of the two is already
	 * a mixed merge, mark both as mixed before proceeding.  This
	 * makes sure that all involved bios have mixable attributes
	 * set properly.
	 */
	if ((req->cmd_flags | next->cmd_flags) & REQ_MIXED_MERGE ||
	    (req->cmd_flags & REQ_FAILFAST_MASK) !=
	    (next->cmd_flags & REQ_FAILFAST_MASK)) {
		blk_rq_set_mixed_merge(req);
		blk_rq_set_mixed_merge(next);
	}

405
406
407
408
409
410
411
412
413
414
415
416
	/*
	 * At this point we have either done a back merge
	 * or front merge. We need the smaller start_time of
	 * the merged requests to be the current request
	 * for accounting purposes.
	 */
	if (time_after(req->start_time, next->start_time))
		req->start_time = next->start_time;

	req->biotail->bi_next = next->bio;
	req->biotail = next->biotail;

417
	req->__data_len += blk_rq_bytes(next);
418
419
420

	elv_merge_requests(q, req, next);

421
422
423
424
	/*
	 * 'next' is going away, so update stats accordingly
	 */
	blk_account_io_merge(next);
425
426

	req->ioprio = ioprio_best(req->ioprio, next->ioprio);
427
428
	if (blk_rq_cpu_valid(next))
		req->cpu = next->cpu;
429

430
431
	/* owner-ship of bio passed from next to req */
	next->bio = NULL;
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
	__blk_put_request(q, next);
	return 1;
}

int attempt_back_merge(struct request_queue *q, struct request *rq)
{
	struct request *next = elv_latter_request(q, rq);

	if (next)
		return attempt_merge(q, rq, next);

	return 0;
}

int attempt_front_merge(struct request_queue *q, struct request *rq)
{
	struct request *prev = elv_former_request(q, rq);

	if (prev)
		return attempt_merge(q, prev, rq);

	return 0;
}