[libvirt] [PATCH 2/3] qemu: move runtime netdev validation into a separate function
Laine Stump
laine at redhat.com
Sun Sep 15 21:36:59 UTC 2019
On 9/13/19 4:02 PM, Michal Prívozník wrote:
> On 9/13/19 4:52 PM, Laine Stump wrote:
>> --- a/src/qemu/qemu_domain.c
>> +++ b/src/qemu/qemu_domain.c
>> @@ -5300,6 +5300,86 @@ qemuDomainWatchdogDefValidate(const virDomainWatchdogDef *dev,
>> }
>>
>>
>> +
>
> 3 empty lines instead of 2.
:-O
>
>> +int
>> +qemuDomainValidateActualNetDef(const virDomainNetDef *net,
>> + virQEMUCapsPtr qemuCaps)
>> +{
>> + /*
>> + * Validations that can only be properly checked at runtime (after
>> + * an <interface type='network'> has been resolved to its actual
>> + * type.
>> + *
>> + * (In its current form this function can still be called before
>> + * the actual type has been resolved (e.g. at domain definition
>> + * time), but only if the validations would SUCCEED for
>> + * type='network'.)
>> + */
>> + virDomainNetType actualType = virDomainNetGetActualType(net);
>> +
>> + /* Only tap/macvtap devices support multiqueue. */
>> + if (net->driver.virtio.queues > 1) {
>
> I don't think that this is right. Take VIR_DOMAIN_NET_TYPE_USER for instance. It doesn't allow anything but queues == 0.
Right, I hadn't thought of the other non-tap types.
>
>> +
>> + if (!(actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
>> + actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
>> + actualType == VIR_DOMAIN_NET_TYPE_DIRECT ||
>> + actualType == VIR_DOMAIN_NET_TYPE_ETHERNET ||
>> + actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER)) {
>> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> + _("multiqueue network is not supported for: %s"),
>> + virDomainNetTypeToString(actualType));
>> + return -1;
>> + }
>> +> + if (actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER &&
>
> This is actually where a single queue can be permitred. At least according to the original code.
>
>> + qemuCaps && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOSTUSER_MULTIQUEUE)) {
>
> NULL is never passed to qemuCaps, so no need to check it.
>
>> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> + _("multiqueue network is not supported for vhost-user "
>> + "with this QEMU binary"));
>> + return -1;
>> + }
>> + }
>> +
>> + /*
>> + * Only standard tap devices support nwfilter rules, and even then only
>> + * when *not* connected to an OVS bridge or midonet (indicated by having
>> + * a <virtualport> element in the config)
>> + */
>> + if (net->filter) {
>> + virNetDevVPortProfilePtr vport = virDomainNetGetActualVirtPortProfile(net);
>> + if (!(actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
>> + actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
>> + actualType == VIR_DOMAIN_NET_TYPE_ETHERNET)) {
>> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> + _("filterref is not supported for "
>> + "network interfaces of type %s"),
>> + virDomainNetTypeToString(actualType));
>> + return -1;
>> + }
>> + if (vport && vport->virtPortType != VIR_NETDEV_VPORT_PROFILE_NONE) {
>> + /* currently none of the defined virtualport types support iptables */
>> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> + _("filterref is not supported for "
>> + "network interfaces with virtualport type %s"),
>> + virNetDevVPortTypeToString(vport->virtPortType));
>> + return -1;
>> + }
>> + }
>> +
>> + if (net->backend.tap &&
>> + !(actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
>> + actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
>> + actualType == VIR_DOMAIN_NET_TYPE_ETHERNET)) {
>> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> + _("Custom tap device path is not supported for: %s"),
>> + virDomainNetTypeToString(actualType));
>> + return -1;
>> + }
>> +
>> + return 0;
>> + }
>
> s/^ //
That's strange - I ran make syntax-check multiple times, and it always
finds those...
>
> ACK with this squashed in:
>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index ebbe1a85db..fa0dd888c8 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -5300,7 +5300,6 @@ qemuDomainWatchdogDefValidate(const virDomainWatchdogDef *dev,
> }
>
>
> -
> int
> qemuDomainValidateActualNetDef(const virDomainNetDef *net,
> virQEMUCapsPtr qemuCaps)
> @@ -5318,8 +5317,7 @@ qemuDomainValidateActualNetDef(const virDomainNetDef *net,
> virDomainNetType actualType = virDomainNetGetActualType(net);
>
> /* Only tap/macvtap devices support multiqueue. */
> - if (net->driver.virtio.queues > 1) {
> -
> + if (net->driver.virtio.queues > 0) {
> if (!(actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
> actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
> actualType == VIR_DOMAIN_NET_TYPE_DIRECT ||
> @@ -5331,8 +5329,9 @@ qemuDomainValidateActualNetDef(const virDomainNetDef *net,
> return -1;
> }
>
> - if (actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER &&
> - qemuCaps && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOSTUSER_MULTIQUEUE)) {
> + if (net->driver.virtio.queues > 1 &&
> + actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER &&
> + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOSTUSER_MULTIQUEUE)) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> _("multiqueue network is not supported for vhost-user "
> "with this QEMU binary"));
> @@ -5377,7 +5376,7 @@ qemuDomainValidateActualNetDef(const virDomainNetDef *net,
> }
>
> return 0;
> - }
> +}
That all looks agreeable to me.
Thanks!
More information about the libvir-list
mailing list