Re: [libvirt] [PATCH v2.1 19/21] qemu: introduce period/quota tuning for emulator

2012-08-22 Thread Daniel Veillard
On Tue, Aug 21, 2012 at 05:18:42PM +0800, Hu Tao wrote:
 This patch introduces support of setting emulator's period and
 quota to limit cpu bandwidth when the vm starts.  Also updates
 XML Schema for new entries and docs.
 ---
  docs/formatdomain.html.in |   24 
  docs/schemas/domaincommon.rng |   10 ++
  src/conf/domain_conf.c|   25 +++--
  src/conf/domain_conf.h|2 ++
  src/qemu/qemu_cgroup.c|   11 ++-
  5 files changed, 69 insertions(+), 3 deletions(-)
 
 diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
 index 81ec2cd..6142f4b 100644
 --- a/docs/formatdomain.html.in
 +++ b/docs/formatdomain.html.in
 @@ -388,6 +388,8 @@
  lt;sharesgt;2048lt;/sharesgt;
  lt;periodgt;100lt;/periodgt;
  lt;quotagt;-1lt;/quotagt;
 +lt;emulator_periodgt;100lt;/periodgt;
 +lt;emulator_quotagt;-1lt;/quotagt;
lt;/cputunegt;
...
  lt;/domaingt;
 @@ -451,6 +453,28 @@
  span class=sinceOnly QEMU driver support since 0.9.4, LXC since
  0.9.10/span
/dd
 +
 +  dtcodeemulator_period/code/dt
 +  dd
 +The optional codeemulator_period/code element specifies the 
 enforcement
 +interval(unit: microseconds). Within codeemulator_period/code, 
 emulator
 +threads(those excluding vcpus) of the domain will not be allowed to 
 consume
 +more than codeemulator_quota/code worth of runtime. The value 
 should be
 +in range [1000, 100]. A period with value 0 means no value.
 +span class=sinceOnly QEMU driver support since 0.10.0/span
 +  /dd
 +  dtcodeemulator_quota/code/dt
 +  dd
 +The optional codeemulator_quota/code element specifies the 
 maximum
 +allowed bandwidth(unit: microseconds) for domain's emulator 
 threads(those
 +excluding vcpus). A domain with codeemulator_quota/code as any 
 negative
 +value indicates that the domain has infinite bandwidth for emulator 
 threads
 +(those excluding vcpus), which means that it is not bandwidth 
 controlled.
 +The value should be in range [1000, 18446744073709551] or less than 
 0. A
 +quota with value 0 means no value.
 +span class=sinceOnly QEMU driver support since 0.10.0/span
 +  /dd
 +
  /dl
  
  
 diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
 index b02ad96..7aa6e47 100644
 --- a/docs/schemas/domaincommon.rng
 +++ b/docs/schemas/domaincommon.rng
 @@ -581,6 +581,16 @@
ref name=cpuquota/
  /element
/optional
 +  optional
 +element name=emulator_period
 +  ref name=cpuperiod/
 +/element
 +  /optional
 +  optional
 +element name=emulator_quota
 +  ref name=cpuquota/
 +/element
 +  /optional
zeroOrMore
  element name=vcpupin
attribute name=vcpu
 diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
 index dab9c5d..7bb07b4 100644
 --- a/src/conf/domain_conf.c
 +++ b/src/conf/domain_conf.c
 @@ -8297,6 +8297,14 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr 
 caps,
   def-cputune.quota)  0)
  def-cputune.quota = 0;
  
 +if (virXPathULongLong(string(./cputune/emulator_period[1]), ctxt,
 +  def-cputune.emulator_period)  0)
 +def-cputune.emulator_period = 0;
 +
 +if (virXPathLongLong(string(./cputune/emulator_quota[1]), ctxt,
 + def-cputune.emulator_quota)  0)
 +def-cputune.emulator_quota = 0;
 +
  if ((n = virXPathNodeSet(./cputune/vcpupin, ctxt, nodes))  0) {
  goto error;
  }
 @@ -13030,7 +13038,8 @@ virDomainDefFormatInternal(virDomainDefPtr def,
  
  if (def-cputune.shares || def-cputune.vcpupin ||
  def-cputune.period || def-cputune.quota ||
 -def-cputune.emulatorpin)
 +def-cputune.emulatorpin ||
 +def-cputune.emulator_period || def-cputune.emulator_quota)
  virBufferAddLit(buf,   cputune\n);
  
  if (def-cputune.shares)
 @@ -13042,6 +13051,17 @@ virDomainDefFormatInternal(virDomainDefPtr def,
  if (def-cputune.quota)
  virBufferAsprintf(buf, quota%lld/quota\n,
def-cputune.quota);
 +
 +if (def-cputune.emulator_period)
 +virBufferAsprintf(buf, emulator_period%llu
 +  /emulator_period\n,
 +  def-cputune.emulator_period);
 +
 +if (def-cputune.emulator_quota)
 +virBufferAsprintf(buf, emulator_quota%lld
 +  /emulator_quota\n,
 +  def-cputune.emulator_quota);
 +
  if (def-cputune.vcpupin) {
  for (i = 0; i  def-cputune.nvcpupin; i++) {
  virBufferAsprintf(buf, vcpupin vcpu='%u' ,
 @@ -13080,7 +13100,8 @@ 

[libvirt] [PATCH v2.1 19/21] qemu: introduce period/quota tuning for emulator

2012-08-21 Thread Hu Tao
This patch introduces support of setting emulator's period and
quota to limit cpu bandwidth when the vm starts.  Also updates
XML Schema for new entries and docs.
---
 docs/formatdomain.html.in |   24 
 docs/schemas/domaincommon.rng |   10 ++
 src/conf/domain_conf.c|   25 +++--
 src/conf/domain_conf.h|2 ++
 src/qemu/qemu_cgroup.c|   11 ++-
 5 files changed, 69 insertions(+), 3 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 81ec2cd..6142f4b 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -388,6 +388,8 @@
 lt;sharesgt;2048lt;/sharesgt;
 lt;periodgt;100lt;/periodgt;
 lt;quotagt;-1lt;/quotagt;
+lt;emulator_periodgt;100lt;/periodgt;
+lt;emulator_quotagt;-1lt;/quotagt;
   lt;/cputunegt;
   ...
 lt;/domaingt;
@@ -451,6 +453,28 @@
 span class=sinceOnly QEMU driver support since 0.9.4, LXC since
 0.9.10/span
   /dd
+
+  dtcodeemulator_period/code/dt
+  dd
+The optional codeemulator_period/code element specifies the 
enforcement
+interval(unit: microseconds). Within codeemulator_period/code, 
emulator
+threads(those excluding vcpus) of the domain will not be allowed to 
consume
+more than codeemulator_quota/code worth of runtime. The value 
should be
+in range [1000, 100]. A period with value 0 means no value.
+span class=sinceOnly QEMU driver support since 0.10.0/span
+  /dd
+  dtcodeemulator_quota/code/dt
+  dd
+The optional codeemulator_quota/code element specifies the maximum
+allowed bandwidth(unit: microseconds) for domain's emulator 
threads(those
+excluding vcpus). A domain with codeemulator_quota/code as any 
negative
+value indicates that the domain has infinite bandwidth for emulator 
threads
+(those excluding vcpus), which means that it is not bandwidth 
controlled.
+The value should be in range [1000, 18446744073709551] or less than 0. 
A
+quota with value 0 means no value.
+span class=sinceOnly QEMU driver support since 0.10.0/span
+  /dd
+
 /dl
 
 
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index b02ad96..7aa6e47 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -581,6 +581,16 @@
   ref name=cpuquota/
 /element
   /optional
+  optional
+element name=emulator_period
+  ref name=cpuperiod/
+/element
+  /optional
+  optional
+element name=emulator_quota
+  ref name=cpuquota/
+/element
+  /optional
   zeroOrMore
 element name=vcpupin
   attribute name=vcpu
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index dab9c5d..7bb07b4 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8297,6 +8297,14 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr 
caps,
  def-cputune.quota)  0)
 def-cputune.quota = 0;
 
+if (virXPathULongLong(string(./cputune/emulator_period[1]), ctxt,
+  def-cputune.emulator_period)  0)
+def-cputune.emulator_period = 0;
+
+if (virXPathLongLong(string(./cputune/emulator_quota[1]), ctxt,
+ def-cputune.emulator_quota)  0)
+def-cputune.emulator_quota = 0;
+
 if ((n = virXPathNodeSet(./cputune/vcpupin, ctxt, nodes))  0) {
 goto error;
 }
@@ -13030,7 +13038,8 @@ virDomainDefFormatInternal(virDomainDefPtr def,
 
 if (def-cputune.shares || def-cputune.vcpupin ||
 def-cputune.period || def-cputune.quota ||
-def-cputune.emulatorpin)
+def-cputune.emulatorpin ||
+def-cputune.emulator_period || def-cputune.emulator_quota)
 virBufferAddLit(buf,   cputune\n);
 
 if (def-cputune.shares)
@@ -13042,6 +13051,17 @@ virDomainDefFormatInternal(virDomainDefPtr def,
 if (def-cputune.quota)
 virBufferAsprintf(buf, quota%lld/quota\n,
   def-cputune.quota);
+
+if (def-cputune.emulator_period)
+virBufferAsprintf(buf, emulator_period%llu
+  /emulator_period\n,
+  def-cputune.emulator_period);
+
+if (def-cputune.emulator_quota)
+virBufferAsprintf(buf, emulator_quota%lld
+  /emulator_quota\n,
+  def-cputune.emulator_quota);
+
 if (def-cputune.vcpupin) {
 for (i = 0; i  def-cputune.nvcpupin; i++) {
 virBufferAsprintf(buf, vcpupin vcpu='%u' ,
@@ -13080,7 +13100,8 @@ virDomainDefFormatInternal(virDomainDefPtr def,
 
 if (def-cputune.shares || def-cputune.vcpupin ||
 def-cputune.period || def-cputune.quota ||
-def-cputune.emulatorpin)
+