conf: virtiofs: add rlimit_nofile element

Add an element to configure the rlimit nofile size:

...
<binary>
  <rlimit_nofile size='122333'/>
</binary>
...

Non-positive values are forbidden in 'domaincommon.rng'. Added separate
test file, created by modifying the 'vhost-user-fs-fd-memory.xml'.

Signed-off-by: Adam Julis <ajulis@redhat.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Adam Julis 2024-07-16 11:40:36 +02:00 committed by Michal Privoznik
parent 239669049d
commit 562fc02ac1
8 changed files with 112 additions and 0 deletions

View File

@ -3734,6 +3734,10 @@ A directory on the host that can be accessed directly from the guest.
The thread pool helps increase the number of requests in flight when used with The thread pool helps increase the number of requests in flight when used with
storage that has a higher latency. However, it has an overhead, and so for storage that has a higher latency. However, it has an overhead, and so for
fast, low latency filesystems, it may be best to turn it off. ( :since:`Since 8.5.0` ) fast, low latency filesystems, it may be best to turn it off. ( :since:`Since 8.5.0` )
Element ``rlimit_profile`` accepts one attribute ``size`` which defines the
maximum number of file descriptors. Non-positive values are forbidden.
Although numbers greater than 1M are allowed, the virtiofsd documentation
states that in this case its set by virtiofsd to the 1M. ( :since:`Since 10.6.0` )
``source`` ``source``
The resource on the host that is being accessed in the guest. The ``name`` 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 attribute must be used with ``type='template'``, and the ``dir`` attribute

View File

@ -8868,6 +8868,7 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
g_autofree char *queue_size = virXPathString("string(./driver/@queue)", ctxt); g_autofree char *queue_size = virXPathString("string(./driver/@queue)", ctxt);
g_autofree char *binary = virXPathString("string(./binary/@path)", ctxt); g_autofree char *binary = virXPathString("string(./binary/@path)", ctxt);
g_autofree char *thread_pool_size = virXPathString("string(./binary/thread_pool/@size)", ctxt); g_autofree char *thread_pool_size = virXPathString("string(./binary/thread_pool/@size)", ctxt);
g_autofree char *rlimit_nofile = virXPathString("string(./binary/rlimit_nofile/@size)", ctxt);
xmlNodePtr binary_node = virXPathNode("./binary", ctxt); xmlNodePtr binary_node = virXPathNode("./binary", ctxt);
xmlNodePtr binary_lock_node = virXPathNode("./binary/lock", ctxt); xmlNodePtr binary_lock_node = virXPathNode("./binary/lock", ctxt);
xmlNodePtr binary_cache_node = virXPathNode("./binary/cache", ctxt); xmlNodePtr binary_cache_node = virXPathNode("./binary/cache", ctxt);
@ -8891,6 +8892,14 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
goto error; goto error;
} }
if (rlimit_nofile &&
virStrToLong_ull(rlimit_nofile, NULL, 10, &def->rlimit_nofile) < 0) {
virReportError(VIR_ERR_XML_ERROR,
_("cannot parse rlimit_nofile '%1$s' for virtiofs"),
rlimit_nofile);
goto error;
}
if (binary) if (binary)
def->binary = virFileSanitizePath(binary); def->binary = virFileSanitizePath(binary);
@ -23415,6 +23424,9 @@ virDomainFSDefFormat(virBuffer *buf,
if (def->thread_pool_size >= 0) if (def->thread_pool_size >= 0)
virBufferAsprintf(&binaryBuf, "<thread_pool size='%d'/>\n", def->thread_pool_size); virBufferAsprintf(&binaryBuf, "<thread_pool size='%d'/>\n", def->thread_pool_size);
if (def->rlimit_nofile > 0)
virBufferAsprintf(&binaryBuf, "<rlimit_nofile size='%lld'/>\n", def->rlimit_nofile);
} }
virDomainVirtioOptionsFormat(&driverAttrBuf, def->virtio); virDomainVirtioOptionsFormat(&driverAttrBuf, def->virtio);

View File

@ -890,6 +890,7 @@ struct _virDomainFSDef {
bool symlinksResolved; bool symlinksResolved;
char *binary; char *binary;
unsigned long long queue_size; unsigned long long queue_size;
unsigned long long rlimit_nofile;
virTristateSwitch xattr; virTristateSwitch xattr;
virDomainFSCacheMode cache; virDomainFSCacheMode cache;
virTristateSwitch posix_lock; virTristateSwitch posix_lock;

View File

@ -3380,6 +3380,15 @@
</optional> </optional>
</element> </element>
</optional> </optional>
<optional>
<element name="rlimit_nofile">
<optional>
<attribute name="size">
<data type="positiveInteger"/>
</attribute>
</optional>
</element>
</optional>
</interleave> </interleave>
</element> </element>
</define> </define>

View File

@ -0,0 +1,34 @@
LC_ALL=C \
PATH=/bin \
HOME=/var/lib/libvirt/qemu/domain--1-guest \
USER=test \
LOGNAME=test \
XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-guest/.local/share \
XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-guest/.cache \
XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-guest/.config \
/usr/bin/qemu-system-x86_64 \
-name guest=guest,debug-threads=on \
-S \
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-guest/master-key.aes"}' \
-machine pc,usb=off,dump-guest-core=off,acpi=off \
-accel kvm \
-cpu qemu64 \
-m size=14680064k \
-overcommit mem-lock=off \
-smp 2,sockets=2,cores=1,threads=1 \
-object '{"qom-type":"memory-backend-file","id":"ram-node0","mem-path":"/var/lib/libvirt/qemu/ram/-1-guest/ram-node0","share":true,"size":15032385536}' \
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
-uuid 126f2720-6f8e-45ab-a886-ec9277079a67 \
-display none \
-no-user-config \
-nodefaults \
-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
-mon chardev=charmonitor,id=monitor,mode=control \
-rtc base=utc \
-no-shutdown \
-boot strict=on \
-chardev socket,id=chr-vu-fs0,path=/var/lib/libvirt/qemu/domain--1-guest/fs0-fs.sock \
-device '{"driver":"vhost-user-fs-pci","id":"fs0","chardev":"chr-vu-fs0","queue-size":1027,"tag":"mount_tag","bus":"pci.0","addr":"0x2"}' \
-audiodev '{"id":"audio1","driver":"none"}' \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on

View File

@ -0,0 +1 @@
vhost-user-fs-fd-rlimit.xml

View File

@ -0,0 +1,50 @@
<domain type='kvm'>
<name>guest</name>
<uuid>126f2720-6f8e-45ab-a886-ec9277079a67</uuid>
<memory unit='KiB'>14680064</memory>
<currentMemory unit='KiB'>14680064</currentMemory>
<memoryBacking>
<source type='file'/>
<access mode='shared'/>
</memoryBacking>
<vcpu placement='static'>2</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<cpu mode='custom' match='exact' check='none'>
<model fallback='forbid'>qemu64</model>
<numa>
<cell id='0' cpus='0-1' memory='14680064' unit='KiB' memAccess='shared'/>
</numa>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<controller type='usb' index='0' model='none'/>
<controller type='pci' index='0' model='pci-root'/>
<filesystem type='mount' accessmode='passthrough'>
<driver type='virtiofs' queue='1027'/>
<binary xattr='on'>
<cache mode='always'/>
<sandbox mode='chroot'/>
<thread_pool size='16'/>
<rlimit_nofile size='122333'/>
</binary>
<idmap>
<uid start='0' target='100000' count='65535'/>
<gid start='0' target='100000' count='65535'/>
</idmap>
<source dir='/path'/>
<target dir='mount_tag'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</filesystem>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<audio id='1' type='none'/>
<memballoon model='none'/>
</devices>
</domain>

View File

@ -2815,6 +2815,7 @@ mymain(void)
DO_TEST_CAPS_ARCH_LATEST("launch-security-s390-pv", "s390x"); DO_TEST_CAPS_ARCH_LATEST("launch-security-s390-pv", "s390x");
DO_TEST_CAPS_LATEST("vhost-user-fs-fd-memory"); DO_TEST_CAPS_LATEST("vhost-user-fs-fd-memory");
DO_TEST_CAPS_LATEST("vhost-user-fs-fd-rlimit");
DO_TEST_CAPS_LATEST("vhost-user-fs-hugepages"); DO_TEST_CAPS_LATEST("vhost-user-fs-hugepages");
DO_TEST_CAPS_LATEST_PARSE_ERROR("vhost-user-fs-readonly"); DO_TEST_CAPS_LATEST_PARSE_ERROR("vhost-user-fs-readonly");