[libvirt] [PATCH v2] tools/virt-host-validate: Fix IOMMU check on s390x

Michal Privoznik mprivozn at redhat.com
Fri Mar 8 08:21:15 UTC 2019


On 3/7/19 9:17 PM, Thomas Huth wrote:
> On 07/03/2019 18.15, Michal Privoznik wrote:
>> On 3/1/19 12:10 PM, Thomas Huth wrote:
>>> When running virt-host-validate on an s390x host, the tool currently
>>> warns
>>> that it is "Unknown if this platform has IOMMU support". We can use the
>>> common check for entries in /sys/kernel/iommu_groups here, too, but it
>>> only
>>> makes sense to check it if there are also PCI devices available. It's
>>> also
>>> common on s390x that there are no PCI devices assigned to the LPAR,
>>> and in
>>> that case there is no need for the PCI-related IOMMU, so without PCI
>>> devices
>>> we should simply skip this test.
>>>
>>> Signed-off-by: Thomas Huth <thuth at redhat.com>
>>> ---
>>>    v2:
>>>    - Use virDirOpen() + virDirRead() instead of stat() - this should
>>> hopefully
>>>      work now as expected.
>>>
>>>    tools/virt-host-validate-common.c | 22 +++++++++++++++++-----
>>>    1 file changed, 17 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/tools/virt-host-validate-common.c
>>> b/tools/virt-host-validate-common.c
>>> index 73e3bdb..e27b558 100644
>>> --- a/tools/virt-host-validate-common.c
>>> +++ b/tools/virt-host-validate-common.c
>>> @@ -337,7 +337,12 @@ int virHostValidateIOMMU(const char *hvname,
>>>        virBitmapPtr flags;
>>>        struct stat sb;
>>>        const char *bootarg = NULL;
>>> -    bool isAMD = false, isIntel = false, isPPC = false;
>>> +    bool isAMD = false, isIntel = false;
>>> +    virArch arch = virArchFromHost();
>>> +    struct dirent *dent;
>>> +    DIR *dir;
>>> +    int rc;
>>> +
>>>        flags = virHostValidateGetCPUFlags();
>>>          if (flags && virBitmapIsBitSet(flags,
>>> VIR_HOST_VALIDATE_CPU_FLAG_VMX))
>>> @@ -347,8 +352,6 @@ int virHostValidateIOMMU(const char *hvname,
>>>          virBitmapFree(flags);
>>>    -    isPPC = ARCH_IS_PPC64(virArchFromHost());
>>> -
>>>        if (isIntel) {
>>>            virHostMsgCheck(hvname, "%s", _("for device assignment IOMMU
>>> support"));
>>>            if (access("/sys/firmware/acpi/tables/DMAR", F_OK) == 0) {
>>> @@ -373,8 +376,17 @@ int virHostValidateIOMMU(const char *hvname,
>>>                               "hardware platform");
>>>                return -1;
>>>            }
>>> -    } else if (isPPC) {
>>> +    } else if (ARCH_IS_PPC64(arch)) {
>>>            /* Empty Block */
>>> +    } else if (ARCH_IS_S390(arch)) {
>>> +        /* On s390x, we skip the IOMMU check if there are no PCI devices
>>> +         * (which is quite usual on s390x) */
>>> +        if (!virDirOpen(&dir, "/sys/bus/pci/devices"))
>>> +            return 0;
>>> +        rc = virDirRead(dir, &dent, NULL);
>>> +        VIR_DIR_CLOSE(dir);
>>
>> Is this diropen and dirread really necessary?
> 
> Yes.
> 
>> I mean, would something
>> like plain test of the path presence be okay, e.g.
>> virFileExists("/sys/bus/pci/devices").
> 
> No, that's unfortunately not enough. The "/sys/bus/pci/devices"
> directory is always present, even if there are no PCI devices available,
> it's just empty in that case. So as far as I can see, the dirread is
> necessary here.

Ah, this was the missing piece. Okay, makes sense then.

I'm adding the following to the comment then, ACKing and pushing:

+        /* On s390x, we skip the IOMMU check if there are no PCI
+         * devices (which is quite usual on s390x). If there are
+         * no PCI devices the directory is still there but is
+         * empty. */


Michal




More information about the libvir-list mailing list