You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
block: change the request allocation/congestion logic to be sync/async based
This makes sure that we never wait on async IO for sync requests, instead of doing the split on writes vs reads. Signed-off-by: Jens Axboe <jens.axboe@oracle.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
0221c81b1b
commit
1faa16d228
+18
-18
@@ -48,28 +48,28 @@ queue_requests_store(struct request_queue *q, const char *page, size_t count)
|
||||
q->nr_requests = nr;
|
||||
blk_queue_congestion_threshold(q);
|
||||
|
||||
if (rl->count[READ] >= queue_congestion_on_threshold(q))
|
||||
blk_set_queue_congested(q, READ);
|
||||
else if (rl->count[READ] < queue_congestion_off_threshold(q))
|
||||
blk_clear_queue_congested(q, READ);
|
||||
if (rl->count[BLK_RW_SYNC] >= queue_congestion_on_threshold(q))
|
||||
blk_set_queue_congested(q, BLK_RW_SYNC);
|
||||
else if (rl->count[BLK_RW_SYNC] < queue_congestion_off_threshold(q))
|
||||
blk_clear_queue_congested(q, BLK_RW_SYNC);
|
||||
|
||||
if (rl->count[WRITE] >= queue_congestion_on_threshold(q))
|
||||
blk_set_queue_congested(q, WRITE);
|
||||
else if (rl->count[WRITE] < queue_congestion_off_threshold(q))
|
||||
blk_clear_queue_congested(q, WRITE);
|
||||
if (rl->count[BLK_RW_ASYNC] >= queue_congestion_on_threshold(q))
|
||||
blk_set_queue_congested(q, BLK_RW_ASYNC);
|
||||
else if (rl->count[BLK_RW_ASYNC] < queue_congestion_off_threshold(q))
|
||||
blk_clear_queue_congested(q, BLK_RW_ASYNC);
|
||||
|
||||
if (rl->count[READ] >= q->nr_requests) {
|
||||
blk_set_queue_full(q, READ);
|
||||
} else if (rl->count[READ]+1 <= q->nr_requests) {
|
||||
blk_clear_queue_full(q, READ);
|
||||
wake_up(&rl->wait[READ]);
|
||||
if (rl->count[BLK_RW_SYNC] >= q->nr_requests) {
|
||||
blk_set_queue_full(q, BLK_RW_SYNC);
|
||||
} else if (rl->count[BLK_RW_SYNC]+1 <= q->nr_requests) {
|
||||
blk_clear_queue_full(q, BLK_RW_SYNC);
|
||||
wake_up(&rl->wait[BLK_RW_SYNC]);
|
||||
}
|
||||
|
||||
if (rl->count[WRITE] >= q->nr_requests) {
|
||||
blk_set_queue_full(q, WRITE);
|
||||
} else if (rl->count[WRITE]+1 <= q->nr_requests) {
|
||||
blk_clear_queue_full(q, WRITE);
|
||||
wake_up(&rl->wait[WRITE]);
|
||||
if (rl->count[BLK_RW_ASYNC] >= q->nr_requests) {
|
||||
blk_set_queue_full(q, BLK_RW_ASYNC);
|
||||
} else if (rl->count[BLK_RW_ASYNC]+1 <= q->nr_requests) {
|
||||
blk_clear_queue_full(q, BLK_RW_ASYNC);
|
||||
wake_up(&rl->wait[BLK_RW_ASYNC]);
|
||||
}
|
||||
spin_unlock_irq(q->queue_lock);
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user