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