[libvirt] [PATCH v2] virt-host-validate: check for IOMMU support

Daniel P. Berrange berrange at redhat.com
Mon Oct 12 17:21:50 UTC 2015


On Mon, Oct 12, 2015 at 01:16:49PM +0100, Daniel P. Berrange wrote:
> This looks for existance of DMAR (Intel) and IVRS (AMD)
> files under /sys/firmware/acpi/tables/, as a sign that
> the platform has IOMMU present & enabled in the BIOS.
> 
> If these are present and /sys/kernel/iommu_groups does
> not contain any entries this is taken as a sign that
> the kernel has not enabled the IOMMU currently.
> 
> If no ACPI tables are found we can't distinguish between
> disabled in BIOS and not present in the hardware, so we
> have to give the user a generic hint.
> 
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
> 
> Changed in v2:
> 
>   - Completely refactor the check to remove false
>     positives and cope with iommu being enabled
>     by default
>   - Add AMD support
> 
>  tools/virt-host-validate-common.c | 64 +++++++++++++++++++++++++++++++++++++++
>  tools/virt-host-validate-common.h |  3 ++
>  tools/virt-host-validate-qemu.c   |  6 ++++
>  3 files changed, 73 insertions(+)
> 
> diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-common.c
> index a88fc56..38128b1 100644
> --- a/tools/virt-host-validate-common.c
> +++ b/tools/virt-host-validate-common.c
> @@ -26,6 +26,7 @@
>  #include <stdio.h>
>  #include <unistd.h>
>  #include <sys/utsname.h>
> +#include <sys/stat.h>
>  #include <mntent.h>
>  
>  #include "virutil.h"
> @@ -341,3 +342,66 @@ int virHostValidateCGroupController(const char *hvname,
>          return -1;
>      return 0;
>  }
> +
> +int virHostValidateIOMMU(const char *hvname,
> +                         virHostValidateLevel level)
> +{
> +    struct stat sb;
> +    const char *bootarg = NULL;
> +    bool isAMD = false, isIntel = false;
> +
> +    if (virHostValidateHasCPUFlag("vmx"))
> +        isIntel = true;
> +    else if (virHostValidateHasCPUFlag("svm"))
> +        isAMD = true;
> +    else
> +        /* XXX PPC/ARM/etc support */
> +        return 0;
> +
> +    virHostMsgCheck(hvname, "%s", _("for device assignment IOMMU support"));
> +
> +    if (isIntel) {
> +        if (access("/sys/firmware/acpi/tables/DMAR", F_OK) == 0) {
> +            virHostMsgPass();
> +            bootarg = "intel_iommu=on";
> +        } else {
> +            virHostMsgFail(level,
> +                           "No ACPI DMAR table found, IOMMU either "
> +                           "disabled in BIOS or not supported by this "
> +                           "hardware platform");
> +            return -1;
> +        }
> +    } else if (isAMD) {
> +        if (access("/sys/firmware/acpi/tables/IVRS", F_OK) == 0) {
> +            virHostMsgPass();
> +            bootarg = "iommu=pt iommu=1";
> +        } else {
> +            virHostMsgFail(level,
> +                           "No ACPI IVRS table found, IOMMU either "
> +                           "disabled in BIOS or not supported by this "
> +                           "hardware platform");
> +            return -1;
> +        }
> +    } else {
> +        virHostMsgFail(level,
> +                       "Unknown if this platform has IOMMU support");
> +        return -1;
> +    }
> +
> +
> +    /* We can only check on newer kernels with iommu groups & vfio */
> +    if (stat("/sys/kernel/iommu_groups", &sb) < 0)
> +        return 0;
> +
> +    if (!S_ISDIR(sb.st_mode))
> +        return 0;
> +
> +    virHostMsgCheck(hvname, "%s", _("if IOMMU is enabled by kernel"));
> +    if (sb.st_nlink <= 2) {
> +        virHostMsgFail(level,
> +                       "IOMMU appears to be disabled in kernel. "
> +                       "Add %s to kernel cmdline arguments", bootarg);
> +        return -1;
> +    }

Opps, Laine pointed out on IRC I should have

  virHostMsgPass();

called here on success

> +    return 0;
> +}


Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list