Commit ec8acb69 authored by Jens Axboe's avatar Jens Axboe Committed by Linus Torvalds

[PATCH] cfq-iosched: merging problem

Two issues:

- The final return 1 should be a return 0, otherwise comparing cfqq is
  a noop.

- bio_sync() only checks the sync flag, while rq_is_sync() checks both
  for READ and sync. The latter is what we want. Expand the bio check
  to include reads, and relax the restriction to allow merging of async
  io into sync requests.

In the future we want to clean up the SYNC logic, right now it means
both sync request (such as READ and O_DIRECT WRITE) and unplug-on-issue.
Leave that for later.
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent dc3c3377
...@@ -577,9 +577,9 @@ static int cfq_allow_merge(request_queue_t *q, struct request *rq, ...@@ -577,9 +577,9 @@ static int cfq_allow_merge(request_queue_t *q, struct request *rq,
pid_t key; pid_t key;
/* /*
* Disallow merge, if bio and rq aren't both sync or async * Disallow merge of a sync bio into an async request.
*/ */
if (!!bio_sync(bio) != !!rq_is_sync(rq)) if ((bio_data_dir(bio) == READ || bio_sync(bio)) && !rq_is_sync(rq))
return 0; return 0;
/* /*
...@@ -592,7 +592,7 @@ static int cfq_allow_merge(request_queue_t *q, struct request *rq, ...@@ -592,7 +592,7 @@ static int cfq_allow_merge(request_queue_t *q, struct request *rq,
if (cfqq == RQ_CFQQ(rq)) if (cfqq == RQ_CFQQ(rq))
return 1; return 1;
return 1; return 0;
} }
static inline void static inline void
......
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