[libvirt] [PATCH] virnetdevbandwidth: Compute quantum value

Michal Privoznik mprivozn at redhat.com
Fri Feb 5 16:14:49 UTC 2016


On 05.02.2016 13:06, Ján Tomko wrote:
> On Tue, Feb 02, 2016 at 05:20:57PM +0100, Michal Privoznik wrote:
>> I've noticed couple of warning in dmesg while debugging
>> something:
>>
>> [ 9683.973754] HTB: quantum of class 10001 is big. Consider r2q change.
>> [ 9683.976460] HTB: quantum of class 10002 is big. Consider r2q change.
>>
>> I've read the HTB documentation and linux kernel code to find out
>> what's wrong.
> 
>> Basically we need to pass another argument to our
> 
> I would rather mention the argument by name here.
> 
>> tc cmd line because the default computed by HTB does not always
>> work in which case the warning message is printed out.
>>
>> You can read more details here:
>>
>> http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm#sharing
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>>  src/util/virnetdevbandwidth.c  | 39 +++++++++++++++++++++++++++++++++++++++
>>  tests/virnetdevbandwidthtest.c |  4 ++--
>>  2 files changed, 41 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/util/virnetdevbandwidth.c b/src/util/virnetdevbandwidth.c
>> index da3a0d3..a74cb1d 100644
>> --- a/src/util/virnetdevbandwidth.c
>> +++ b/src/util/virnetdevbandwidth.c
>> @@ -43,6 +43,36 @@ virNetDevBandwidthFree(virNetDevBandwidthPtr def)
>>      VIR_FREE(def);
>>  }
>>  
>> +static int
>> +virNetDevBandwidthSetOptimalQuantum(virCommandPtr cmd,
> 
> This does not set the quantum, it just adds it to the command line.
> Maybe virNetDevBandwidthCmdAddOptimalQuantum?
> 
>> +                                    const virNetDevBandwidthRate *rate)
>> +{
>> +    const unsigned long long mtu = 1500;
>> +    unsigned long long r2q;
>> +    char *r2q_str;
>> +
>> +    /* When two or more classes compete for unused bandwidth they are each
>> +     * given some number of bytes before serving other competing class. This
>> +     * number is called quantum. It's advised in HTB docs that the number
>> +     * should be equal to MTU. The class quantum is computed from its rate
>> +     * divided by global r2q parameter. However, if rate is too small the
>> +     * default value will not suffice and thus we must provide our own value.
>> +     * */
>> +
>> +    r2q = rate->average * 1024 / 8 / mtu;
>> +    if (!r2q)
>> +        r2q = 1;
>> +
>> +    if (r2q != 10) {
> 
> Is there any harm in adding it to the command line unconditionally?
> 
>> +        if (virAsprintf(&r2q_str, "%llu", r2q) < 0)
>> +            return -1;
> 
> Using virCommandAddArgFormat would remove the need for the temporary
> variable and leave the error checking up to caller's virCommandRun.
> 
>> +        virCommandAddArgList(cmd, "quantum", r2q_str, NULL);
>> +        VIR_FREE(r2q_str);
>> +    }
>> +
>> +    return 0;
>> +}
>> +
>>  /**
>>   * virNetDevBandwidthManipulateFilter:
>>   * @ifname: interface to operate on
> 
> ACK
> 
> Jan
> 


Fixed and pushed. Thanks.

Michal




More information about the libvir-list mailing list