[Virtio-fs] [PATCH] virtiofsd: enable PARALLEL_DIROPS during INIT

Liu Bo bo.liu at linux.alibaba.com
Fri Jun 7 18:15:34 UTC 2019


On Fri, Jun 07, 2019 at 04:21:47PM +0100, Dr. David Alan Gilbert wrote:
> * Liu Bo (bo.liu at linux.alibaba.com) wrote:
> > lookup is a RO operations, PARALLEL_DIROPS can be enabled.
> > 
> > Signed-off-by: Liu Bo <bo.liu at linux.alibaba.com>
> 
> I'm not too sure what this is doing; and why doesn't upstream libfuse
> have this?

I'm not sure why libfuse doesn't include the capability, but AFAICT this
is needed for practical use.

Say that we have 100 threads doing 'ls /mnt/virtiofs/', then they are
serialized by a mutex in
---
fuse_lookup
  fuse_lock_inode
    if (!get_fuse_conn(inode)->parallel_dirops)
      mutex_lock(&get_fuse_inode(inode)->mutex);
---

What fuse_lookup does is a plain lookup with loading inode if necessary,
so I don't see anything wrong making operations parallel.

This is found by a fsmark test,
----
NFILES=100000

time $FSMARK  -D  10000  -S0  -n  $NFILES  -s  0  -L  5 -l /tmp/fs_log.txt \
        -d  $MNT/0  -d  $MNT/1 \
        -d  $MNT/2  -d  $MNT/3 \
        -d  $MNT/4  -d  $MNT/5 \
        -d  $MNT/6  -d  $MNT/7 \
        -d  $MNT/8  -d  $MNT/9 \
        -d  $MNT/10  -d  $MNT/11 \
        -d  $MNT/12  -d  $MNT/13 \
        -d  $MNT/14  -d  $MNT/15
----

the vanilla virtiofs was super slow due to the mutex lock.

thanks,
-liubo


> 
> Dave
> 
> > ---
> >  contrib/virtiofsd/fuse_lowlevel.c | 2 ++
> >  1 file changed, 2 insertions(+)
> > 
> > diff --git a/contrib/virtiofsd/fuse_lowlevel.c b/contrib/virtiofsd/fuse_lowlevel.c
> > index c460c4c..93ce788 100644
> > --- a/contrib/virtiofsd/fuse_lowlevel.c
> > +++ b/contrib/virtiofsd/fuse_lowlevel.c
> > @@ -2089,6 +2089,8 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid,
> >  
> >  	if (se->conn.want & FUSE_CAP_ASYNC_READ)
> >  		outarg.flags |= FUSE_ASYNC_READ;
> > +        if (se->conn.want & FUSE_CAP_PARALLEL_DIROPS)
> > +                outarg.flags |= FUSE_PARALLEL_DIROPS;
> >  	if (se->conn.want & FUSE_CAP_POSIX_LOCKS)
> >  		outarg.flags |= FUSE_POSIX_LOCKS;
> >  	if (se->conn.want & FUSE_CAP_ATOMIC_O_TRUNC)
> > -- 
> > 1.8.3.1
> > 
> --
> Dr. David Alan Gilbert / dgilbert at redhat.com / Manchester, UK




More information about the Virtio-fs mailing list