[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