[libvirt] [PATCH] [PATCH] vcpupin: add clear feature

Yi Wang posted 1 patch 6 years, 3 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/1515062792-16289-1-git-send-email-wang.yi59@zte.com.cn
There is a newer version of this series
include/libvirt/libvirt-domain.h |  1 +
src/qemu/qemu_driver.c           | 24 +++++++++++++++++++-----
tools/virsh-domain.c             |  5 ++++-
tools/virsh.pod                  |  1 +
4 files changed, 25 insertions(+), 6 deletions(-)
[libvirt] [PATCH] [PATCH] vcpupin: add clear feature
Posted by Yi Wang 6 years, 3 months ago
We can't clear vcpupin settings of XML once we did vcpupin
command, this is not convenient under some condition such
as migration.

This patch introduces clear feature, which can clear vcpuin
setting of XML.

Signed-off-by: Yi Wang <wang.yi59@zte.com.cn>
Signed-off-by: Xi Xu <xu.xi8@zte.com.cn>
---
 include/libvirt/libvirt-domain.h |  1 +
 src/qemu/qemu_driver.c           | 24 +++++++++++++++++++-----
 tools/virsh-domain.c             |  5 ++++-
 tools/virsh.pod                  |  1 +
 4 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 4048acf..7b171df 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -1837,6 +1837,7 @@ typedef enum {
     VIR_DOMAIN_VCPU_MAXIMUM = (1 << 2), /* Max rather than current count */
     VIR_DOMAIN_VCPU_GUEST   = (1 << 3), /* Modify state of the cpu in the guest */
     VIR_DOMAIN_VCPU_HOTPLUGGABLE = (1 << 4), /* Make vcpus added hot(un)pluggable */
+    VIR_DOMAIN_VCPU_CLEAR = (1 << 5), /* Clear vcpus pin info */
 } virDomainVcpuFlags;
 
 int                     virDomainSetVcpus       (virDomainPtr domain,
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 97b194b..9e8759f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -5001,7 +5001,7 @@ qemuDomainPinVcpuLive(virDomainObjPtr vm,
                       int vcpu,
                       virQEMUDriverPtr driver,
                       virQEMUDriverConfigPtr cfg,
-                      virBitmapPtr cpumap)
+                      virBitmapPtr cpumap, bool clear)
 {
     virBitmapPtr tmpmap = NULL;
     virDomainVcpuDefPtr vcpuinfo;
@@ -5049,7 +5049,12 @@ qemuDomainPinVcpuLive(virDomainObjPtr vm,
     }
 
     virBitmapFree(vcpuinfo->cpumask);
-    vcpuinfo->cpumask = tmpmap;
+    if (clear) {
+        virBitmapFree(tmpmap);
+        vcpuinfo->cpumask = NULL;
+    } else {
+        vcpuinfo->cpumask = tmpmap;
+    }
     tmpmap = NULL;
 
     if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
@@ -5093,9 +5098,11 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
     virBitmapPtr pcpumap = NULL;
     virDomainVcpuDefPtr vcpuinfo = NULL;
     virQEMUDriverConfigPtr cfg = NULL;
+    bool clear = false;
 
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
-                  VIR_DOMAIN_AFFECT_CONFIG, -1);
+                  VIR_DOMAIN_AFFECT_CONFIG |
+                  VIR_DOMAIN_VCPU_CLEAR, -1);
 
     cfg = virQEMUDriverGetConfig(driver);
 
@@ -5111,6 +5118,8 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
     if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0)
         goto endjob;
 
+    clear = !!(flags & VIR_DOMAIN_VCPU_CLEAR);
+
     if ((def && def->virtType == VIR_DOMAIN_VIRT_QEMU) ||
         (persistentDef && persistentDef->virtType == VIR_DOMAIN_VIRT_QEMU)) {
         virReportError(VIR_ERR_OPERATION_FAILED, "%s",
@@ -5136,12 +5145,17 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
     }
 
     if (def &&
-        qemuDomainPinVcpuLive(vm, def, vcpu, driver, cfg, pcpumap) < 0)
+        qemuDomainPinVcpuLive(vm, def, vcpu, driver, cfg, pcpumap, clear) < 0)
         goto endjob;
 
     if (persistentDef) {
         virBitmapFree(vcpuinfo->cpumask);
-        vcpuinfo->cpumask = pcpumap;
+        if (clear) {
+            virBitmapFree(pcpumap);
+            vcpuinfo->cpumask = NULL;
+        } else {
+            vcpuinfo->cpumask = pcpumap;
+        }
         pcpumap = NULL;
 
         ret = virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef);
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 93cb020..4bad9e7 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -6860,7 +6860,7 @@ virshParseCPUList(vshControl *ctl, int *cpumaplen,
     unsigned char *cpumap = NULL;
     virBitmapPtr map = NULL;
 
-    if (cpulist[0] == 'r') {
+    if (cpulist[0] == 'r' || STREQ("clear", cpulist)) {
         if (!(map = virBitmapNew(maxcpu)))
             return NULL;
         virBitmapSetAll(map);
@@ -6938,6 +6938,9 @@ cmdVcpuPin(vshControl *ctl, const vshCmd *cmd)
         goto cleanup;
     }
 
+    if (STREQ(cpulist, "clear"))
+        flags |= VIR_DOMAIN_VCPU_CLEAR;
+
     /* Pin mode: pinning specified vcpu to specified physical cpus*/
     if (!(cpumap = virshParseCPUList(ctl, &cpumaplen, cpulist, maxcpu)))
         goto cleanup;
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 69cc423..caaa230 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -2857,6 +2857,7 @@ I<cpulist> is a list of physical CPU numbers. Its syntax is a comma
 separated list and a special markup using '-' and '^' (ex. '0-4', '0-3,^2') can
 also be allowed. The '-' denotes the range and the '^' denotes exclusive.
 For pinning the I<vcpu> to all physical cpus specify 'r' as a I<cpulist>.
+For clearing pinning info, specify 'clear' as a I<cpulist>.
 If I<--live> is specified, affect a running guest.
 If I<--config> is specified, affect the next boot of a persistent guest.
 If I<--current> is specified, affect the current guest state.
-- 
1.8.3.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] [PATCH] vcpupin: add clear feature
Posted by Peter Krempa 6 years, 3 months ago
On Thu, Jan 04, 2018 at 05:46:32 -0500, Yi Wang wrote:
> We can't clear vcpupin settings of XML once we did vcpupin
> command, this is not convenient under some condition such
> as migration.
> 
> This patch introduces clear feature, which can clear vcpuin
> setting of XML.
> 
> Signed-off-by: Yi Wang <wang.yi59@zte.com.cn>
> Signed-off-by: Xi Xu <xu.xi8@zte.com.cn>
> ---
>  include/libvirt/libvirt-domain.h |  1 +
>  src/qemu/qemu_driver.c           | 24 +++++++++++++++++++-----
>  tools/virsh-domain.c             |  5 ++++-
>  tools/virsh.pod                  |  1 +
>  4 files changed, 25 insertions(+), 6 deletions(-)
> 
> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index 4048acf..7b171df 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -1837,6 +1837,7 @@ typedef enum {
>      VIR_DOMAIN_VCPU_MAXIMUM = (1 << 2), /* Max rather than current count */
>      VIR_DOMAIN_VCPU_GUEST   = (1 << 3), /* Modify state of the cpu in the guest */
>      VIR_DOMAIN_VCPU_HOTPLUGGABLE = (1 << 4), /* Make vcpus added hot(un)pluggable */
> +    VIR_DOMAIN_VCPU_CLEAR = (1 << 5), /* Clear vcpus pin info */

These are flags for a wrong API, you'll need to introduce new set of
flags for the pinning API.

>  } virDomainVcpuFlags;
>  
>  int                     virDomainSetVcpus       (virDomainPtr domain,
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 97b194b..9e8759f 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -5001,7 +5001,7 @@ qemuDomainPinVcpuLive(virDomainObjPtr vm,
>                        int vcpu,
>                        virQEMUDriverPtr driver,
>                        virQEMUDriverConfigPtr cfg,
> -                      virBitmapPtr cpumap)
> +                      virBitmapPtr cpumap, bool clear)

Please adhere to the coding standards.

>  {
>      virBitmapPtr tmpmap = NULL;
>      virDomainVcpuDefPtr vcpuinfo;
> @@ -5049,7 +5049,12 @@ qemuDomainPinVcpuLive(virDomainObjPtr vm,
>      }
>  
>      virBitmapFree(vcpuinfo->cpumask);
> -    vcpuinfo->cpumask = tmpmap;
> +    if (clear) {
> +        virBitmapFree(tmpmap);
> +        vcpuinfo->cpumask = NULL;
> +    } else {
> +        vcpuinfo->cpumask = tmpmap;
> +    }

This will not work as expected. The API still takes the pinning map into
account when setting the pinning, so setting 'clear' will only remove
the information from the XML but will still apply 'cpumap' as the
desired pinning.

The API should not rely on the fact that the user passes in correct
cpumap in this case. You'll need to add logic which will set the pinning
to the value as if it was omitted in the XML.

>      tmpmap = NULL;
>  
>      if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
> @@ -5093,9 +5098,11 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
>      virBitmapPtr pcpumap = NULL;
>      virDomainVcpuDefPtr vcpuinfo = NULL;
>      virQEMUDriverConfigPtr cfg = NULL;
> +    bool clear = false;
>  
>      virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
> -                  VIR_DOMAIN_AFFECT_CONFIG, -1);
> +                  VIR_DOMAIN_AFFECT_CONFIG |
> +                  VIR_DOMAIN_VCPU_CLEAR, -1);
>  
>      cfg = virQEMUDriverGetConfig(driver);
>  

[...]

> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index 93cb020..4bad9e7 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -6860,7 +6860,7 @@ virshParseCPUList(vshControl *ctl, int *cpumaplen,
>      unsigned char *cpumap = NULL;
>      virBitmapPtr map = NULL;
>  
> -    if (cpulist[0] == 'r') {
> +    if (cpulist[0] == 'r' || STREQ("clear", cpulist)) {
>          if (!(map = virBitmapNew(maxcpu)))
>              return NULL;
>          virBitmapSetAll(map);
> @@ -6938,6 +6938,9 @@ cmdVcpuPin(vshControl *ctl, const vshCmd *cmd)
>          goto cleanup;
>      }
>  
> +    if (STREQ(cpulist, "clear"))
> +        flags |= VIR_DOMAIN_VCPU_CLEAR;
> +
>      /* Pin mode: pinning specified vcpu to specified physical cpus*/
>      if (!(cpumap = virshParseCPUList(ctl, &cpumaplen, cpulist, maxcpu)))
>          goto cleanup;
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index 69cc423..caaa230 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -2857,6 +2857,7 @@ I<cpulist> is a list of physical CPU numbers. Its syntax is a comma
>  separated list and a special markup using '-' and '^' (ex. '0-4', '0-3,^2') can
>  also be allowed. The '-' denotes the range and the '^' denotes exclusive.
>  For pinning the I<vcpu> to all physical cpus specify 'r' as a I<cpulist>.
> +For clearing pinning info, specify 'clear' as a I<cpulist>.

The other special value is 'r' so I think this should also be a single
letter option. Or better a switch by itself.
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt][PATCH] [PATCH] vcpupin: add clear feature
Posted by wang.yi59@zte.com.cn 6 years, 3 months ago
VGhhbmtzIGZvciB5b3VyIHJlcGx5LCBhbmQgSSB3aWxsIHNlbmQgYSBuZXcgdmVyc2lvbiBvZiB0
aGlzCnBhdGNoLgoKPk9uIFRodSwgSmFuIDA0LCAyMDE4IGF0IDA1OjQ2OjMyIC0wNTAwLCBZaSBX
YW5nIHdyb3RlOgo+PiBXZSBjYW4ndCBjbGVhciB2Y3B1cGluIHNldHRpbmdzIG9mIFhNTCBvbmNl
IHdlIGRpZCB2Y3B1cGluCj4+IGNvbW1hbmQsIHRoaXMgaXMgbm90IGNvbnZlbmllbnQgdW5kZXIg
c29tZSBjb25kaXRpb24gc3VjaAo+PiBhcyBtaWdyYXRpb24uCj4+Cj4+IFRoaXMgcGF0Y2ggaW50
cm9kdWNlcyBjbGVhciBmZWF0dXJlLCB3aGljaCBjYW4gY2xlYXIgdmNwdWluCj4+IHNldHRpbmcg
b2YgWE1MLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBZaSBXYW5nIDx3YW5nLnlpNTlAenRlLmNvbS5j
bj4KPj4gU2lnbmVkLW9mZi1ieTogWGkgWHUgPHh1LnhpOEB6dGUuY29tLmNuPgo+PiAtLS0KPj4g
aW5jbHVkZS9saWJ2aXJ0L2xpYnZpcnQtZG9tYWluLmggfCAxICsKPj4gc3JjL3FlbXUvcWVtdV9k
cml2ZXIuYyB8IDI0ICsrKysrKysrKysrKysrKysrKystLS0tLQo+PiB0b29scy92aXJzaC1kb21h
aW4uYyB8IDUgKysrKy0KPj4gdG9vbHMvdmlyc2gucG9kIHwgMSArCj4+IDQgZmlsZXMgY2hhbmdl
ZCwgMjUgaW5zZXJ0aW9ucygrKSwgNiBkZWxldGlvbnMoLSkKPj4KPj4gZGlmZiAtLWdpdCBhL2lu
Y2x1ZGUvbGlidmlydC9saWJ2aXJ0LWRvbWFpbi5oIGIvaW5jbHVkZS9saWJ2aXJ0L2xpYnZpcnQt
ZG9tYWluLmgKPj4gaW5kZXggNDA0OGFjZi4uN2IxNzFkZiAxMDA2NDQKPj4gLS0tIGEvaW5jbHVk
ZS9saWJ2aXJ0L2xpYnZpcnQtZG9tYWluLmgKPj4gKysrIGIvaW5jbHVkZS9saWJ2aXJ0L2xpYnZp
cnQtZG9tYWluLmgKPj4gQEAgLTE4MzcsNiArMTgzNyw3IEBAIHR5cGVkZWYgZW51bSB7Cj4+IFZJ
Ul9ET01BSU5fVkNQVV9NQVhJTVVNID0gKDEgPDwgMiksIC8qIE1heCByYXRoZXIgdGhhbiBjdXJy
ZW50IGNvdW50ICovCj4+IFZJUl9ET01BSU5fVkNQVV9HVUVTVCA9ICgxIDw8IDMpLCAvKiBNb2Rp
Znkgc3RhdGUgb2YgdGhlIGNwdSBpbiB0aGUgZ3Vlc3QgKi8KPj4gVklSX0RPTUFJTl9WQ1BVX0hP
VFBMVUdHQUJMRSA9ICgxIDw8IDQpLCAvKiBNYWtlIHZjcHVzIGFkZGVkIGhvdCh1bilwbHVnZ2Fi
bGUgKi8KPj4gKyBWSVJfRE9NQUlOX1ZDUFVfQ0xFQVIgPSAoMSA8PCA1KSwgLyogQ2xlYXIgdmNw
dXMgcGluIGluZm8gKi8KPgo+VGhlc2UgYXJlIGZsYWdzIGZvciBhIHdyb25nIEFQSSwgeW91J2xs
IG5lZWQgdG8gaW50cm9kdWNlIG5ldyBzZXQgb2YKPmZsYWdzIGZvciB0aGUgcGlubmluZyBBUEku
Cj4KPj4gfSB2aXJEb21haW5WY3B1RmxhZ3M7Cj4+Cj4+IGludCB2aXJEb21haW5TZXRWY3B1cyAo
dmlyRG9tYWluUHRyIGRvbWFpbiwKPj4gZGlmZiAtLWdpdCBhL3NyYy9xZW11L3FlbXVfZHJpdmVy
LmMgYi9zcmMvcWVtdS9xZW11X2RyaXZlci5jCj4+IGluZGV4IDk3YjE5NGIuLjllODc1OWYgMTAw
NjQ0Cj4+IC0tLSBhL3NyYy9xZW11L3FlbXVfZHJpdmVyLmMKPj4gKysrIGIvc3JjL3FlbXUvcWVt
dV9kcml2ZXIuYwo+PiBAQCAtNTAwMSw3ICs1MDAxLDcgQEAgcWVtdURvbWFpblBpblZjcHVMaXZl
KHZpckRvbWFpbk9ialB0ciB2bSwKPj4gaW50IHZjcHUsCj4+IHZpclFFTVVEcml2ZXJQdHIgZHJp
dmVyLAo+PiB2aXJRRU1VRHJpdmVyQ29uZmlnUHRyIGNmZywKPj4gLSB2aXJCaXRtYXBQdHIgY3B1
bWFwKQo+PiArIHZpckJpdG1hcFB0ciBjcHVtYXAsIGJvb2wgY2xlYXIpCj4KPlBsZWFzZSBhZGhl
cmUgdG8gdGhlIGNvZGluZyBzdGFuZGFyZHMuCj4KPj4gewo+PiB2aXJCaXRtYXBQdHIgdG1wbWFw
ID0gTlVMTDsKPj4gdmlyRG9tYWluVmNwdURlZlB0ciB2Y3B1aW5mbzsKPj4gQEAgLTUwNDksNyAr
NTA0OSwxMiBAQCBxZW11RG9tYWluUGluVmNwdUxpdmUodmlyRG9tYWluT2JqUHRyIHZtLAo+PiB9
Cj4+Cj4+IHZpckJpdG1hcEZyZWUodmNwdWluZm8tPmNwdW1hc2spOwo+PiAtIHZjcHVpbmZvLT5j
cHVtYXNrID0gdG1wbWFwOwo+PiArIGlmIChjbGVhcikgewo+PiArIHZpckJpdG1hcEZyZWUodG1w
bWFwKTsKPj4gKyB2Y3B1aW5mby0+Y3B1bWFzayA9IE5VTEw7Cj4+ICsgfSBlbHNlIHsKPj4gKyB2
Y3B1aW5mby0+Y3B1bWFzayA9IHRtcG1hcDsKPj4gKyB9Cj4KPlRoaXMgd2lsbCBub3Qgd29yayBh
cyBleHBlY3RlZC4gVGhlIEFQSSBzdGlsbCB0YWtlcyB0aGUgcGlubmluZyBtYXAgaW50bwo+YWNj
b3VudCB3aGVuIHNldHRpbmcgdGhlIHBpbm5pbmcsIHNvIHNldHRpbmcgJ2NsZWFyJyB3aWxsIG9u
bHkgcmVtb3ZlCj50aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgWE1MIGJ1dCB3aWxsIHN0aWxsIGFw
cGx5ICdjcHVtYXAnIGFzIHRoZQo+ZGVzaXJlZCBwaW5uaW5nLgo+Cj5UaGUgQVBJIHNob3VsZCBu
b3QgcmVseSBvbiB0aGUgZmFjdCB0aGF0IHRoZSB1c2VyIHBhc3NlcyBpbiBjb3JyZWN0Cj5jcHVt
YXAgaW4gdGhpcyBjYXNlLiBZb3UnbGwgbmVlZCB0byBhZGQgbG9naWMgd2hpY2ggd2lsbCBzZXQg
dGhlIHBpbm5pbmcKPnRvIHRoZSB2YWx1ZSBhcyBpZiBpdCB3YXMgb21pdHRlZCBpbiB0aGUgWE1M
Lgo+Cj4+IHRtcG1hcCA9IE5VTEw7Cj4+Cj4+IGlmICh2aXJEb21haW5TYXZlU3RhdHVzKGRyaXZl
ci0+eG1sb3B0LCBjZmctPnN0YXRlRGlyLCB2bSwgZHJpdmVyLT5jYXBzKSA8IDApCj4+IEBAIC01
MDkzLDkgKzUwOTgsMTEgQEAgcWVtdURvbWFpblBpblZjcHVGbGFncyh2aXJEb21haW5QdHIgZG9t
LAo+PiB2aXJCaXRtYXBQdHIgcGNwdW1hcCA9IE5VTEw7Cj4+IHZpckRvbWFpblZjcHVEZWZQdHIg
dmNwdWluZm8gPSBOVUxMOwo+PiB2aXJRRU1VRHJpdmVyQ29uZmlnUHRyIGNmZyA9IE5VTEw7Cj4+
ICsgYm9vbCBjbGVhciA9IGZhbHNlOwo+Pgo+PiB2aXJDaGVja0ZsYWdzKFZJUl9ET01BSU5fQUZG
RUNUX0xJVkUgfAo+PiAtIFZJUl9ET01BSU5fQUZGRUNUX0NPTkZJRywgLTEpOwo+PiArIFZJUl9E
T01BSU5fQUZGRUNUX0NPTkZJRyB8Cj4+ICsgVklSX0RPTUFJTl9WQ1BVX0NMRUFSLCAtMSk7Cj4+
Cj4+IGNmZyA9IHZpclFFTVVEcml2ZXJHZXRDb25maWcoZHJpdmVyKTsKPj4KPgo+Wy4uLl0KPgo+
PiBkaWZmIC0tZ2l0IGEvdG9vbHMvdmlyc2gtZG9tYWluLmMgYi90b29scy92aXJzaC1kb21haW4u
Ywo+PiBpbmRleCA5M2NiMDIwLi40YmFkOWU3IDEwMDY0NAo+PiAtLS0gYS90b29scy92aXJzaC1k
b21haW4uYwo+PiArKysgYi90b29scy92aXJzaC1kb21haW4uYwo+PiBAQCAtNjg2MCw3ICs2ODYw
LDcgQEAgdmlyc2hQYXJzZUNQVUxpc3QodnNoQ29udHJvbCAqY3RsLCBpbnQgKmNwdW1hcGxlbiwK
Pj4gdW5zaWduZWQgY2hhciAqY3B1bWFwID0gTlVMTDsKPj4gdmlyQml0bWFwUHRyIG1hcCA9IE5V
TEw7Cj4+Cj4+IC0gaWYgKGNwdWxpc3RbMF0gPT0gJ3InKSB7Cj4+ICsgaWYgKGNwdWxpc3RbMF0g
PT0gJ3InIHx8IFNUUkVRKCJjbGVhciIsIGNwdWxpc3QpKSB7Cj4+IGlmICghKG1hcCA9IHZpckJp
dG1hcE5ldyhtYXhjcHUpKSkKPj4gcmV0dXJuIE5VTEw7Cj4+IHZpckJpdG1hcFNldEFsbChtYXAp
Owo+PiBAQCAtNjkzOCw2ICs2OTM4LDkgQEAgY21kVmNwdVBpbih2c2hDb250cm9sICpjdGwsIGNv
bnN0IHZzaENtZCAqY21kKQo+PiBnb3RvIGNsZWFudXA7Cj4+IH0KPj4KPj4gKyBpZiAoU1RSRVEo
Y3B1bGlzdCwgImNsZWFyIikpCj4+ICsgZmxhZ3MgfD0gVklSX0RPTUFJTl9WQ1BVX0NMRUFSOwo+
PiArCj4+IC8qIFBpbiBtb2RlOiBwaW5uaW5nIHNwZWNpZmllZCB2Y3B1IHRvIHNwZWNpZmllZCBw
aHlzaWNhbCBjcHVzKi8KPj4gaWYgKCEoY3B1bWFwID0gdmlyc2hQYXJzZUNQVUxpc3QoY3RsLCAm
Y3B1bWFwbGVuLCBjcHVsaXN0LCBtYXhjcHUpKSkKPj4gZ290byBjbGVhbnVwOwo+PiBkaWZmIC0t
Z2l0IGEvdG9vbHMvdmlyc2gucG9kIGIvdG9vbHMvdmlyc2gucG9kCj4+IGluZGV4IDY5Y2M0MjMu
LmNhYWEyMzAgMTAwNjQ0Cj4+IC0tLSBhL3Rvb2xzL3ZpcnNoLnBvZAo+PiArKysgYi90b29scy92
aXJzaC5wb2QKPj4gQEAgLTI4NTcsNiArMjg1Nyw3IEBAIEk8Y3B1bGlzdD4gaXMgYSBsaXN0IG9m
IHBoeXNpY2FsIENQVSBudW1iZXJzLiBJdHMgc3ludGF4IGlzIGEgY29tbWEKPj4gc2VwYXJhdGVk
IGxpc3QgYW5kIGEgc3BlY2lhbCBtYXJrdXAgdXNpbmcgJy0nIGFuZCAnXicgKGV4LiAnMC00Jywg
JzAtMyxeMicpIGNhbgo+PiBhbHNvIGJlIGFsbG93ZWQuIFRoZSAnLScgZGVub3RlcyB0aGUgcmFu
Z2UgYW5kIHRoZSAnXicgZGVub3RlcyBleGNsdXNpdmUuCj4+IEZvciBwaW5uaW5nIHRoZSBJPHZj
cHU+IHRvIGFsbCBwaHlzaWNhbCBjcHVzIHNwZWNpZnkgJ3InIGFzIGEgSTxjcHVsaXN0Pi4KPj4g
K0ZvciBjbGVhcmluZyBwaW5uaW5nIGluZm8sIHNwZWNpZnkgJ2NsZWFyJyBhcyBhIEk8Y3B1bGlz
dD4uCj4KPlRoZSBvdGhlciBzcGVjaWFsIHZhbHVlIGlzICdyJyBzbyBJIHRoaW5rIHRoaXMgc2hv
dWxkIGFsc28gYmUgYSBzaW5nbGUKPmxldHRlciBvcHRpb24uIE9yIGJldHRlciBhIHN3aXRjaCBi
eSBpdHNlbGYuCgoKLS0tCkJlc3Qgd2lzaGVzCllpIFdhbmc=

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list