On 7/21/19 9:54 AM, Zhengyuan Liu wrote:
> We are using PAGE_SIZE as the unit to determine if the total len in
> async_list has exceeded max_pages, it's not fair for smaller io sizes.
> For example, if we are doing 1k-size io streams, we will never exceed
> max_pages since len >>= PAGE_SHIFT always gets zero. So use original
> bytes to make things fair.
Thanks, we do need this for sub page sized reads to be accurate. One
minor nit:
> @@ -1121,28 +1121,27 @@ static void io_async_list_note(int rw, struct
> io_kiocb *req, size_t len)
> off_t io_end = kiocb->ki_pos + len;
>
> if (filp == async_list->file && kiocb->ki_pos == async_list->io_end) {
> - unsigned long max_pages;
> + unsigned long max_pages, max_bytes;
>
> /* Use 8x RA size as a decent limiter for both reads/writes */
> max_pages = filp->f_ra.ra_pages;
> if (!max_pages)
> max_pages = VM_READAHEAD_PAGES;
> - max_pages *= 8;
> + max_bytes = (max_pages * 8) << PAGE_SHIFT;
Let's get rid of max_pages, and just do:
/* Use 8x RA size as a decent limiter for both reads/writes */
max_bytes = filp->f_ra.ra_pages << (PAGE_SHIFT + 3);
if (!max_bytes)
max_bytes = VM_READAHEAD_PAGES << (PAGE_SHIFT + 3);
There's really no need to have both a max_pages and max_bytes variable
if we're tracking and limiting based on bytes.
--
Jens Axboe