[libvirt] [PATCH v2 2/2] Use pciDeviceIsAssignable in qemu driver

Daniel Veillard veillard at redhat.com
Wed Dec 23 08:16:15 UTC 2009


On Tue, Dec 22, 2009 at 06:21:16PM +0100, Jiri Denemark wrote:
> 
> Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> ---
>  src/qemu/libvirtd_qemu.aug      |    1 +
>  src/qemu/qemu.conf              |    6 ++++++
>  src/qemu/qemu_conf.c            |    4 ++++
>  src/qemu/qemu_conf.h            |    2 ++
>  src/qemu/qemu_driver.c          |    6 +++++-
>  src/qemu/test_libvirtd_qemu.aug |    6 +++++-
>  6 files changed, 23 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug
> index f0b2a5e..ef75421 100644
> --- a/src/qemu/libvirtd_qemu.aug
> +++ b/src/qemu/libvirtd_qemu.aug
> @@ -36,6 +36,7 @@ module Libvirtd_qemu =
>                   | str_array_entry "cgroup_device_acl"
>                   | str_entry "save_image_format"
>                   | str_entry "hugetlbfs_mount"
> +                 | bool_entry "relaxed_acs_check"
>  
>     (* Each enty in the config is one of the following three ... *)
>     let entry = vnc_entry
> diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf
> index 2129bae..1078963 100644
> --- a/src/qemu/qemu.conf
> +++ b/src/qemu/qemu.conf
> @@ -157,3 +157,9 @@
>  # This currently requires ebtables to be installed.
>  #
>  # mac_filter = 1
> +
> +# By default, PCI devices below non-ACS switch are not allowed to be assigned
> +# to guests. By setting relaxed_acs_check to 1 such devices will be allowed to
> +# be assigned to guests.
> +#
> +# relaxed_acs_check = 1

  Okay. Really all this should be done in hardware and this is extra
pollution in the config file until this get solved or we manage to
build a proper white list. But at this point that's the best solution.

> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index f53c1f7..3d4bc4c 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -340,6 +340,10 @@ int qemudLoadDriverConfig(struct qemud_driver *driver,
>          }
>      }
>  
> +    p = virConfGetValue (conf, "relaxed_acs_check");
> +    CHECK_TYPE ("relaxed_acs_check", VIR_CONF_LONG);
> +    if (p) driver->relaxedACS = p->l;
> +
>      virConfFree (conf);
>      return 0;
>  }
> diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
> index 209cd31..befa20f 100644
> --- a/src/qemu/qemu_conf.h
> +++ b/src/qemu/qemu_conf.h
> @@ -121,6 +121,8 @@ struct qemud_driver {
>      unsigned int macFilter : 1;
>      ebtablesContext *ebtables;
>  
> +    unsigned int relaxedACS : 1;
> +
>      virCapsPtr caps;
>  
>      /* An array of callbacks */
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index a6a1a5a..7d42e6f 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -1813,6 +1813,9 @@ qemuPrepareHostDevices(virConnectPtr conn,
>  
>      for (i = 0; i < pciDeviceListCount(pcidevs); i++) {
>          pciDevice *dev = pciDeviceListGet(pcidevs, i);
> +        if (!pciDeviceIsAssignable(conn, dev, !driver->relaxedACS))
> +            goto cleanup;
> +

  Okay, that where we hook up with patch 1

>          if (pciDeviceGetManaged(dev) &&
>              pciDettachDevice(conn, dev) < 0)
>              goto cleanup;
> @@ -5298,7 +5301,8 @@ static int qemudDomainAttachHostPciDevice(virConnectPtr conn,
>      if (!pci)
>          return -1;
>  
> -    if ((hostdev->managed && pciDettachDevice(conn, pci) < 0) ||
> +    if (!pciDeviceIsAssignable(conn, pci, !driver->relaxedACS) ||
> +        (hostdev->managed && pciDettachDevice(conn, pci) < 0) ||
>          pciResetDevice(conn, pci, driver->activePciHostdevs) < 0) {
>          pciFreeDevice(conn, pci);
>          return -1;
> diff --git a/src/qemu/test_libvirtd_qemu.aug b/src/qemu/test_libvirtd_qemu.aug
> index ac89438..e9abbb4 100644
> --- a/src/qemu/test_libvirtd_qemu.aug
> +++ b/src/qemu/test_libvirtd_qemu.aug
> @@ -93,6 +93,8 @@ cgroup_device_acl = [ \"/dev/null\", \"/dev/full\", \"/dev/zero\" ]
>  save_image_format = \"gzip\"
>  
>  hugetlbfs_mount = \"/dev/hugepages\"
> +
> +relaxed_acs_check = 1
>  "
>  
>     test Libvirtd_qemu.lns get conf =
> @@ -195,4 +197,6 @@ hugetlbfs_mount = \"/dev/hugepages\"
>  { "#empty" }
>  { "save_image_format" = "gzip" }
>  { "#empty" }
> -{ "hugetlbfs_mount" = "/dev/hugepages" }
> \ No newline at end of file
> +{ "hugetlbfs_mount" = "/dev/hugepages" }
> +{ "#empty" }
> +{ "relaxed_acs_check" = "1" }

  ACK, thanks !

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list