From d7f5c88961b522165b6a10482170047b494102b1 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Sat, 1 Aug 2015 09:48:04 +0200 Subject: [PATCH] virsh: Implement VIR_DOMAIN_BANDWIDTH_IN_FLOOR We have a function parseRateStr() that parses --inbound and --outbound arguments to both attach-interface and domiftune. Now that we have all virTypedParams macros needed for QoS, lets parse even floor attribute. The extended format for the arguments looks like this then: --inbound average[,peak[,burst[,floor]]] Signed-off-by: Michal Privoznik --- tools/virsh-domain.c | 34 ++++++++++++++++++++++++++++------ tools/virsh.pod | 24 +++++++++++++----------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 95a998714b..a957836642 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -873,7 +873,7 @@ static int parseRateStr(vshControl *ctl, char *next; char *saveptr = NULL; enum { - AVERAGE, PEAK, BURST + AVERAGE, PEAK, BURST, FLOOR } state; int ret = -1; @@ -882,7 +882,7 @@ static int parseRateStr(vshControl *ctl, next = vshStrdup(ctl, rateStr); - for (state = AVERAGE; state <= BURST; state++) { + for (state = AVERAGE; state <= FLOOR; state++) { unsigned long long *tmp; const char *field_name; @@ -905,6 +905,11 @@ static int parseRateStr(vshControl *ctl, tmp = &rate->burst; field_name = "burst"; break; + + case FLOOR: + tmp = &rate->floor; + field_name = "floor"; + break; } if (virStrToLong_ullp(token, NULL, 10, tmp) < 0) { @@ -976,8 +981,8 @@ cmdAttachInterface(vshControl *ctl, const vshCmd *cmd) memset(&inbound, 0, sizeof(inbound)); if (parseRateStr(ctl, inboundStr, &inbound) < 0) goto cleanup; - if (inbound.average == 0) { - vshError(ctl, _("inbound average is mandatory")); + if (!inbound.average && !inbound.floor) { + vshError(ctl, _("either inbound average or floor is mandatory")); goto cleanup; } } @@ -989,6 +994,10 @@ cmdAttachInterface(vshControl *ctl, const vshCmd *cmd) vshError(ctl, _("outbound average is mandatory")); goto cleanup; } + if (outbound.floor) { + vshError(ctl, _("outbound floor is unsupported yet")); + goto cleanup; + } } /* Make XML of interface */ @@ -3308,8 +3317,10 @@ cmdDomIftune(vshControl *ctl, const vshCmd *cmd) UINT_MAX); goto cleanup; } - if (inbound.average == 0 && (inbound.burst || inbound.peak)) { - vshError(ctl, _("inbound average is mandatory")); + + if ((!inbound.average && (inbound.burst || inbound.peak)) && + !inbound.floor) { + vshError(ctl, _("either inbound average or floor is mandatory")); goto cleanup; } @@ -3329,6 +3340,12 @@ cmdDomIftune(vshControl *ctl, const vshCmd *cmd) VIR_DOMAIN_BANDWIDTH_IN_BURST, inbound.burst) < 0) goto save_error; + + if (inbound.floor && + virTypedParamsAddUInt(¶ms, &nparams, &maxparams, + VIR_DOMAIN_BANDWIDTH_IN_FLOOR, + inbound.floor) < 0) + goto save_error; } if (outboundStr) { @@ -3345,6 +3362,11 @@ cmdDomIftune(vshControl *ctl, const vshCmd *cmd) goto cleanup; } + if (outbound.floor) { + vshError(ctl, _("outbound floor is unsupported yet")); + goto cleanup; + } + if (virTypedParamsAddUInt(¶ms, &nparams, &maxparams, VIR_DOMAIN_BANDWIDTH_OUT_AVERAGE, outbound.average) < 0) diff --git a/tools/virsh.pod b/tools/virsh.pod index 5ee9a966ef..07e6ba739f 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -770,7 +770,7 @@ I can be the interface's target name or the MAC address. =item B I I [[I<--config>] [I<--live>] | [I<--current>]] -[I<--inbound average,peak,burst>] +[I<--inbound average,peak,burst,floor>] [I<--outbound average,peak,burst>] Set or query the domain's network interface's bandwidth parameters. @@ -779,10 +779,10 @@ or the MAC address. If no I<--inbound> or I<--outbound> is specified, this command will query and show the bandwidth settings. Otherwise, it will set the -inbound or outbound bandwidth. I is the same as -in command I. Values for I and I are -expressed in kilobytes per second, while I is expressed in kilobytes -in a single burst at -I speed as described in the Network XML +inbound or outbound bandwidth. I is the same as +in command I. Values for I, I and I +are expressed in kilobytes per second, while I is expressed in kilobytes +in a single burst at I speed as described in the Network XML documentation at L. To clear inbound or outbound settings, use I<--inbound> or I<--outbound> @@ -2499,7 +2499,7 @@ Likewise, I<--shareable> is an alias for I<--mode shareable>. =item B I I I [[[I<--live>] [I<--config>] | [I<--current>]] | [I<--persistent>]] [I<--target target>] [I<--mac mac>] [I<--script script>] [I<--model model>] -[I<--inbound average,peak,burst>] [I<--outbound average,peak,burst>] +[I<--inbound average,peak,burst,floor>] [I<--outbound average,peak,burst>] Attach a new network interface to the domain. I can be I to indicate connection via a libvirt virtual network, or @@ -2520,11 +2520,13 @@ instead of the default script not in addition to it; --script is valid only for interfaces of type I and only for Xen domains. I specifies the network device model to be presented to the domain. I and I control the bandwidth of the -interface. I and I are optional, so "average,peak", -"average,,burst" and "average" are also legal. Values for I -and I are expressed in kilobytes per second, while I is -expressed in kilobytes in a single burst at -I speed as -described in the Network XML documentation at +interface. At least one from the I, I pair must be +specified. The other two I and I are optional, so +"average,peak", "average,,burst", "average,,,floor", "average" and +",,,floor" are also legal. Values for I, I and I +are expressed in kilobytes per second, while I is expressed in +kilobytes in a single burst at I speed as described in the +Network XML documentation at L. If I<--live> is specified, affect a running domain.