[libvirt] [PATCH v3 20/30] qemu: Create NVMe disk in domain namespace
Michal Privoznik
mprivozn at redhat.com
Thu Dec 12 09:19:13 UTC 2019
On 12/10/19 9:16 PM, Cole Robinson wrote:
> On 12/2/19 9:26 AM, Michal Privoznik wrote:
>> If a domain has an NVMe disk configured, then we need to create
>> /dev/vfio/* paths in domain's namespace so that qemu can open
>> them.
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>> src/qemu/qemu_domain.c | 67 ++++++++++++++++++++++++++++++++----------
>> 1 file changed, 51 insertions(+), 16 deletions(-)
>>
>> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>> index 7b515b9520..70c4ee8e65 100644
>> --- a/src/qemu/qemu_domain.c
>> +++ b/src/qemu/qemu_domain.c
>> @@ -13430,16 +13430,29 @@ qemuDomainSetupDisk(virQEMUDriverConfigPtr cfg G_GNUC_UNUSED,
>> {
>> virStorageSourcePtr next;
>> char *dst = NULL;
>> + bool hasNVMe = false;
>> int ret = -1;
>>
>> for (next = disk->src; virStorageSourceIsBacking(next); next = next->backingStore) {
>> - if (!next->path || !virStorageSourceIsLocalStorage(next)) {
>> - /* Not creating device. Just continue. */
>> - continue;
>> - }
>> + if (next->type == VIR_STORAGE_TYPE_NVME) {
>> + g_autofree char *nvmePath = NULL;
>>
>> - if (qemuDomainCreateDevice(next->path, data, false) < 0)
>> - goto cleanup;
>> + hasNVMe = true;
>> +
>> + if (!(nvmePath = virPCIDeviceAddressGetIOMMUGroupDev(&next->nvme->pciAddr)))
>> + goto cleanup;
>> +
>> + if (qemuDomainCreateDevice(nvmePath, data, false) < 0)
>> + goto cleanup;
>> + } else {
>> + if (!next->path || !virStorageSourceIsLocalStorage(next)) {
>> + /* Not creating device. Just continue. */
>> + continue;
>> + }
>> +
>> + if (qemuDomainCreateDevice(next->path, data, false) < 0)
>> + goto cleanup;
>> + }
>> }
>>
>
> I don't see anything wrong with this patch. In the interest of getting
> this series into git, here is my:
>
> Reviewed-by: Cole Robinson <crobinso at redhat.com>
>
>
> But, I'm finding a lot of the 'next->type == VIR_STORAGE_TYPE_NVME'
> sprinkled around unfortunate, here and in later patches. It seems like
> there's two StorageSource cases here involving local filesystem paths:
>
> 1) Does src->path contain the <source> storage location? Answered by
> virStorageSourceIsLocalStorage
> 2) Does src have a local path that the VM needs to access? Until now
> this was always the same as #1 && src->path, but not any more.
>
> So maybe add helpers like:
>
> bool
> virStorageSourceHasLocalResource(virStorageSourcePtr src)
> {
> return next->path || next->type == VIR_STORAGE_TYPE_NVME;
> }
>
> const char *
> virStorageSourceGetLocalResource(virStorageSourcePtr src)
> {
> if (!virStorageSourceHasLocalResource(src))
> <error>
>
> if (next->type == NVME)
> <return VFIO path or error>
>
> return strdup(next->path);
> }
>
> I think virStorageSourceIsLocalStorage should be renamed too because now
> it is ambiguous. Maybe something more explicit like SourceUsesPath, or
> SourceIsLocalPath. Naming sucks obviously so suggestions welcome
>
> With those funtions, the loop above becomes:
>
> for (...) {
> g_autofree char *path = NULL;
> if (!HasLocalResource)
> continue
> if (!(path = GetLocalResource(...))
> error
> <do stuff with path>
> }
>
> The hasNVMe bit can then be replaced with virStorageSourceChainHasNVMe
>
> security driver usage will be simpler too I think. But maybe I'm missing
> some complication
I think you're right. I will save that to a follow up series.
Michal
More information about the libvir-list
mailing list