Commit 56ebdaf2 authored by Shaohua Li's avatar Shaohua Li Committed by Jens Axboe

block: simplify force plug flush code a little bit

Cleaning up the code a little bit. attempt_plug_merge() traverses the plug
list anyway, we can do the request counting there, so stack size is reduced
a little bit.
The motivation here is I suspect if we should count the requests for each
queue (task could handle multiple disks in the meantime), but my test doesn't
show it's worthy doing. If somebody proves we should do it, below change
will make that more easier.
Signed-off-by: default avatarShaohua Li <shli@kernel.org>
Signed-off-by: default avatarShaohua Li <shaohua.li@intel.com>
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent a6327162
...@@ -1167,7 +1167,7 @@ static bool bio_attempt_front_merge(struct request_queue *q, ...@@ -1167,7 +1167,7 @@ static bool bio_attempt_front_merge(struct request_queue *q,
* true if merge was successful, otherwise false. * true if merge was successful, otherwise false.
*/ */
static bool attempt_plug_merge(struct task_struct *tsk, struct request_queue *q, static bool attempt_plug_merge(struct task_struct *tsk, struct request_queue *q,
struct bio *bio) struct bio *bio, unsigned int *request_count)
{ {
struct blk_plug *plug; struct blk_plug *plug;
struct request *rq; struct request *rq;
...@@ -1176,10 +1176,13 @@ static bool attempt_plug_merge(struct task_struct *tsk, struct request_queue *q, ...@@ -1176,10 +1176,13 @@ static bool attempt_plug_merge(struct task_struct *tsk, struct request_queue *q,
plug = tsk->plug; plug = tsk->plug;
if (!plug) if (!plug)
goto out; goto out;
*request_count = 0;
list_for_each_entry_reverse(rq, &plug->list, queuelist) { list_for_each_entry_reverse(rq, &plug->list, queuelist) {
int el_ret; int el_ret;
(*request_count)++;
if (rq->q != q) if (rq->q != q)
continue; continue;
...@@ -1219,6 +1222,7 @@ static int __make_request(struct request_queue *q, struct bio *bio) ...@@ -1219,6 +1222,7 @@ static int __make_request(struct request_queue *q, struct bio *bio)
struct blk_plug *plug; struct blk_plug *plug;
int el_ret, rw_flags, where = ELEVATOR_INSERT_SORT; int el_ret, rw_flags, where = ELEVATOR_INSERT_SORT;
struct request *req; struct request *req;
unsigned int request_count = 0;
/* /*
* low level driver can indicate that it wants pages above a * 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,7 +1241,7 @@ static int __make_request(struct request_queue *q, struct bio *bio)
* Check if we can merge with the plugged list before grabbing * Check if we can merge with the plugged list before grabbing
* any locks. * any locks.
*/ */
if (attempt_plug_merge(current, q, bio)) if (attempt_plug_merge(current, q, bio, &request_count))
goto out; goto out;
spin_lock_irq(q->queue_lock); spin_lock_irq(q->queue_lock);
...@@ -1302,9 +1306,8 @@ static int __make_request(struct request_queue *q, struct bio *bio) ...@@ -1302,9 +1306,8 @@ static int __make_request(struct request_queue *q, struct bio *bio)
if (__rq->q != q) if (__rq->q != q)
plug->should_sort = 1; plug->should_sort = 1;
} }
if (plug->count >= BLK_MAX_REQUEST_COUNT) if (request_count >= BLK_MAX_REQUEST_COUNT)
blk_flush_plug_list(plug, false); blk_flush_plug_list(plug, false);
plug->count++;
list_add_tail(&req->queuelist, &plug->list); list_add_tail(&req->queuelist, &plug->list);
drive_stat_acct(req, 1); drive_stat_acct(req, 1);
} else { } else {
...@@ -2634,7 +2637,6 @@ void blk_start_plug(struct blk_plug *plug) ...@@ -2634,7 +2637,6 @@ void blk_start_plug(struct blk_plug *plug)
INIT_LIST_HEAD(&plug->list); INIT_LIST_HEAD(&plug->list);
INIT_LIST_HEAD(&plug->cb_list); INIT_LIST_HEAD(&plug->cb_list);
plug->should_sort = 0; plug->should_sort = 0;
plug->count = 0;
/* /*
* If this is a nested plug, don't actually assign it. It will be * 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,7 +2720,6 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule)
return; return;
list_splice_init(&plug->list, &list); list_splice_init(&plug->list, &list);
plug->count = 0;
if (plug->should_sort) { if (plug->should_sort) {
list_sort(NULL, &list, plug_rq_cmp); list_sort(NULL, &list, plug_rq_cmp);
......
...@@ -873,7 +873,6 @@ struct blk_plug { ...@@ -873,7 +873,6 @@ struct blk_plug {
struct list_head list; struct list_head list;
struct list_head cb_list; struct list_head cb_list;
unsigned int should_sort; unsigned int should_sort;
unsigned int count;
}; };
#define BLK_MAX_REQUEST_COUNT 16 #define BLK_MAX_REQUEST_COUNT 16
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment