[libvirt] [PATCH 4/4] qemu: Implement mtu on interface

Michal Privoznik mprivozn at redhat.com
Thu Jan 26 11:28:01 UTC 2017


On 01/25/2017 04:16 PM, Laine Stump wrote:
> On 01/24/2017 10:40 AM, Michal Privoznik wrote:
>> Not only we should set the MTU on the host end of the device but
>> also let qemu know what MTU did we set.
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>>   src/qemu/qemu_capabilities.c                       |  2 +
>>   src/qemu/qemu_capabilities.h                       |  1 +
>>   src/qemu/qemu_command.c                            | 14 +++++
>>   src/qemu/qemu_domain.c                             |  7 ++-
>>   .../qemuxml2xmloutdata/qemuxml2xmlout-net-mtu.xml  | 68
>> ++++++++++++++++++++++
>>   tests/qemuxml2xmltest.c                            |  1 +
> 
> You added the test case for xml2xml in this patch, when it should have
> been added in the previous patch, and you didn't add the test case to
> qemuxml2argv.
> 

Well, that's because we don't have a mock network driver for our qemu
tests. Also, another problem is we do a resource allocation while
building the command line. Had we a better separation, adding
qemuxml2argv test case would be much simpler (and there would be no
excuse for not doing so).

>>   6 files changed, 90 insertions(+), 3 deletions(-)
>>   create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-net-mtu.xml
>>
>> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
>> index 1e1b53b22..3247d2567 100644
>> --- a/src/qemu/qemu_capabilities.c
>> +++ b/src/qemu/qemu_capabilities.c
>> @@ -356,6 +356,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
>>                 "drive-iotune-group",
>>                   "query-cpu-model-expansion", /* 245 */
>> +              "virtio-net.host_mtu",
>>       );
>>     @@ -1642,6 +1643,7 @@ static struct virQEMUCapsStringFlags
>> virQEMUCapsObjectPropsVirtioNet[] = {
>>       { "tx", QEMU_CAPS_VIRTIO_TX_ALG },
>>       { "event_idx", QEMU_CAPS_VIRTIO_NET_EVENT_IDX },
>>       { "rx_queue_size", QEMU_CAPS_VIRTIO_NET_RX_QUEUE_SIZE },
>> +    { "host_mtu", QEMU_CAPS_VIRTIO_NET_HOST_MTU },
> 
> I think if the enum says "VIRTIO_NET_HOST_MTU" then the string should be
> virtio_net_host_mtu, to eliminate possible ambiguity just in case a
> later version of qemu adds the host_mtu option to, e.g. the e1000e
> driver or something.

The string, our string that will be under <qemuCaps/> does say
virtio-net.host_mtu. See the chunk above. This is how qemu named its
parameter on the cmd line.

> 
>>   };
>>     static struct virQEMUCapsStringFlags
>> virQEMUCapsObjectPropsVirtioSCSI[] = {
>> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
>> index b5ad95e46..95bb67d44 100644
>> --- a/src/qemu/qemu_capabilities.h
>> +++ b/src/qemu/qemu_capabilities.h
>> @@ -392,6 +392,7 @@ typedef enum {
>>         /* 245 */
>>       QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION, /* qmp
>> query-cpu-model-expansion */
>> +    QEMU_CAPS_VIRTIO_NET_HOST_MTU, /* virtio-net-*.host_mtu */
>>         QEMU_CAPS_LAST /* this must always be the last item */
>>   } virQEMUCapsFlags;
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>> index d459f8e3e..6d6587235 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -3678,6 +3678,16 @@ qemuBuildNicDevStr(virDomainDefPtr def,
>>           }
>>           virBufferAsprintf(&buf, ",rx_queue_size=%u",
>> net->driver.virtio.rx_queue_size);
>>       }
>> +
>> +    if (usingVirtio && net->mtu) {
>> +        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_HOST_MTU)) {
>> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> +                           _("setting MTU is not supported with this
>> QEMU binary"));
>> +            goto error;
>> +        }
>> +        virBufferAsprintf(&buf, ",host_mtu=%u", net->mtu);
>> +    }
>> +
>>       if (vlan == -1)
>>           virBufferAsprintf(&buf, ",netdev=host%s", net->info.alias);
>>       else
>> @@ -8251,6 +8261,10 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr
>> driver,
>>           }
>>       }
>>   +    if (net->mtu &&
>> +        virNetDevSetMTU(net->ifname, net->mtu) < 0)
>> +        goto cleanup;
>> +
>>       if ((actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
>>            actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
>>            actualType == VIR_DOMAIN_NET_TYPE_ETHERNET ||
>> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>> index 26ca89930..c6ce09021 100644
>> --- a/src/qemu/qemu_domain.c
>> +++ b/src/qemu/qemu_domain.c
>> @@ -6541,14 +6541,15 @@ bool
>>   qemuDomainNetSupportsMTU(virDomainNetType type)
>>   {
>>       switch (type) {
>> -    case VIR_DOMAIN_NET_TYPE_USER:
>> +    case VIR_DOMAIN_NET_TYPE_NETWORK:
>> +    case VIR_DOMAIN_NET_TYPE_BRIDGE:
>>       case VIR_DOMAIN_NET_TYPE_ETHERNET:
>>       case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
>> +        return true;
>> +    case VIR_DOMAIN_NET_TYPE_USER:
> 
> Hmm. Maybe this function was causing a validation failure when you tried
> to add the xml2xml test in the previous patch. So I guess it's okay to
> not add the xml2xml test until this patch (my preference would be to not
> add the extra validation until this patch, so that the previous one
> could have useful testing as a part of the same patch, but I suppose the
> end result is the same)

Yes. My reasoning when adding XML that looks untested in the previous
patch was that in fact it is being tested. By our virschematest - so at
least the RNG is tested.

> 
> 
> Also, you didn't update news.xml :-) (either in this patch or the
> previous patch)

Ah, very good point.

> 
> ACK with the test added to xml2argv and the capabilities string changed
> to be more specific.
> 

Fixed the news.xml and pushed.

Thank you




More information about the libvir-list mailing list