[PATCH] qemu: virtiofs: Add pool element to limit thread pool
Masayoshi Mizuma
msys.mizuma at gmail.com
Sat Oct 24 02:50:29 UTC 2020
On Fri, Oct 23, 2020 at 09:10:23AM -0300, Daniel Henrique Barboza wrote:
>
>
> On 10/20/20 2:54 PM, Masayoshi Mizuma wrote:
> > From: Masayoshi Mizuma <m.mizuma at jp.fujitsu.com>
> >
> > virtiofsd has --thread-pool-size=NUM option to limit the
> > thread pool size. It will be useful to tune the performance.
> >
> > Add pool element to use the option like as:
> >
> > <filesystem type='mount' accessmode='passthrough'>
> > <driver type='virtiofs' queue='1024'/>
> > <binary path='/usr/libexec/virtiofsd' xattr='on' pool='32'/>
> > <source dir='/path'/>
> > <target dir='mount_tag'/>
> > </filesystem>
> >
> > Signed-off-by: Masayoshi Mizuma <m.mizuma at jp.fujitsu.com>
> > ---
>
> Code looks good. We generally split the docs from the parser/qemu logic
> in the commits though. For new options it's also good to have unit tests
> covering them as well.
>
> I suggest you split this patch in at least 2 commits. First commit contains
> the changes in the /docs files, introducing the new 'pool' option. The
> second commit contains the changes in domain_conf and qemu_virtiofs that
> implements it.
>
> For unit tests, you'll want something in the lines of what is done in the
> case of 'vhost-user-fs-fd-memory' test in qemuxml2argvtest.c. You'll need
> a new XML file (e.g. vhost-user-fs-pool.xml) in qemuxml2argvdata that
> implements the 'pool' option, then a .args file that will contains the
> expected QEMU command line generated by that XML. You can see how it is being
> done for 'vhost-user-fs-fd-memory' and go from there. All the extra files
> and changes for this new test goes in another patch.
>
> Last but not the least, if you want to make the maintainers life easier, you
> can also add an extra patch documenting this new feature in NEWS.rst.
Thank you for the helpful advice!
I'll split the patch to the followings:
1. docs/formatdomain.rst and docs/schemas/domaincommon.rng
2. src/conf/domain_conf.[ch] and src/qemu/qemu_virtiofs.c
3. The unit test
4. NEWS.rst
Thanks!
Masa
>
>
>
> Thanks,
>
>
> DHB
>
>
>
>
> > docs/formatdomain.rst | 6 ++++--
> > docs/schemas/domaincommon.rng | 5 +++++
> > src/conf/domain_conf.c | 12 ++++++++++++
> > src/conf/domain_conf.h | 1 +
> > src/qemu/qemu_virtiofs.c | 3 +++
> > 5 files changed, 25 insertions(+), 2 deletions(-)
> >
> > diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
> > index bfa80e4bc2..0f66af5dc3 100644
> > --- a/docs/formatdomain.rst
> > +++ b/docs/formatdomain.rst
> > @@ -3070,7 +3070,7 @@ A directory on the host that can be accessed directly from the guest.
> > </filesystem>
> > <filesystem type='mount' accessmode='passthrough'>
> > <driver type='virtiofs' queue='1024'/>
> > - <binary path='/usr/libexec/virtiofsd' xattr='on'>
> > + <binary path='/usr/libexec/virtiofsd' xattr='on' pool='32'>
> > <cache mode='always'/>
> > <lock posix='on' flock='on'/>
> > </binary>
> > @@ -3188,7 +3188,9 @@ A directory on the host that can be accessed directly from the guest.
> > the use of filesystem extended attributes. Caching can be tuned via the
> > ``cache`` element, possible ``mode`` values being ``none`` and ``always``.
> > Locking can be controlled via the ``lock`` element - attributes ``posix`` and
> > - ``flock`` both accepting values ``on`` or ``off``. ( :since:`Since 6.2.0` )
> > + ``flock`` both accepting values ``on`` or ``off``. ( :since:`Since 6.2.0` ).
> > + Thread pool size limit can be tuned via the ``pool`` element.
> > + ( :since:`Since 6.9.0` )
> > ``source``
> > The resource on the host that is being accessed in the guest. The ``name``
> > attribute must be used with ``type='template'``, and the ``dir`` attribute
> > diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> > index c25a742581..cd5de2ba80 100644
> > --- a/docs/schemas/domaincommon.rng
> > +++ b/docs/schemas/domaincommon.rng
> > @@ -2839,6 +2839,11 @@
> > <ref name="virOnOff"/>
> > </attribute>
> > </optional>
> > + <optional>
> > + <attribute name="pool">
> > + <ref name="unsignedInt"/>
> > + </attribute>
> > + </optional>
> > <optional>
> > <element name="cache">
> > <optional>
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index efa5ac527b..9d06f8c75f 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -11588,6 +11588,7 @@ virDomainFSDefParseXML(virDomainXMLOptionPtr xmlopt,
> > g_autofree char *cache = virXPathString("string(./binary/cache/@mode)", ctxt);
> > g_autofree char *posix_lock = virXPathString("string(./binary/lock/@posix)", ctxt);
> > g_autofree char *flock = virXPathString("string(./binary/lock/@flock)", ctxt);
> > + g_autofree char *thread_pool_size = virXPathString("string(./binary/@pool)", ctxt);
> > int val;
> > if (queue_size && virStrToLong_ull(queue_size, NULL, 10, &def->queue_size) < 0) {
> > @@ -11597,6 +11598,14 @@ virDomainFSDefParseXML(virDomainXMLOptionPtr xmlopt,
> > goto error;
> > }
> > + if (thread_pool_size &&
> > + virStrToLong_ull(thread_pool_size, NULL, 10, &def->thread_pool_size) < 0) {
> > + virReportError(VIR_ERR_XML_ERROR,
> > + _("cannot parse thread pool size '%s' for virtiofs"),
> > + thread_pool_size);
> > + goto error;
> > + }
> > +
> > if (binary)
> > def->binary = virFileSanitizePath(binary);
> > @@ -26191,6 +26200,9 @@ virDomainFSDefFormat(virBufferPtr buf,
> > virTristateSwitchTypeToString(def->xattr));
> > }
> > + if (def->thread_pool_size)
> > + virBufferAsprintf(&binaryAttrBuf, " pool='%llu'", def->thread_pool_size);
> > +
> > if (def->cache != VIR_DOMAIN_FS_CACHE_MODE_DEFAULT) {
> > virBufferAsprintf(&binaryBuf, "<cache mode='%s'/>\n",
> > virDomainFSCacheModeTypeToString(def->cache));
> > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> > index cd344716a3..98ab0a51c7 100644
> > --- a/src/conf/domain_conf.h
> > +++ b/src/conf/domain_conf.h
> > @@ -860,6 +860,7 @@ struct _virDomainFSDef {
> > bool symlinksResolved;
> > char *binary;
> > unsigned long long queue_size;
> > + unsigned long long thread_pool_size;
> > virTristateSwitch xattr;
> > virDomainFSCacheMode cache;
> > virTristateSwitch posix_lock;
> > diff --git a/src/qemu/qemu_virtiofs.c b/src/qemu/qemu_virtiofs.c
> > index 2e239cad66..e35c278a1b 100644
> > --- a/src/qemu/qemu_virtiofs.c
> > +++ b/src/qemu/qemu_virtiofs.c
> > @@ -126,6 +126,9 @@ qemuVirtioFSBuildCommandLine(virQEMUDriverConfigPtr cfg,
> > virCommandPassFD(cmd, *fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
> > *fd = -1;
> > + if (fs->thread_pool_size)
> > + virCommandAddArgFormat(cmd, "--thread-pool-size=%llu", fs->thread_pool_size);
> > +
> > virCommandAddArg(cmd, "-o");
> > virBufferAddLit(&opts, "source=");
> > virQEMUBuildBufferEscapeComma(&opts, fs->src->path);
> >
More information about the libvir-list
mailing list