diff options
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-core.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/block/blk-core.c b/block/blk-core.c index 67dba694119..b2ed78afd9f 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
@@ -1167,7 +1167,7 @@ static bool bio_attempt_front_merge(struct request_queue *q, | |||
1167 | * true if merge was successful, otherwise false. | 1167 | * true if merge was successful, otherwise false. |
1168 | */ | 1168 | */ |
1169 | static bool attempt_plug_merge(struct task_struct *tsk, struct request_queue *q, | 1169 | static bool attempt_plug_merge(struct task_struct *tsk, struct request_queue *q, |
1170 | struct bio *bio) | 1170 | struct bio *bio, unsigned int *request_count) |
1171 | { | 1171 | { |
1172 | struct blk_plug *plug; | 1172 | struct blk_plug *plug; |
1173 | struct request *rq; | 1173 | struct request *rq; |
@@ -1176,10 +1176,13 @@ static bool attempt_plug_merge(struct task_struct *tsk, struct request_queue *q, | |||
1176 | plug = tsk->plug; | 1176 | plug = tsk->plug; |
1177 | if (!plug) | 1177 | if (!plug) |
1178 | goto out; | 1178 | goto out; |
1179 | *request_count = 0; | ||
1179 | 1180 | ||
1180 | list_for_each_entry_reverse(rq, &plug->list, queuelist) { | 1181 | list_for_each_entry_reverse(rq, &plug->list, queuelist) { |
1181 | int el_ret; | 1182 | int el_ret; |
1182 | 1183 | ||
1184 | (*request_count)++; | ||
1185 | |||
1183 | if (rq->q != q) | 1186 | if (rq->q != q) |
1184 | continue; | 1187 | continue; |
1185 | 1188 | ||
@@ -1219,6 +1222,7 @@ static int __make_request(struct request_queue *q, struct bio *bio) | |||
1219 | struct blk_plug *plug; | 1222 | struct blk_plug *plug; |
1220 | int el_ret, rw_flags, where = ELEVATOR_INSERT_SORT; | 1223 | int el_ret, rw_flags, where = ELEVATOR_INSERT_SORT; |
1221 | struct request *req; | 1224 | struct request *req; |
1225 | unsigned int request_count = 0; | ||
1222 | 1226 | ||
1223 | /* | 1227 | /* |
1224 | * low level driver can indicate that it wants pages above a | 1228 | * low level driver can indicate that it wants pages above a |
@@ -1237,7 +1241,7 @@ static int __make_request(struct request_queue *q, struct bio *bio) | |||
1237 | * Check if we can merge with the plugged list before grabbing | 1241 | * Check if we can merge with the plugged list before grabbing |
1238 | * any locks. | 1242 | * any locks. |
1239 | */ | 1243 | */ |
1240 | if (attempt_plug_merge(current, q, bio)) | 1244 | if (attempt_plug_merge(current, q, bio, &request_count)) |
1241 | goto out; | 1245 | goto out; |
1242 | 1246 | ||
1243 | spin_lock_irq(q->queue_lock); | 1247 | spin_lock_irq(q->queue_lock); |
@@ -1302,9 +1306,8 @@ get_rq: | |||
1302 | if (__rq->q != q) | 1306 | if (__rq->q != q) |
1303 | plug->should_sort = 1; | 1307 | plug->should_sort = 1; |
1304 | } | 1308 | } |
1305 | if (plug->count >= BLK_MAX_REQUEST_COUNT) | 1309 | if (request_count >= BLK_MAX_REQUEST_COUNT) |
1306 | blk_flush_plug_list(plug, false); | 1310 | blk_flush_plug_list(plug, false); |
1307 | plug->count++; | ||
1308 | list_add_tail(&req->queuelist, &plug->list); | 1311 | list_add_tail(&req->queuelist, &plug->list); |
1309 | drive_stat_acct(req, 1); | 1312 | drive_stat_acct(req, 1); |
1310 | } else { | 1313 | } else { |
@@ -2634,7 +2637,6 @@ void blk_start_plug(struct blk_plug *plug) | |||
2634 | INIT_LIST_HEAD(&plug->list); | 2637 | INIT_LIST_HEAD(&plug->list); |
2635 | INIT_LIST_HEAD(&plug->cb_list); | 2638 | INIT_LIST_HEAD(&plug->cb_list); |
2636 | plug->should_sort = 0; | 2639 | plug->should_sort = 0; |
2637 | plug->count = 0; | ||
2638 | 2640 | ||
2639 | /* | 2641 | /* |
2640 | * If this is a nested plug, don't actually assign it. It will be | 2642 | * If this is a nested plug, don't actually assign it. It will be |
@@ -2718,7 +2720,6 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) | |||
2718 | return; | 2720 | return; |
2719 | 2721 | ||
2720 | list_splice_init(&plug->list, &list); | 2722 | list_splice_init(&plug->list, &list); |
2721 | plug->count = 0; | ||
2722 | 2723 | ||
2723 | if (plug->should_sort) { | 2724 | if (plug->should_sort) { |
2724 | list_sort(NULL, &list, plug_rq_cmp); | 2725 | list_sort(NULL, &list, plug_rq_cmp); |