mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: Move and rename qemuOpenVhostNet
Move function to qemu_interface.c and rename to qemuInterfaceOpenVhostNet Signed-off-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
177db48734
commit
7edf0e5ef8
@ -258,100 +258,6 @@ qemuBuildObjectCommandlineFromJSON(const char *type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qemuOpenVhostNet:
|
|
||||||
* @def: domain definition
|
|
||||||
* @net: network definition
|
|
||||||
* @qemuCaps: qemu binary capabilities
|
|
||||||
* @vhostfd: array of opened vhost-net device
|
|
||||||
* @vhostfdSize: number of file descriptors in @vhostfd array
|
|
||||||
*
|
|
||||||
* Open vhost-net, multiple times - if requested.
|
|
||||||
* In case, no vhost-net is needed, @vhostfdSize is set to 0
|
|
||||||
* and 0 is returned.
|
|
||||||
*
|
|
||||||
* Returns: 0 on success
|
|
||||||
* -1 on failure
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
qemuOpenVhostNet(virDomainDefPtr def,
|
|
||||||
virDomainNetDefPtr net,
|
|
||||||
virQEMUCapsPtr qemuCaps,
|
|
||||||
int *vhostfd,
|
|
||||||
size_t *vhostfdSize)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
const char *vhostnet_path = net->backend.vhost;
|
|
||||||
|
|
||||||
if (!vhostnet_path)
|
|
||||||
vhostnet_path = "/dev/vhost-net";
|
|
||||||
|
|
||||||
/* If running a plain QEMU guest, or
|
|
||||||
* if the config says explicitly to not use vhost, return now*/
|
|
||||||
if (def->virtType != VIR_DOMAIN_VIRT_KVM ||
|
|
||||||
net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_QEMU) {
|
|
||||||
*vhostfdSize = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If qemu doesn't support vhost-net mode (including the -netdev command
|
|
||||||
* option), don't try to open the device.
|
|
||||||
*/
|
|
||||||
if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOST_NET) &&
|
|
||||||
qemuDomainSupportsNetdev(def, qemuCaps, net))) {
|
|
||||||
if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
||||||
"%s", _("vhost-net is not supported with "
|
|
||||||
"this QEMU binary"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
*vhostfdSize = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the nic model isn't virtio, don't try to open. */
|
|
||||||
if (!(net->model && STREQ(net->model, "virtio"))) {
|
|
||||||
if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
||||||
"%s", _("vhost-net is only supported for "
|
|
||||||
"virtio network interfaces"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
*vhostfdSize = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < *vhostfdSize; i++) {
|
|
||||||
vhostfd[i] = open(vhostnet_path, O_RDWR);
|
|
||||||
|
|
||||||
/* If the config says explicitly to use vhost and we couldn't open it,
|
|
||||||
* report an error.
|
|
||||||
*/
|
|
||||||
if (vhostfd[i] < 0) {
|
|
||||||
virDomainAuditNetDevice(def, net, vhostnet_path, false);
|
|
||||||
if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
||||||
"%s", _("vhost-net was requested for an interface, "
|
|
||||||
"but is unavailable"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
VIR_WARN("Unable to open vhost-net. Opened so far %zu, requested %zu",
|
|
||||||
i, *vhostfdSize);
|
|
||||||
*vhostfdSize = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
virDomainAuditNetDevice(def, net, vhostnet_path, *vhostfdSize);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
error:
|
|
||||||
while (i--)
|
|
||||||
VIR_FORCE_CLOSE(vhostfd[i]);
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
qemuNetworkPrepareDevices(virDomainDefPtr def)
|
qemuNetworkPrepareDevices(virDomainDefPtr def)
|
||||||
{
|
{
|
||||||
@ -6696,7 +6602,8 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
|
|||||||
|
|
||||||
memset(vhostfd, -1, vhostfdSize * sizeof(vhostfd[0]));
|
memset(vhostfd, -1, vhostfdSize * sizeof(vhostfd[0]));
|
||||||
|
|
||||||
if (qemuOpenVhostNet(def, net, qemuCaps, vhostfd, &vhostfdSize) < 0)
|
if (qemuInterfaceOpenVhostNet(def, net, qemuCaps,
|
||||||
|
vhostfd, &vhostfdSize) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,12 +225,6 @@ char *qemuBuildRedirdevDevStr(virDomainDefPtr def,
|
|||||||
virDomainRedirdevDefPtr dev,
|
virDomainRedirdevDefPtr dev,
|
||||||
virQEMUCapsPtr qemuCaps);
|
virQEMUCapsPtr qemuCaps);
|
||||||
|
|
||||||
int qemuOpenVhostNet(virDomainDefPtr def,
|
|
||||||
virDomainNetDefPtr net,
|
|
||||||
virQEMUCapsPtr qemuCaps,
|
|
||||||
int *vhostfd,
|
|
||||||
size_t *vhostfdSize);
|
|
||||||
|
|
||||||
int qemuNetworkPrepareDevices(virDomainDefPtr def);
|
int qemuNetworkPrepareDevices(virDomainDefPtr def);
|
||||||
|
|
||||||
int qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps);
|
int qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps);
|
||||||
|
@ -927,7 +927,8 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
|
|||||||
tapfd, &tapfdSize) < 0)
|
tapfd, &tapfdSize) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
iface_connected = true;
|
iface_connected = true;
|
||||||
if (qemuOpenVhostNet(vm->def, net, priv->qemuCaps, vhostfd, &vhostfdSize) < 0)
|
if (qemuInterfaceOpenVhostNet(vm->def, net, priv->qemuCaps,
|
||||||
|
vhostfd, &vhostfdSize) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
} else if (actualType == VIR_DOMAIN_NET_TYPE_DIRECT) {
|
} else if (actualType == VIR_DOMAIN_NET_TYPE_DIRECT) {
|
||||||
tapfdSize = vhostfdSize = net->driver.virtio.queues;
|
tapfdSize = vhostfdSize = net->driver.virtio.queues;
|
||||||
@ -944,14 +945,16 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
|
|||||||
VIR_NETDEV_VPORT_PROFILE_OP_CREATE) < 0)
|
VIR_NETDEV_VPORT_PROFILE_OP_CREATE) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
iface_connected = true;
|
iface_connected = true;
|
||||||
if (qemuOpenVhostNet(vm->def, net, priv->qemuCaps, vhostfd, &vhostfdSize) < 0)
|
if (qemuInterfaceOpenVhostNet(vm->def, net, priv->qemuCaps,
|
||||||
|
vhostfd, &vhostfdSize) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
} else if (actualType == VIR_DOMAIN_NET_TYPE_ETHERNET) {
|
} else if (actualType == VIR_DOMAIN_NET_TYPE_ETHERNET) {
|
||||||
vhostfdSize = 1;
|
vhostfdSize = 1;
|
||||||
if (VIR_ALLOC(vhostfd) < 0)
|
if (VIR_ALLOC(vhostfd) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
*vhostfd = -1;
|
*vhostfd = -1;
|
||||||
if (qemuOpenVhostNet(vm->def, net, priv->qemuCaps, vhostfd, &vhostfdSize) < 0)
|
if (qemuInterfaceOpenVhostNet(vm->def, net, priv->qemuCaps,
|
||||||
|
vhostfd, &vhostfdSize) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,6 +38,9 @@
|
|||||||
#include "virnetdevbridge.h"
|
#include "virnetdevbridge.h"
|
||||||
#include "virnetdevvportprofile.h"
|
#include "virnetdevvportprofile.h"
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_QEMU
|
#define VIR_FROM_THIS VIR_FROM_QEMU
|
||||||
|
|
||||||
VIR_LOG_INIT("qemu.qemu_interface");
|
VIR_LOG_INIT("qemu.qemu_interface");
|
||||||
@ -500,3 +503,97 @@ qemuInterfaceBridgeConnect(virDomainDefPtr def,
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qemuInterfaceOpenVhostNet:
|
||||||
|
* @def: domain definition
|
||||||
|
* @net: network definition
|
||||||
|
* @qemuCaps: qemu binary capabilities
|
||||||
|
* @vhostfd: array of opened vhost-net device
|
||||||
|
* @vhostfdSize: number of file descriptors in @vhostfd array
|
||||||
|
*
|
||||||
|
* Open vhost-net, multiple times - if requested.
|
||||||
|
* In case, no vhost-net is needed, @vhostfdSize is set to 0
|
||||||
|
* and 0 is returned.
|
||||||
|
*
|
||||||
|
* Returns: 0 on success
|
||||||
|
* -1 on failure
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
qemuInterfaceOpenVhostNet(virDomainDefPtr def,
|
||||||
|
virDomainNetDefPtr net,
|
||||||
|
virQEMUCapsPtr qemuCaps,
|
||||||
|
int *vhostfd,
|
||||||
|
size_t *vhostfdSize)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
const char *vhostnet_path = net->backend.vhost;
|
||||||
|
|
||||||
|
if (!vhostnet_path)
|
||||||
|
vhostnet_path = "/dev/vhost-net";
|
||||||
|
|
||||||
|
/* If running a plain QEMU guest, or
|
||||||
|
* if the config says explicitly to not use vhost, return now*/
|
||||||
|
if (def->virtType != VIR_DOMAIN_VIRT_KVM ||
|
||||||
|
net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_QEMU) {
|
||||||
|
*vhostfdSize = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If qemu doesn't support vhost-net mode (including the -netdev command
|
||||||
|
* option), don't try to open the device.
|
||||||
|
*/
|
||||||
|
if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOST_NET) &&
|
||||||
|
qemuDomainSupportsNetdev(def, qemuCaps, net))) {
|
||||||
|
if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
"%s", _("vhost-net is not supported with "
|
||||||
|
"this QEMU binary"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
*vhostfdSize = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the nic model isn't virtio, don't try to open. */
|
||||||
|
if (!(net->model && STREQ(net->model, "virtio"))) {
|
||||||
|
if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
"%s", _("vhost-net is only supported for "
|
||||||
|
"virtio network interfaces"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
*vhostfdSize = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < *vhostfdSize; i++) {
|
||||||
|
vhostfd[i] = open(vhostnet_path, O_RDWR);
|
||||||
|
|
||||||
|
/* If the config says explicitly to use vhost and we couldn't open it,
|
||||||
|
* report an error.
|
||||||
|
*/
|
||||||
|
if (vhostfd[i] < 0) {
|
||||||
|
virDomainAuditNetDevice(def, net, vhostnet_path, false);
|
||||||
|
if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
"%s", _("vhost-net was requested for an interface, "
|
||||||
|
"but is unavailable"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
VIR_WARN("Unable to open vhost-net. Opened so far %zu, requested %zu",
|
||||||
|
i, *vhostfdSize);
|
||||||
|
*vhostfdSize = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
virDomainAuditNetDevice(def, net, vhostnet_path, *vhostfdSize);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
while (i--)
|
||||||
|
VIR_FORCE_CLOSE(vhostfd[i]);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
# include "domain_conf.h"
|
# include "domain_conf.h"
|
||||||
# include "qemu_conf.h"
|
# include "qemu_conf.h"
|
||||||
|
# include "qemu_domain.h"
|
||||||
|
|
||||||
int qemuInterfaceStartDevice(virDomainNetDefPtr net);
|
int qemuInterfaceStartDevice(virDomainNetDefPtr net);
|
||||||
int qemuInterfaceStartDevices(virDomainDefPtr def);
|
int qemuInterfaceStartDevices(virDomainDefPtr def);
|
||||||
@ -46,4 +47,10 @@ int qemuInterfaceBridgeConnect(virDomainDefPtr def,
|
|||||||
int *tapfd,
|
int *tapfd,
|
||||||
size_t *tapfdSize)
|
size_t *tapfdSize)
|
||||||
ATTRIBUTE_NONNULL(2);
|
ATTRIBUTE_NONNULL(2);
|
||||||
|
|
||||||
|
int qemuInterfaceOpenVhostNet(virDomainDefPtr def,
|
||||||
|
virDomainNetDefPtr net,
|
||||||
|
virQEMUCapsPtr qemuCaps,
|
||||||
|
int *vhostfd,
|
||||||
|
size_t *vhostfdSize);
|
||||||
#endif /* __QEMU_INTERFACE_H__ */
|
#endif /* __QEMU_INTERFACE_H__ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user