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

Dr. David Alan Gilbert dgilbert at redhat.com
Fri Jun 7 18:33:10 UTC 2019


* Liu Bo (bo.liu at linux.alibaba.com) wrote:
> 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.

Miklos: Do you know what the rules are around PARALLEL_DIROPS and why
the upstream libfuse doesn't have it eanbled?

Dave


> 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
--
Dr. David Alan Gilbert / dgilbert at redhat.com / Manchester, UK




More information about the Virtio-fs mailing list