[Devel] [PATCH rh7] fs/fuse/dev: improve ->splice() with fragmented memory

Vasily Averin vvs at virtuozzo.com
Wed Nov 29 17:37:31 MSK 2017


got it,
kvmalloc does not use kmalloc for size <= (16*PAGE_SIZE)

On 2017-11-29 17:31, Vasily Averin wrote:
> Could you please elaborate, why it should help in reported case?
> It seems for me kvmalloc will push reclaimer first exactly like kmalloc does right now.
> 
> On 2017-11-29 16:59, Andrey Ryabinin wrote:
>> fuse_dev_splice_[read,write]() temporary allocates array of pipe_buffer
>> structs. Depending on pipe size it could be quite large, thus we stall
>> in high order allocation request. Use kvmalloc() instead of kmalloc()
>> to fallback in vmalloc() if high order page is not available at the moment.
>>
>> https://jira.sw.ru/browse/PSBM-77949
>> Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
>> ---
>>  fs/fuse/dev.c | 8 ++++----
>>  1 file changed, 4 insertions(+), 4 deletions(-)
>>
>> diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
>> index 3427eddcfb17..83c30e51dfca 100644
>> --- a/fs/fuse/dev.c
>> +++ b/fs/fuse/dev.c
>> @@ -1353,7 +1353,7 @@ static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos,
>>  	if (!fud)
>>  		return -EPERM;
>>  
>> -	bufs = kmalloc(pipe->buffers * sizeof(struct pipe_buffer), GFP_KERNEL);
>> +	bufs = kvmalloc(pipe->buffers * sizeof(struct pipe_buffer), GFP_KERNEL);
>>  	if (!bufs)
>>  		return -ENOMEM;
>>  
>> @@ -1410,7 +1410,7 @@ out:
>>  	for (; page_nr < cs.nr_segs; page_nr++)
>>  		page_cache_release(bufs[page_nr].page);
>>  
>> -	kfree(bufs);
>> +	kvfree(bufs);
>>  	return ret;
>>  }
>>  
>> @@ -1991,7 +1991,7 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
>>  	if (!fud)
>>  		return -EPERM;
>>  
>> -	bufs = kmalloc(pipe->buffers * sizeof(struct pipe_buffer), GFP_KERNEL);
>> +	bufs = kvmalloc(pipe->buffers * sizeof(struct pipe_buffer), GFP_KERNEL);
>>  	if (!bufs)
>>  		return -ENOMEM;
>>  
>> @@ -2049,7 +2049,7 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
>>  		buf->ops->release(pipe, buf);
>>  	}
>>  out:
>> -	kfree(bufs);
>> +	kvfree(bufs);
>>  	return ret;
>>  }
>>  
>>
> _______________________________________________
> Devel mailing list
> Devel at openvz.org
> https://lists.openvz.org/mailman/listinfo/devel
> 


More information about the Devel mailing list