]> xenbits.xensource.com Git - libvirt.git/commitdiff
Use pciDeviceIsAssignable in qemu driver
authorJiri Denemark <jdenemar@redhat.com>
Tue, 22 Dec 2009 17:21:16 +0000 (18:21 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Tue, 19 Jan 2010 16:30:41 +0000 (17:30 +0100)
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
src/qemu/libvirtd_qemu.aug
src/qemu/qemu.conf
src/qemu/qemu_conf.c
src/qemu/qemu_conf.h
src/qemu/qemu_driver.c
src/qemu/test_libvirtd_qemu.aug

index f0b2a5e3c1365467458a5e3945013b0261cabb4e..ef754219094b3a44e9c241231378313ac78c3bca 100644 (file)
@@ -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
index 2129bae2b5db633c8e8870042160a70c1cd66c3c..1078963c08e9ee51faac3d3777f2030b1460ecae 100644 (file)
 # 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
index 1fbb86a79af1260d9ddd71d3f8bb2b337f0ecc55..38eb3fd8c68b258c10dc7a2b85b8a3092fb98ac9 100644 (file)
@@ -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;
 }
index c6f8c30a99957963843a4f8c0a73acffb9764645..46ed704877513da375c17363612e88e1af4538c2 100644 (file)
@@ -125,6 +125,8 @@ struct qemud_driver {
     unsigned int macFilter : 1;
     ebtablesContext *ebtables;
 
+    unsigned int relaxedACS : 1;
+
     virCapsPtr caps;
 
     /* An array of callbacks */
index 2d80774bc1248ae1a830457c1b080f9e10757c75..695e4aafefa22e4f9e7cb2a14420f13688667888 100644 (file)
@@ -2192,6 +2192,9 @@ qemuPrepareHostDevices(virConnectPtr conn,
 
     for (i = 0; i < pciDeviceListCount(pcidevs); i++) {
         pciDevice *dev = pciDeviceListGet(pcidevs, i);
+        if (!pciDeviceIsAssignable(conn, dev, !driver->relaxedACS))
+            goto cleanup;
+
         if (pciDeviceGetManaged(dev) &&
             pciDettachDevice(conn, dev) < 0)
             goto cleanup;
@@ -5792,7 +5795,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;
index ac8943865107fde786004ed61e293233e5d99c1e..e9abbb41e07b722c5c029f43c155b488cb22cbf7 100644 (file)
@@ -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" }