]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: support reporting maxCount attribute for virtual_functions cap
authorLaine Stump <laine@laine.org>
Mon, 23 Nov 2015 19:50:31 +0000 (14:50 -0500)
committerLaine Stump <laine@laine.org>
Tue, 24 Nov 2015 17:29:31 +0000 (12:29 -0500)
Report the maximum possible number of VFs for an SRIOV PF, like this:

   <capability type='virtual_functions' maxCount='7'>
      ...
   </capability>

I've just discovered that the virtual_functions and physical_functions
capabilities are not supported in the virNodeDeviceParse functions,
only in virNodeDeviceFormat (I suppose because they are only reported,
not set from XML). This should probably be remedied, but is less
immediately useful than the current patch.

docs/formatnode.html.in
src/conf/node_device_conf.c
src/conf/node_device_conf.h

index ed00af59d40c7e3978a62e6d36a20e8375d8841e..6c12227b89525910fc5b79b491a87e68e4f8a80b 100644 (file)
                 the type is <code>virtual_functions</code>, then this
                 device is an SRIOV PF, and the capability element will
                 have a list of <code>address</code> subelements, one
-                for each VF on this PF.
+                for each VF on this PF. If the host system supports
+                reporting it (via the "sriov_maxvfs" file in the
+                device's sysfs directory) the capability element will
+                also have an attribute named <code>maxCount</code>
+                which is the maximum number of SRIOV VFs supported by
+                this device, which could be higher than the number of
+                VFs that are curently active <span class="since">since
+                1.3.0</span>; in this case, even if there are
+                currently no active VFs the virtual_functions
+                capabililty will still be shown.
               </dd>
               <dt><code>numa</code></dt>
               <dd>
index e6f3f272e0d60974a85e90f88512b22c3a5c1300..c04739f901214443196280e448c0c2c2273627f8 100644 (file)
@@ -361,19 +361,27 @@ char *virNodeDeviceDefFormat(const virNodeDeviceDef *def)
                 virBufferAddLit(&buf, "</capability>\n");
             }
             if (data->pci_dev.flags & VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION) {
-                virBufferAddLit(&buf, "<capability type='virt_functions'>\n");
-                virBufferAdjustIndent(&buf, 2);
-                for (i = 0; i < data->pci_dev.num_virtual_functions; i++) {
-                    virBufferAsprintf(&buf,
-                                      "<address domain='0x%.4x' bus='0x%.2x' "
-                                      "slot='0x%.2x' function='0x%.1x'/>\n",
-                                      data->pci_dev.virtual_functions[i]->domain,
-                                      data->pci_dev.virtual_functions[i]->bus,
-                                      data->pci_dev.virtual_functions[i]->slot,
-                                      data->pci_dev.virtual_functions[i]->function);
+                virBufferAddLit(&buf, "<capability type='virt_functions'");
+                if (data->pci_dev.max_virtual_functions)
+                    virBufferAsprintf(&buf, " maxCount='%u'",
+                                      data->pci_dev.max_virtual_functions);
+                if (data->pci_dev.num_virtual_functions == 0) {
+                    virBufferAddLit(&buf, "/>\n");
+                } else {
+                    virBufferAddLit(&buf, ">\n");
+                    virBufferAdjustIndent(&buf, 2);
+                    for (i = 0; i < data->pci_dev.num_virtual_functions; i++) {
+                        virBufferAsprintf(&buf,
+                                          "<address domain='0x%.4x' bus='0x%.2x' "
+                                          "slot='0x%.2x' function='0x%.1x'/>\n",
+                                          data->pci_dev.virtual_functions[i]->domain,
+                                          data->pci_dev.virtual_functions[i]->bus,
+                                          data->pci_dev.virtual_functions[i]->slot,
+                                          data->pci_dev.virtual_functions[i]->function);
+                    }
+                    virBufferAdjustIndent(&buf, -2);
+                    virBufferAddLit(&buf, "</capability>\n");
                 }
-                virBufferAdjustIndent(&buf, -2);
-                virBufferAddLit(&buf, "</capability>\n");
             }
             if (data->pci_dev.nIommuGroupDevices) {
                 virBufferAsprintf(&buf, "<iommuGroup number='%d'>\n",
index 7dd39ca96338a45449bf2009dbb2a736bf62b5e9..d0071867ccb7ca60224ee71585dc342ed32691c4 100644 (file)
@@ -112,6 +112,7 @@ typedef struct _virNodeDevCapData {
             virPCIDeviceAddressPtr physical_function;
             virPCIDeviceAddressPtr *virtual_functions;
             size_t num_virtual_functions;
+            unsigned int max_virtual_functions;
             unsigned int flags;
             virPCIDeviceAddressPtr *iommuGroupDevices;
             size_t nIommuGroupDevices;