aboutsummaryrefslogtreecommitdiffstats
path: root/block/cfq-iosched.c
diff options
context:
space:
mode:
Diffstat (limited to 'block/cfq-iosched.c')
-rw-r--r--block/cfq-iosched.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 7982b830db58..d4edeb8fceb8 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -646,9 +646,10 @@ cfq_choose_req(struct cfq_data *cfqd, struct request *rq1, struct request *rq2,
646 return rq1; 646 return rq1;
647 else if (rq_is_sync(rq2) && !rq_is_sync(rq1)) 647 else if (rq_is_sync(rq2) && !rq_is_sync(rq1))
648 return rq2; 648 return rq2;
649 if (rq_is_meta(rq1) && !rq_is_meta(rq2)) 649 if ((rq1->cmd_flags & REQ_RW_META) && !(rq2->cmd_flags & REQ_RW_META))
650 return rq1; 650 return rq1;
651 else if (rq_is_meta(rq2) && !rq_is_meta(rq1)) 651 else if ((rq2->cmd_flags & REQ_RW_META) &&
652 !(rq1->cmd_flags & REQ_RW_META))
652 return rq2; 653 return rq2;
653 654
654 s1 = blk_rq_pos(rq1); 655 s1 = blk_rq_pos(rq1);
@@ -1484,7 +1485,7 @@ static void cfq_remove_request(struct request *rq)
1484 cfqq->cfqd->rq_queued--; 1485 cfqq->cfqd->rq_queued--;
1485 cfq_blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg, 1486 cfq_blkiocg_update_io_remove_stats(&(RQ_CFQG(rq))->blkg,
1486 rq_data_dir(rq), rq_is_sync(rq)); 1487 rq_data_dir(rq), rq_is_sync(rq));
1487 if (rq_is_meta(rq)) { 1488 if (rq->cmd_flags & REQ_RW_META) {
1488 WARN_ON(!cfqq->meta_pending); 1489 WARN_ON(!cfqq->meta_pending);
1489 cfqq->meta_pending--; 1490 cfqq->meta_pending--;
1490 } 1491 }
@@ -3176,7 +3177,7 @@ cfq_should_preempt(struct cfq_data *cfqd, struct cfq_queue *new_cfqq,
3176 * So both queues are sync. Let the new request get disk time if 3177 * So both queues are sync. Let the new request get disk time if
3177 * it's a metadata request and the current queue is doing regular IO. 3178 * it's a metadata request and the current queue is doing regular IO.
3178 */ 3179 */
3179 if (rq_is_meta(rq) && !cfqq->meta_pending) 3180 if ((rq->cmd_flags & REQ_RW_META) && !cfqq->meta_pending)
3180 return true; 3181 return true;
3181 3182
3182 /* 3183 /*
@@ -3230,7 +3231,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
3230 struct cfq_io_context *cic = RQ_CIC(rq); 3231 struct cfq_io_context *cic = RQ_CIC(rq);
3231 3232
3232 cfqd->rq_queued++; 3233 cfqd->rq_queued++;
3233 if (rq_is_meta(rq)) 3234 if (rq->cmd_flags & REQ_RW_META)
3234 cfqq->meta_pending++; 3235 cfqq->meta_pending++;
3235 3236
3236 cfq_update_io_thinktime(cfqd, cic); 3237 cfq_update_io_thinktime(cfqd, cic);
@@ -3365,7 +3366,8 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
3365 unsigned long now; 3366 unsigned long now;
3366 3367
3367 now = jiffies; 3368 now = jiffies;
3368 cfq_log_cfqq(cfqd, cfqq, "complete rqnoidle %d", !!rq_noidle(rq)); 3369 cfq_log_cfqq(cfqd, cfqq, "complete rqnoidle %d",
3370 !!(rq->cmd_flags & REQ_NOIDLE));
3369 3371
3370 cfq_update_hw_tag(cfqd); 3372 cfq_update_hw_tag(cfqd);
3371 3373
@@ -3419,11 +3421,12 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
3419 cfq_slice_expired(cfqd, 1); 3421 cfq_slice_expired(cfqd, 1);
3420 else if (sync && cfqq_empty && 3422 else if (sync && cfqq_empty &&
3421 !cfq_close_cooperator(cfqd, cfqq)) { 3423 !cfq_close_cooperator(cfqd, cfqq)) {
3422 cfqd->noidle_tree_requires_idle |= !rq_noidle(rq); 3424 cfqd->noidle_tree_requires_idle |=
3425 !(rq->cmd_flags & REQ_NOIDLE);
3423 /* 3426 /*
3424 * Idling is enabled for SYNC_WORKLOAD. 3427 * Idling is enabled for SYNC_WORKLOAD.
3425 * SYNC_NOIDLE_WORKLOAD idles at the end of the tree 3428 * SYNC_NOIDLE_WORKLOAD idles at the end of the tree
3426 * only if we processed at least one !rq_noidle request 3429 * only if we processed at least one !REQ_NOIDLE request
3427 */ 3430 */
3428 if (cfqd->serving_type == SYNC_WORKLOAD 3431 if (cfqd->serving_type == SYNC_WORKLOAD
3429 || cfqd->noidle_tree_requires_idle 3432 || cfqd->noidle_tree_requires_idle