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

Reply via email to