This prohibits all clear cpumap eariler in virsh, for both vcpupin
and emulatorpin.
---
 tools/virsh-domain.c | 35 ++++++++++++++++++++++++++++++-----
 1 file changed, 30 insertions(+), 5 deletions(-)

diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 965f92c..8d3d63f 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -5552,6 +5552,20 @@ cleanup:
 }
 
 static bool
+vshIsCpumapAllClear(const unsigned char *cpumap,
+                    int maxcpu)
+{
+    int i;
+
+    for (i = 0; i < maxcpu; i++) {
+        if (VIR_CPU_USED(cpumap, i))
+            return false;
+    }
+
+    return true;
+}
+
+static bool
 cmdVcpuPin(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainInfo info;
@@ -5620,7 +5634,7 @@ cmdVcpuPin(vshControl *ctl, const vshCmd *cmd)
 
     cpumaplen = VIR_CPU_MAPLEN(maxcpu);
 
-    /* Query mode: show CPU affinity information then exit.*/
+    /* Query mode: show CPU affinity information then exit. */
     if (query) {
         /* When query mode and neither "live", "config" nor "current"
          * is specified, set VIR_DOMAIN_AFFECT_CURRENT as flags */
@@ -5649,10 +5663,15 @@ cmdVcpuPin(vshControl *ctl, const vshCmd *cmd)
         goto cleanup;
     }
 
-    /* Pin mode: pinning specified vcpu to specified physical cpus*/
+    /* Pin mode: pinning specified vcpu to specified physical cpus. */
     if (!(cpumap = vshParseCPUList(ctl, cpulist, maxcpu, cpumaplen)))
         goto cleanup;
 
+    if (vshIsCpumapAllClear(cpumap, maxcpu)) {
+        vshError(ctl, "%s", _("No CPU specified"));
+        goto cleanup;
+    }
+
     if (flags == -1) {
         if (virDomainPinVcpu(dom, vcpu, cpumap, cpumaplen) != 0)
             goto cleanup;
@@ -5755,10 +5774,11 @@ cmdEmulatorPin(vshControl *ctl, const vshCmd *cmd)
 
     cpumaplen = VIR_CPU_MAPLEN(maxcpu);
 
-    /* Query mode: show CPU affinity information then exit.*/
+    /* Query mode: show CPU affinity information then exit. */
     if (query) {
         /* When query mode and neither "live", "config" nor "current"
-         * is specified, set VIR_DOMAIN_AFFECT_CURRENT as flags */
+         * is specified, set VIR_DOMAIN_AFFECT_CURRENT as flags.
+         */
         if (flags == -1)
             flags = VIR_DOMAIN_AFFECT_CURRENT;
 
@@ -5775,10 +5795,15 @@ cmdEmulatorPin(vshControl *ctl, const vshCmd *cmd)
         goto cleanup;
     }
 
-    /* Pin mode: pinning emulator threads to specified physical cpus*/
+    /* Pin mode: pinning emulator threads to specified physical cpus. */
     if (!(cpumap = vshParseCPUList(ctl, cpulist, maxcpu, cpumaplen)))
         goto cleanup;
 
+    if (vshIsCpumapAllClear(cpumap, maxcpu)) {
+        vshError(ctl, "%s", _("No CPU is specified"));
+        goto cleanup;
+    }
+
     if (flags == -1)
         flags = VIR_DOMAIN_AFFECT_LIVE;
 
-- 
1.8.1.4

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

Reply via email to