Commit 3deaa71
readahead: fix pipeline break caused by block plug
Herbert Poetzl reported a performance regression since 2.6.39. The test
is a simple dd read, but with big block size. The reason is:
T1: ra (A, A+128k), (A+128k, A+256k)
T2: lock_page for page A, submit the 256k
T3: hit page A+128K, ra (A+256k, A+384). the range isn't submitted
because of plug and there isn't any lock_page till we hit page A+256k
because all pages from A to A+256k is in memory
T4: hit page A+256k, ra (A+384, A+ 512). Because of plug, the range isn't
submitted again.
T5: lock_page A+256k, so (A+256k, A+512k) will be submitted. The task is
waitting for (A+256k, A+512k) finish.
There is no request to disk in T3 and T4, so readahead pipeline breaks.
We really don't need block plug for generic_file_aio_read() for buffered
I/O. The readahead already has plug and has fine grained control when I/O
should be submitted. Deleting plug for buffered I/O fixes the regression.
One side effect is plug makes the request size 256k, the size is 128k
without it. This is because default ra size is 128k and not a reason we
need plug here.
Vivek said:
: We submit some readahead IO to device request queue but because of nested
: plug, queue never gets unplugged. When read logic reaches a page which is
: not in page cache, it waits for page to be read from the disk
: (lock_page_killable()) and that time we flush the plug list.
:
: So effectively read ahead logic is kind of broken in parts because of
: nested plugging. Removing top level plug (generic_file_aio_read()) for
: buffered reads, will allow unplugging queue earlier for readahead.
Signed-off-by: Shaohua Li <[email protected]>
Signed-off-by: Wu Fengguang <[email protected]>
Reported-by: Herbert Poetzl <[email protected]>
Tested-by: Eric Dumazet <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Cc: Jens Axboe <[email protected]>
Cc: Vivek Goyal <[email protected]>
Cc: <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>1 parent 55ca614 commit 3deaa71
1 file changed
+4
-4
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1400 | 1400 | | |
1401 | 1401 | | |
1402 | 1402 | | |
1403 | | - | |
1404 | 1403 | | |
1405 | 1404 | | |
1406 | 1405 | | |
1407 | 1406 | | |
1408 | 1407 | | |
1409 | 1408 | | |
1410 | | - | |
1411 | | - | |
1412 | 1409 | | |
1413 | 1410 | | |
1414 | 1411 | | |
| |||
1424 | 1421 | | |
1425 | 1422 | | |
1426 | 1423 | | |
| 1424 | + | |
| 1425 | + | |
| 1426 | + | |
1427 | 1427 | | |
1428 | 1428 | | |
| 1429 | + | |
1429 | 1430 | | |
1430 | 1431 | | |
1431 | 1432 | | |
| |||
1481 | 1482 | | |
1482 | 1483 | | |
1483 | 1484 | | |
1484 | | - | |
1485 | 1485 | | |
1486 | 1486 | | |
1487 | 1487 | | |
| |||
0 commit comments