[libvirt] [PATCH 1/2] qemu: Create hugepage path on per domain basis

Michal Privoznik mprivozn at redhat.com
Tue Nov 29 08:28:29 UTC 2016


On 25.11.2016 09:35, Martin Kletzander wrote:
> On Tue, Nov 22, 2016 at 01:45:42PM +0100, Michal Privoznik wrote:
>> If you've ever tried running a huge page backed guest under
>> different user than root, you probably failed. Problem is even
> 
> Surely you mean different than the default user from qemu.conf.
> 
>> though we have corresponding APIs in the security drivers,
>> there's no implementation and thus we don't relabel the huge page
>> path. But even if we did, so far all of the domains share the
>> same path:
>>
>>   /hugepageMount/libvirt/qemu
>>
>> Our only option there would be to set 0777 mode on the qemu dir
>> which is totally unsafe. Therefore, we can create dir on
>> per-domain basis, i.e.:
>>
>>   /hugepageMount/libvirt/qemu/domainName
>>
>> and chown domainName dir to the user that domain is configured to
>> run under.
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>> src/qemu/qemu_command.c                            |  4 +-
>> src/qemu/qemu_conf.c                               | 45
>> ++++++++++++++++------
>> src/qemu/qemu_conf.h                               | 16 +++++---
>> src/qemu/qemu_driver.c                             | 19 +++------
>> src/qemu/qemu_process.c                            | 25 +++++++++++-
>> .../qemuxml2argv-hugepages-numa.args               |  4 +-
>> .../qemuxml2argv-hugepages-pages.args              | 14 +++----
>> .../qemuxml2argv-hugepages-pages2.args             |  2 +-
>> .../qemuxml2argv-hugepages-pages3.args             |  2 +-
>> .../qemuxml2argv-hugepages-pages5.args             |  2 +-
>> .../qemuxml2argv-hugepages-shared.args             | 12 +++---
>> tests/qemuxml2argvdata/qemuxml2argv-hugepages.args |  2 +-
>> .../qemuxml2argv-memory-hotplug-dimm-addr.args     |  4 +-
>> .../qemuxml2argv-memory-hotplug-dimm.args          |  4 +-
>> 14 files changed, 97 insertions(+), 58 deletions(-)
>>
>> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
>> index 0ed88f5..942ad86 100644
>> --- a/src/qemu/qemu_conf.c
>> +++ b/src/qemu/qemu_conf.c
>> @@ -1468,8 +1468,26 @@ qemuGetHugepagePath(virHugeTLBFSPtr hugepage)
>> }
>>
>>
>> +char *
>> +qemuGetDomainHugepagePath(const virDomainDef *def,
>> +                          virHugeTLBFSPtr hugepage)
>> +{
>> +    char *base = qemuGetBaseHugepagePath(hugepage);
>> +    char *ret;
>> +
>> +    if (!base ||
>> +        virAsprintf(&ret, "%s/%s", base, def->name) < 0) {
>> +        VIR_FREE(base);
>> +        return NULL;
>> +    }
>> +
>> +    return ret;
>> +}
>> +
> 
> You can't simply user the name because our restrictions for the name are
> too lax.  You should get unique directory name usable for this using
> virDomainObjGetShortName() to make sure the creation doesn't fail.

I thought that when we are using plain domain name for storing domain
status XML or pid file that I'm safe here too. But okay, I can change
it. I jut hope that by the time the command line is built domain already
has id allocated.

> 
> However, that reminds me that you might need to deal with similar thing
> I had to deal with when adding per-domain subdirectories for private
> domain paths.  You should save the path (or at least the information
> that the newer path is used) in the domain object and save/restore it
> in/from the state XML.  The way it's implemented now will break for
> example hotplug of hugepage-backed memory after libvirt upgrade.

Not really. We don't expose the path anywhere, and whenever it is needed
we construct it. I've tested this and basically the only problem I ran
into was that we don't build the path on domain hotplug (rather than on
domain startup), but it is trivial to fix.

Michal




More information about the libvir-list mailing list