[libvirt] [PATCH v2] network: Add network bandwidth support for ethernet interfaces
Anirban Chakraborty
abchak at juniper.net
Mon Oct 6 20:11:59 UTC 2014
On 10/6/14, 11:16 AM, "Laine Stump" <laine at laine.org> wrote:
>On 10/06/2014 02:07 AM, Martin Kletzander wrote:
>> On Fri, Sep 26, 2014 at 10:52:57AM -0700, Anirban Chakraborty wrote:
>>> V2:
>>> Addressed comments raised in review of V1.
>>> Consolidate calls to virNetDevBandwidthSet.
>>> Clear bandwidth settings when the interface is detached or domain
>>> destroyed.
>>>
>>> V1:
>>> Ethernet interfaces in libvirt currently do not support bandwidth
>>> setting.
>>> For example, following xml file for an interface will not apply these
>>> settings to corresponding qdiscs.
>>>
>>> <interface type="ethernet">
>>> <mac address="02:36:1d:18:2a:e4"/>
>>> <model type="virtio"/>
>>> <script path=""/>
>>> <target dev="tap361d182a-e4"/>
>>> <bandwidth>
>>> <inbound average="984" peak="1024" burst="64"/>
>>> <outbound average="2000" peak="2048" burst="128"/>
>>> </bandwidth>
>>> </interface>
>>>
>>> Signed-off-by: Anirban Chakraborty <abchak at juniper.net>
>>>
>>> ---
>>> src/lxc/lxc_process.c | 26 +++++++++++++-------------
>>> src/network/bridge_driver.c | 7 ++++---
>>> src/qemu/qemu_command.c | 9 ++++-----
>>> src/qemu/qemu_driver.c | 22 +++++++++++++++++++++-
>>> src/qemu/qemu_hotplug.c | 14 +++++++++++++-
>>> src/util/virnetdevbandwidth.c | 23 ++++++++++++++++++++---
>>> src/util/virnetdevbandwidth.h | 7 ++++---
>>> src/util/virnetdevmacvlan.c | 10 ----------
>>> src/util/virnetdevmacvlan.h | 1 -
>>> tests/virnetdevbandwidthtest.c | 3 ++-
>>> 10 files changed, 81 insertions(+), 41 deletions(-)
>>>
>>> diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
>>> index ed30c37..7f7e4ad 100644
>>> --- a/src/lxc/lxc_process.c
>>> +++ b/src/lxc/lxc_process.c
>>> @@ -300,6 +295,7 @@ char
>>> *virLXCProcessSetupInterfaceDirect(virConnectPtr conn,
>>> virNetDevBandwidthPtr bw;
>>> virNetDevVPortProfilePtr prof;
>>> virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver);
>>> + const char *linkdev = virDomainNetGetActualDirectDev(net);
>>>
>>> /* XXX how todo bandwidth controls ?
>>> * Since the 'net-ifname' is about to be moved to a different
>>> @@ -329,16 +325,15 @@ char
>>> *virLXCProcessSetupInterfaceDirect(virConnectPtr conn,
>>>
>>> if (virNetDevMacVLanCreateWithVPortProfile(
>>> net->ifname, &net->mac,
>>> - virDomainNetGetActualDirectDev(net),
>>> + linkdev,
>>> virDomainNetGetActualDirectMode(net),
>>> false, def->uuid,
>>> - virDomainNetGetActualVirtPortProfile(net),
>>> + prof,
>>> &res_ifname,
>>> VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
>>> cfg->stateDir,
>>> - virDomainNetGetActualBandwidth(net), 0) < 0)
>>> + 0) < 0)
>>> goto cleanup;
>>> -
>>> ret = res_ifname;
>>>
>>> cleanup:
>>> @@ -368,6 +363,7 @@ static int
>>> virLXCProcessSetupInterfaces(virConnectPtr conn,
>>> int ret = -1;
>>> size_t i;
>>> size_t niface = 0;
>>> + int actualType;
>>>
>>> for (i = 0; i < def->nnets; i++) {
>>> char *veth = NULL;
>>> @@ -381,7 +377,8 @@ static int
>>> virLXCProcessSetupInterfaces(virConnectPtr conn,
>>> if (VIR_EXPAND_N(*veths, *nveths, 1) < 0)
>>> goto cleanup;
>>>
>>> - switch (virDomainNetGetActualType(def->nets[i])) {
>>> + actualType = virDomainNetGetActualType(def->nets[i]);
>>> + switch (actualType) {
>>> case VIR_DOMAIN_NET_TYPE_NETWORK: {
>>> virNetworkPtr network;
>>> char *brname = NULL;
>>> @@ -444,11 +441,14 @@ static int
>>> virLXCProcessSetupInterfaces(virConnectPtr conn,
>>> case VIR_DOMAIN_NET_TYPE_LAST:
>>> virReportError(VIR_ERR_INTERNAL_ERROR,
>>> _("Unsupported network type %s"),
>>> - virDomainNetTypeToString(
>>> - virDomainNetGetActualType(def->nets[i])
>>> - ));
>>> + virDomainNetTypeToString(actualType));
>>> goto cleanup;
>>> }
>>
>> Hunks like these (that do not have any functional impact) could be
>> separated to ease the review.
>
>I second that - sometimes I spend time trying to figure out why a change
>was needed, and when I don't find a reason I assume that I must be
>confused about something...
I¹ll break up the patch into two pieces (one for the refactoring part and
the other to add the support to ethernet type interfaces), which should
ease out these things.
>
>>
>>
>>> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
>>> index 979fb13..2e1f821 100644
>>> --- a/src/network/bridge_driver.c
>>> +++ b/src/network/bridge_driver.c
>>> @@ -2090,7 +2091,7 @@
>>> networkStartNetworkVirtual(virNetworkDriverStatePtr driver,
>>> return 0;
>>>
>>> err5:
>>> - virNetDevBandwidthClear(network->def->bridge);
>>> + virNetDevBandwidthClear(network->def->bridge,
>>> VIR_DOMAIN_NET_TYPE_BRIDGE);
>>
>> You could change the virNetDevBandwidthClear() function to take the
>> device definition as an argument and you wouldn't have to supply
>> additional information for that device.
>
>Actually you can't do that, because functions in the util directory
>cannot #include anything from the conf directory.
>
>For that matter, even what you've done here (using
>VIR_DOMAIN_NET_TYPE_*) is illegal, for the same reason. It looks like
>you're only using the type to decide if you want to return early. Going
>quickly through the places where virNetDevBandwidth(Set|Clear) are
>called, I think in most cases you wouldn't even get there if you didn't
>have the right kind of interface, so you can likely just add in the
>check in the couple of places where it is ambiguous.
Ok, will do that. Thanks for pointing it out.
>
>BTW, I notice that you're allowing setting of bandwidth for macvtap
>interfaces (VIR_DOMAIN_NET_TYPE_DIRECT). This was not originally
>supported by the macvtap code in the kernels, although it has recently
>been added (e.g. it is in Fedora 20, but not in RHEL7.0 or CentOS7.0).
>Was this intentional, or accidental?
It appears to me that the existing code sets bandwidth for
VIR_DOMAIN_NET_TYPE_DIRECT device type. qemuBuildInterfaceCommandLine()
has code to create macvtap device (qemuPhysIfaceConnect) for
VIR_DOMAIN_NET_TYPE_DIRECT. Subsequently, qemuPhysIfaceConnect() calls
virNetDevMacVLanCreateWithVPortProfile(), which calls
virNetDevBandwidthSet() to set the bandwidth.
Anirban
More information about the libvir-list
mailing list