mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
conf: Add support for vDPA network devices
This patch adds new schema and adds support for parsing and formatting domain configurations that include vdpa devices. vDPA network devices allow high-performance networking in a virtual machine by providing a wire-speed data path. These devices require a vendor-specific host driver but the data path follows the virtio specification. When a device on the host is bound to an appropriate vendor-specific driver, it will create a chardev on the host at e.g. /dev/vhost-vdpa-0. That chardev path can then be used to define a new interface with type='vdpa'. Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com> Reviewed-by: Laine Stump <laine@redhat.com>
This commit is contained in:
parent
c7fa462a87
commit
08f8fd8413
@ -4644,6 +4644,30 @@ or stopping the guest.
|
||||
</devices>
|
||||
...
|
||||
|
||||
:anchor:`<a id="elementsNICSVDPA"/>`
|
||||
|
||||
vDPA devices
|
||||
^^^^^^^^^^^^
|
||||
|
||||
A vDPA network device can be used to provide wire speed network performance
|
||||
within a domain. A vDPA device is a specialized type of network device that
|
||||
uses a datapath that complies with the virtio specification but has a
|
||||
vendor-specific control path. To use such a device with libvirt, the host
|
||||
device must already be bound to the appropriate device-specific vDPA driver.
|
||||
This creates a vDPA char device (e.g. /dev/vhost-vdpa-0) that can be used to
|
||||
assign the device to a libvirt domain. :since:`Since 6.9.0 (QEMU only,
|
||||
requires QEMU 5.1.0 or newer)`
|
||||
|
||||
::
|
||||
|
||||
...
|
||||
<devices>
|
||||
<interface type='vdpa'>
|
||||
<source dev='/dev/vhost-vdpa-0'/>
|
||||
</interface>
|
||||
</devices>
|
||||
...
|
||||
|
||||
:anchor:`<a id="elementsTeaming"/>`
|
||||
|
||||
Teaming a virtio/hostdev NIC pair
|
||||
|
@ -3129,6 +3129,21 @@
|
||||
<ref name="interface-options"/>
|
||||
</interleave>
|
||||
</group>
|
||||
|
||||
<group>
|
||||
<attribute name="type">
|
||||
<value>vdpa</value>
|
||||
</attribute>
|
||||
<interleave>
|
||||
<element name="source">
|
||||
<attribute name="dev">
|
||||
<ref name="deviceName"/>
|
||||
</attribute>
|
||||
</element>
|
||||
<ref name="interface-options"/>
|
||||
</interleave>
|
||||
</group>
|
||||
|
||||
</choice>
|
||||
<optional>
|
||||
<attribute name="trustGuestRxFilters">
|
||||
|
@ -554,6 +554,7 @@ VIR_ENUM_IMPL(virDomainNet,
|
||||
"direct",
|
||||
"hostdev",
|
||||
"udp",
|
||||
"vdpa",
|
||||
);
|
||||
|
||||
VIR_ENUM_IMPL(virDomainNetModel,
|
||||
@ -2495,6 +2496,10 @@ virDomainNetDefFree(virDomainNetDefPtr def)
|
||||
def->data.vhostuser = NULL;
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
VIR_FREE(def->data.vdpa.devicepath);
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_NET_TYPE_SERVER:
|
||||
case VIR_DOMAIN_NET_TYPE_CLIENT:
|
||||
case VIR_DOMAIN_NET_TYPE_MCAST:
|
||||
@ -12095,6 +12100,10 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
|
||||
if (virDomainChrSourceReconnectDefParseXML(&reconnect, cur, ctxt) < 0)
|
||||
goto error;
|
||||
|
||||
} else if (!dev
|
||||
&& def->type == VIR_DOMAIN_NET_TYPE_VDPA
|
||||
&& virXMLNodeNameEqual(cur, "source")) {
|
||||
dev = virXMLPropString(cur, "dev");
|
||||
} else if (!def->virtPortProfile
|
||||
&& virXMLNodeNameEqual(cur, "virtualport")) {
|
||||
if (def->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
|
||||
@ -12352,6 +12361,16 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
|
||||
}
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
if (dev == NULL) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("No <source> 'dev' attribute "
|
||||
"specified with <interface type='vdpa'/>"));
|
||||
goto error;
|
||||
}
|
||||
def->data.vdpa.devicepath = g_steal_pointer(&dev);
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_NET_TYPE_BRIDGE:
|
||||
if (bridge == NULL) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
@ -12741,6 +12760,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
|
||||
case VIR_DOMAIN_NET_TYPE_DIRECT:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
break;
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
default:
|
||||
@ -26985,6 +27005,14 @@ virDomainNetDefFormat(virBufferPtr buf,
|
||||
}
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
if (def->data.vdpa.devicepath) {
|
||||
virBufferEscapeString(buf, "<source dev='%s'",
|
||||
def->data.vdpa.devicepath);
|
||||
sourceLines++;
|
||||
}
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_NET_TYPE_USER:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
break;
|
||||
@ -31205,6 +31233,7 @@ virDomainNetGetActualVirtPortProfile(const virDomainNetDef *iface)
|
||||
case VIR_DOMAIN_NET_TYPE_MCAST:
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
default:
|
||||
return NULL;
|
||||
@ -32036,6 +32065,7 @@ virDomainNetTypeSharesHostView(const virDomainNetDef *net)
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
break;
|
||||
}
|
||||
@ -32297,6 +32327,7 @@ virDomainNetDefActualToNetworkPort(virDomainDefPtr dom,
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_USER:
|
||||
case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("Unexpected network port type %s"),
|
||||
virDomainNetTypeToString(virDomainNetGetActualType(iface)));
|
||||
|
@ -883,6 +883,7 @@ typedef enum {
|
||||
VIR_DOMAIN_NET_TYPE_DIRECT,
|
||||
VIR_DOMAIN_NET_TYPE_HOSTDEV,
|
||||
VIR_DOMAIN_NET_TYPE_UDP,
|
||||
VIR_DOMAIN_NET_TYPE_VDPA,
|
||||
|
||||
VIR_DOMAIN_NET_TYPE_LAST
|
||||
} virDomainNetType;
|
||||
@ -1056,6 +1057,9 @@ struct _virDomainNetDef {
|
||||
*/
|
||||
virDomainActualNetDefPtr actual;
|
||||
} network;
|
||||
struct {
|
||||
char *devicepath;
|
||||
} vdpa;
|
||||
struct {
|
||||
char *brname;
|
||||
} bridge;
|
||||
|
@ -312,6 +312,7 @@ bool virNetDevSupportsBandwidth(virDomainNetType type)
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
break;
|
||||
}
|
||||
|
@ -1386,6 +1386,7 @@ libxlMakeNic(virDomainDefPtr def,
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_DIRECT:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("unsupported interface type %s"),
|
||||
|
@ -1759,6 +1759,7 @@ xenFormatNet(virConnectPtr conn,
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_USER:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported net type '%s'"),
|
||||
virDomainNetTypeToString(net->type));
|
||||
return -1;
|
||||
|
@ -422,6 +422,7 @@ static int virLXCControllerGetNICIndexes(virLXCControllerPtr ctrl)
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("Unsupported net type %s"),
|
||||
virDomainNetTypeToString(actualType));
|
||||
|
@ -3504,6 +3504,7 @@ lxcDomainAttachDeviceNetLive(virLXCDriverPtr driver,
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("Network device type is not supported"));
|
||||
goto cleanup;
|
||||
@ -3558,6 +3559,7 @@ lxcDomainAttachDeviceNetLive(virLXCDriverPtr driver,
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
default:
|
||||
/* no-op */
|
||||
@ -3999,6 +4001,7 @@ lxcDomainDetachDeviceNetLive(virDomainObjPtr vm,
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("Only bridged veth devices can be detached"));
|
||||
goto cleanup;
|
||||
|
@ -607,6 +607,7 @@ virLXCProcessSetupInterfaces(virLXCDriverPtr driver,
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Unsupported network type %s"),
|
||||
virDomainNetTypeToString(type));
|
||||
|
@ -3569,6 +3569,7 @@ qemuBuildHostNetStr(virDomainNetDefPtr net,
|
||||
return NULL;
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
/* Should have been handled earlier via PCI/USB hotplug code. */
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
@ -7989,6 +7990,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
|
||||
case VIR_DOMAIN_NET_TYPE_MCAST:
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
/* nada */
|
||||
break;
|
||||
@ -8025,6 +8027,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
/* These types don't use a network device on the host, but
|
||||
* instead use some other type of connection to the emulated
|
||||
|
@ -5120,7 +5120,8 @@ qemuDomainDeviceNetDefPostParse(virDomainNetDefPtr net,
|
||||
const virDomainDef *def,
|
||||
virQEMUCapsPtr qemuCaps)
|
||||
{
|
||||
if (net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
|
||||
if (net->type != VIR_DOMAIN_NET_TYPE_VDPA &&
|
||||
net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
|
||||
!virDomainNetGetModelString(net) &&
|
||||
virDomainNetResolveActualType(net) != VIR_DOMAIN_NET_TYPE_HOSTDEV)
|
||||
net->model = qemuDomainDefaultNetModel(def, qemuCaps);
|
||||
@ -9313,6 +9314,7 @@ qemuDomainNetSupportsMTU(virDomainNetType type)
|
||||
case VIR_DOMAIN_NET_TYPE_DIRECT:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
break;
|
||||
}
|
||||
|
@ -1339,6 +1339,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
|
||||
case VIR_DOMAIN_NET_TYPE_MCAST:
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
|
||||
_("hotplug of interface type of %s is not implemented yet"),
|
||||
@ -3393,6 +3394,7 @@ qemuDomainChangeNetFilter(virDomainObjPtr vm,
|
||||
case VIR_DOMAIN_NET_TYPE_DIRECT:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("filters not supported on interfaces of type %s"),
|
||||
virDomainNetTypeToString(virDomainNetGetActualType(newdev)));
|
||||
@ -3730,6 +3732,7 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
|
||||
|
||||
case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
|
||||
_("unable to change config on '%s' network type"),
|
||||
virDomainNetTypeToString(newdev->type));
|
||||
|
@ -118,6 +118,7 @@ qemuInterfaceStartDevice(virDomainNetDefPtr net)
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
/* these types all require no action */
|
||||
break;
|
||||
@ -203,6 +204,7 @@ qemuInterfaceStopDevice(virDomainNetDefPtr net)
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
/* these types all require no action */
|
||||
break;
|
||||
|
@ -3347,6 +3347,7 @@ qemuProcessNotifyNets(virDomainDefPtr def)
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
break;
|
||||
}
|
||||
@ -7668,6 +7669,7 @@ void qemuProcessStop(virQEMUDriverPtr driver,
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
/* No special cleanup procedure for these types. */
|
||||
break;
|
||||
|
@ -1329,6 +1329,7 @@ qemuValidateNetSupportsCoalesce(virDomainNetType type)
|
||||
case VIR_DOMAIN_NET_TYPE_MCAST:
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
break;
|
||||
}
|
||||
|
@ -3980,6 +3980,7 @@ virVMXFormatEthernet(virDomainNetDefPtr def, int controller,
|
||||
case VIR_DOMAIN_NET_TYPE_DIRECT:
|
||||
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported net type '%s'"),
|
||||
virDomainNetTypeToString(def->type));
|
||||
return -1;
|
||||
|
@ -1007,6 +1007,7 @@ cmdAttachInterface(vshControl *ctl, const vshCmd *cmd)
|
||||
case VIR_DOMAIN_NET_TYPE_CLIENT:
|
||||
case VIR_DOMAIN_NET_TYPE_MCAST:
|
||||
case VIR_DOMAIN_NET_TYPE_UDP:
|
||||
case VIR_DOMAIN_NET_TYPE_VDPA:
|
||||
case VIR_DOMAIN_NET_TYPE_INTERNAL:
|
||||
case VIR_DOMAIN_NET_TYPE_LAST:
|
||||
vshError(ctl, _("No support for %s in command 'attach-interface'"),
|
||||
|
Loading…
Reference in New Issue
Block a user