[libvirt] [PATCH v1 3/5] qemu.conf: Introduce memory_predictable_file_names
Michal Privoznik
mprivozn at redhat.com
Mon Oct 23 17:10:04 UTC 2017
On 10/23/2017 06:47 PM, Daniel P. Berrange wrote:
> On Mon, Oct 23, 2017 at 05:43:16PM +0200, Michal Privoznik wrote:
>> In some cases management application needs to allocate memory for
>> qemu upfront and then just let qemu use that. Since we don't want
>> to expose path for memory-backend-file anywhere in the domain
>> XML, we can have a configuration knob that when enabled generated
>> predictable paths. In this case:
>>
>> $memoryBackingDir/libvirt/qemu/$shortName/$alias
>>
>> where $shortName is result of virDomainObjGetShortName().
>
> Looking at the current test cases, it seems that for huge pages
> we currently create a directory
>
> $hugepagesMountPoint/libvirt/qemu/$shortName
>
> and for non-hugepages we just use
>
> $memoryBackingDir (== /var/lib/libvirt/ram)
>
> In both cases, we then just let QEMU create a random tempfile
> name within these directories.
>
Correct.
> So, IIUC, your proposal here is just making the non-hugepages
> case work the same way the hugepages case works, except that
> it is adding an extra level of $alias in the directory path.
Almost. $alias is actual file, not dir.
>
> I don't think this extra level of nesting is really desirable,
> or needed. We should just give QEMU a filename, so that it
> doesn't create a random tempfile. This is achieved by simply
> doing a
>
> mkdir($memoryBackingDir/libvirt/qemu/$shortName)
>
> but then giving a
>
> mem-path=$memoryBackingDir/libvirt/qemu/$shortName/$alias
Yes. That's exactly what I'm doing. A snippet from next patch where we
can see this in action:
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-memshared.args
b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-memshared.args
index 5700c3413..352819429 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-memshared.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-numa-memshared.args
@@ -13 +13,1 @@ QEMU_AUDIO_DRV=none \
--object
memory-backend-file,id=ram-node0,mem-path=/var/lib/libvirt/qemu/ram,\
+-object
memory-backend-file,id=ram-node0,mem-path=/var/lib/libvirt/qemu/ram/libvirt/qemu/-1-QEMUGuest1/ram-node0,\
And even though you're not disputing '/libvirt/qemu/' part in the path,
I'll just point out for future reference that memoryBackingDir can be
just any path in the system. It's just that the default is
/var/lib/libvirt/qemu which makes the generated path ugly (and indeed
renders the part redundant).
>
> QEMU will try to open that, and will get ENOENT, at which
> point it to O_CREAT that file with the exact name we've
> given, instead of using a tempfile name.
>
>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>> src/qemu/libvirtd_qemu.aug | 1 +
>> src/qemu/qemu.conf | 5 ++
>> src/qemu/qemu_command.c | 9 +--
>> src/qemu/qemu_conf.c | 76 +++++++++++++++++++-
>> src/qemu/qemu_conf.h | 10 ++-
>> src/qemu/qemu_driver.c | 19 +++++
>> src/qemu/qemu_hotplug.c | 2 +-
>> src/qemu/qemu_process.c | 141 ++++++++++++++++++++++++++-----------
>> src/qemu/qemu_process.h | 8 +--
>> src/qemu/test_libvirtd_qemu.aug.in | 1 +
>> 10 files changed, 220 insertions(+), 52 deletions(-)
>
> I'd expect to see current tests updated wrt the new naming scheme
> for paths
See next patch.
>
>> diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug
>> index c19bf3a43..77d466b14 100644
>> --- a/src/qemu/libvirtd_qemu.aug
>> +++ b/src/qemu/libvirtd_qemu.aug
>> @@ -114,6 +114,7 @@ module Libvirtd_qemu =
>> let gluster_debug_level_entry = int_entry "gluster_debug_level"
>>
>> let memory_entry = str_entry "memory_backing_dir"
>> + | bool_entry "memory_predictable_file_names"
>>
>> let vxhs_entry = bool_entry "vxhs_tls"
>> | str_entry "vxhs_tls_x509_cert_dir"
>> diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf
>> index 2e8370a5a..dc3098148 100644
>> --- a/src/qemu/qemu.conf
>> +++ b/src/qemu/qemu.conf
>> @@ -769,3 +769,8 @@
>> # This directory is used for memoryBacking source if configured as file.
>> # NOTE: big files will be stored here
>> #memory_backing_dir = "/var/lib/libvirt/qemu/ram"
>> +
>> +# Use predictable file names. If this is enabled, Libvirt constructs
>> +# full paths for memory-backing-file objects. This is experimental
>> +# feature and generated paths can change across releases. Don't use it.
>> +#memory_predictable_file_names = 1
>
> I don't think we should expose this in the config file at all - it means
> we get 2 codepaths, one of which will never be tested by 99% of the
> deployments.
>
> I think we should just make normal mem paths uses the same naming
> scheme as hugepage mempaths unconditionally. There's no benefit to
> keeping the old naming scheme around.
>
> At the same time though, we don't need to promise anything wrt the new
> naming scheme. If someone wants to rely on it they can, but we're not
> going to promise forever compat.
Even better! Cool.
>
>
>> +static int
>> +qemuProcessBuildDestroyMemoryPathsImpl(virQEMUDriverPtr driver,
>> + virDomainDefPtr def,
>> + const char *path,
>> + bool build)
>> +{
>> + if (build) {
>> + if (virFileExists(path))
>> + return 0;
>> +
>> + if (virFileMakePathWithMode(path, 0700) < 0) {
>> + virReportSystemError(errno,
>> + _("Unable to create %s"),
>> + path);
>> + return -1;
>> + }
>
> NB, this creates potentially many levels in the dir hiearchy
>
> $memoryBackingDir/libvirt
> $memoryBackingDir/libvirt/qemu/
> $memoryBackingDir/libvirt/qemu/$shortName
Only these ^^ are dirs.
> $memoryBackingDir/libvirt/qemu/$shortName/$alias
This is actual file.
>
>> +
>> + if (qemuSecurityDomainSetPathLabel(driver->securityManager,
>> + def, path) < 0) {
>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>> + _("Unable to label %s"), path);
>> + return -1;
>> + }
>> + } else {
>> + if (rmdir(path) < 0 &&
>> + errno != ENOENT)
>> + VIR_WARN("Unable to remove hugepage path: %s (errno=%d)",
>> + path, errno);
>
> This only deletes
>
> $memoryBackingDir/libvirt/qemu/$shortName/$alias
>
> so we're leaving around
>
> $memoryBackingDir/libvirt/qemu/$shortName
Is that so? I'm fairly certain it removes
$memoryBackingDir/libvirt/qemu/$shortName
Michal
More information about the libvir-list
mailing list