readahead: stricter check for bdi io_pages
authorMarkus Stockhausen <stockhausen@collogia.de>
Fri, 27 Jul 2018 15:09:53 +0000 (09:09 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 9 Sep 2018 17:55:53 +0000 (19:55 +0200)
commitcf12d0f9c0dc9129f08490390d14ee4d9dbf6ebb
tree25fdf1d6b48e3b463bcb1289d9db42ce5cdc68ba
parent8513c01ae15f5ec456dda387e44317752c8da544
readahead: stricter check for bdi io_pages

commit dc30b96ab6d569060741572cf30517d3179429a8 upstream.

ondemand_readahead() checks bdi->io_pages to cap the maximum pages
that need to be processed. This works until the readit section. If
we would do an async only readahead (async size = sync size) and
target is at beginning of window we expand the pages by another
get_next_ra_size() pages. Btrace for large reads shows that kernel
always issues a doubled size read at the beginning of processing.
Add an additional check for io_pages in the lower part of the func.
The fix helps devices that hard limit bio pages and rely on proper
handling of max_hw_read_sectors (e.g. older FusionIO cards). For
that reason it could qualify for stable.

Fixes: 9491ae4a ("mm: don't cap request size based on read-ahead setting")
Cc: stable@vger.kernel.org
Signed-off-by: Markus Stockhausen stockhausen@collogia.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
mm/readahead.c