[Virtio-fs] [PATCH v2 2/2][RFC] use fuse_buf_writev to replace fuse_buf_write for better performance

piaojun piaojun at huawei.com
Wed Aug 7 09:58:47 UTC 2019


Hi Stefan,

On 2019/8/7 17:21, Stefan Hajnoczi wrote:
> On Wed, Aug 07, 2019 at 03:10:10PM +0800, piaojun wrote:
>> fuse_buf_writev() only handles the normal write in which src is buffer
>> and dest is fd. Specially if src buffer represents guest physical
>> address that can't be mapped by the daemon process, IO must be bounced
>> back to the VMM to do it by fuse_buf_copy().
>>
>> Signed-off-by: Jun Piao <piaojun at huawei.com>
>> Suggested-by: Dr. David Alan Gilbert <dgilbert at redhat.com>
>> ---
>>  contrib/virtiofsd/passthrough_ll.c | 5 ++++-
>>  1 file changed, 4 insertions(+), 1 deletion(-)
>>
>> diff --git a/contrib/virtiofsd/passthrough_ll.c b/contrib/virtiofsd/passthrough_ll.c
>> index cc9c175..c1bbc53 100644
>> --- a/contrib/virtiofsd/passthrough_ll.c
>> +++ b/contrib/virtiofsd/passthrough_ll.c
>> @@ -2023,7 +2023,10 @@ static void lo_write_buf(fuse_req_t req, fuse_ino_t ino,
>>  		fuse_debug("lo_write_buf(ino=%" PRIu64 ", size=%zd, off=%lu)\n",
>>  			   ino, out_buf.buf[0].size, (unsigned long) off);
>>
>> -	res = fuse_buf_copy(req, &out_buf, in_buf, 0);
>> +	if (!(in_buf->buf[0].flags & FUSE_BUF_PHYS_ADDR))
>> +		res = fuse_buf_writev(req, &out_buf, in_buf, out_buf.buf[0].flags);
>> +	else
>> +		res = fuse_buf_copy(req, &out_buf, in_buf, 0);
> 
> Can you move the check inside fuse_buf_copy() and make fuse_buf_writev()
> a static function?  This way all fuse_buf_copy() callers automatically
> benefit from the improvement (when possible).

Good suggestion. I will try it in patch v3, and I'm also waiting other
developers's comments.

> 
> By the way, this improvement can be sent upstream to libfuse so that
> other FUSE file systems also get improved performance.

Yes, I need some time looking into libfuse code and sync the fix.

Thanks,
Jun

> 
> Stefan
> .
> 




More information about the Virtio-fs mailing list