diff options
Diffstat (limited to 'block/blk.h')
| -rw-r--r-- | block/blk.h | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/block/blk.h b/block/blk.h index c9df8fc3c999..83e4bff36201 100644 --- a/block/blk.h +++ b/block/blk.h | |||
| @@ -62,7 +62,26 @@ static inline struct request *__elv_next_request(struct request_queue *q) | |||
| 62 | rq = list_entry_rq(q->queue_head.next); | 62 | rq = list_entry_rq(q->queue_head.next); |
| 63 | return rq; | 63 | return rq; |
| 64 | } | 64 | } |
| 65 | 65 | /* | |
| 66 | * Flush request is running and flush request isn't queueable | ||
| 67 | * in the drive, we can hold the queue till flush request is | ||
| 68 | * finished. Even we don't do this, driver can't dispatch next | ||
| 69 | * requests and will requeue them. And this can improve | ||
| 70 | * throughput too. For example, we have request flush1, write1, | ||
| 71 | * flush 2. flush1 is dispatched, then queue is hold, write1 | ||
| 72 | * isn't inserted to queue. After flush1 is finished, flush2 | ||
| 73 | * will be dispatched. Since disk cache is already clean, | ||
| 74 | * flush2 will be finished very soon, so looks like flush2 is | ||
| 75 | * folded to flush1. | ||
| 76 | * Since the queue is hold, a flag is set to indicate the queue | ||
| 77 | * should be restarted later. Please see flush_end_io() for | ||
| 78 | * details. | ||
| 79 | */ | ||
| 80 | if (q->flush_pending_idx != q->flush_running_idx && | ||
| 81 | !queue_flush_queueable(q)) { | ||
| 82 | q->flush_queue_delayed = 1; | ||
| 83 | return NULL; | ||
| 84 | } | ||
| 66 | if (!q->elevator->ops->elevator_dispatch_fn(q, 0)) | 85 | if (!q->elevator->ops->elevator_dispatch_fn(q, 0)) |
| 67 | return NULL; | 86 | return NULL; |
| 68 | } | 87 | } |
