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>
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",