Re: [PATCH] io_uring: use bytes instead of pages to decide len exceeding

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux