Hi @sil2100, apologies for not providing an intuitive Impact field. I
have updated it and hope it will be more helpful. Please let me know if
you need more info.

** Description changed:

  [Impact]
  
- See bug description
+ This bug affects users of Openstack Nova who want to create instances
+ that will leverage the realtime functionality that libvirt/qemu offers
+ by, amongst other things, pinning guest vcpus and qemu emulator threads
+ to specific pcpus. Nova provides the means for the user to control, via
+ the flavor hw:cpu_realtime_mask or image property hw_cpu_realtime_mask,
+ which physical cpus these resources will pinned to. This mask allows you
+ to mask the set of N pins that Nova selects such that 1 or more of your
+ vcpus can be declared "real-time" by ensuring that they do not have
+ emulator threads also pinned to them. The remaining "non-realtime" vcpus
+ will have vcpu and emulator threads colocated. The bug fixes the case
+ where e.g. you have a guest that has 2 vcpus (logically 0 and 1) and
+ Nova selects pcpus 14 and 22 and you have mask ^0 to indicate that you
+ want all but the first vcpu to be realtime. This should result in the
+ following being present in your libvirt xml for the guest:
+ 
+   <cputune>
+     <vcpupin vcpu='0' cpuset='14'/>
+     <vcpupin vcpu='1' cpuset='22'/>
+     <emulatorpin cpuset='14'/>
+     <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
+   </cputune>
+ 
+ But (current only Mitaka since it does not have this patch) you will get
+ this:
+ 
+   <cputune>
+     <vcpupin vcpu='0' cpuset='14'/>
+     <vcpupin vcpu='1' cpuset='22'/>
+     <emulatorpin cpuset='0'/>
+     <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
+   </cputune>
+ 
+ i.e. Nova will always set the emulator pin to be id of the vcpu instead
+ of the corresponding pcpu that it is pinned to.
  
  [Test Case]
  
-  * deploy openstack mitaka and configure nova.conf with vcpu-pin-
+  * deploy openstack mitaka and configure nova.conf with vcpu-pin-
  set=0,1,2,3
  
-    https://pastebin.ubuntu.com/25133260/
+    https://pastebin.ubuntu.com/25133260/
  
-  * configure compute host kernel opts with "isolcpus=0,1,2,3" + reboot
+  * configure compute host kernel opts with "isolcpus=0,1,2,3" + reboot
  
-  * create flavor with:
+  * create flavor with:
  
-    openstack flavor create --public --ram 2048 --disk 10 --vcpus 2 --swap 0 
test_flavor
-    openstack flavor set --property hw:cpu_realtime_mask='^0' test_flavor
-    openstack flavor set --property hw:cpu_policy=dedicated test_flavor
-    openstack flavor set --property hw:cpu_thread_policy=prefer test_flavor
-    openstack flavor set --property hw:cpu_realtime=yes test_flavor
+    openstack flavor create --public --ram 2048 --disk 10 --vcpus 2 --swap 0 
test_flavor
+    openstack flavor set --property hw:cpu_realtime_mask='^0' test_flavor
+    openstack flavor set --property hw:cpu_policy=dedicated test_flavor
+    openstack flavor set --property hw:cpu_thread_policy=prefer test_flavor
+    openstack flavor set --property hw:cpu_realtime=yes test_flavor
  
-  * boot instance with ^^ flavor
+  * boot instance with ^^ flavor
  
-  * check that libvirt xml for vm has correct emulator pin cpuset #
+  * check that libvirt xml for vm has correct emulator pin cpuset #
  
  [Regression Potential]
  
  None expected.
- 
  
  ====
  
  Description of problem:
  When using the cpu_realtime and cpu_realtim_mask flag to create new instance, 
the 'cpuset' of 'emulatorpin' option is using the id of vcpu which is 
incorrect. The id of host cpu should be used here.
  
  e.g.
    <cputune>
      <vcpupin vcpu='0' cpuset='2'/>
      <vcpupin vcpu='1' cpuset='3'/>
      <emulatorpin cpuset='0'/>          ### the cpuset should be '2' here, 
when cpu_realtime_mask=^0.
      <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
    </cputune>
  
  How reproducible:
  Boot new instance with cpu_realtime_mask flavor.
  
  Steps to Reproduce:
  1. Create RT flavor
  nova flavor-create m1.small.performance 6 2048 20 2
  nova flavor-key m1.small.performance set hw:cpu_realtime=yes
  nova flavor-key m1.small.performance set hw:cpu_realtime_mask=^0
  nova flavor-key m1.small.performance set hw:cpu_policy=dedicated
  2. Boot a instance with this flavor
  3. Check the xml of the new instance
  
  Actual results:
    <cputune>
      <vcpupin vcpu='0' cpuset='2'/>
      <vcpupin vcpu='1' cpuset='3'/>
      <emulatorpin cpuset='0'/>
      <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
    </cputune>
  
  Expected results:
    <cputune>
      <vcpupin vcpu='0' cpuset='2'/>
      <vcpupin vcpu='1' cpuset='3'/>
      <emulatorpin cpuset='2'/>
      <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
    </cputune>

** Description changed:

  [Impact]
  
  This bug affects users of Openstack Nova who want to create instances
  that will leverage the realtime functionality that libvirt/qemu offers
  by, amongst other things, pinning guest vcpus and qemu emulator threads
  to specific pcpus. Nova provides the means for the user to control, via
  the flavor hw:cpu_realtime_mask or image property hw_cpu_realtime_mask,
  which physical cpus these resources will pinned to. This mask allows you
  to mask the set of N pins that Nova selects such that 1 or more of your
  vcpus can be declared "real-time" by ensuring that they do not have
  emulator threads also pinned to them. The remaining "non-realtime" vcpus
  will have vcpu and emulator threads colocated. The bug fixes the case
  where e.g. you have a guest that has 2 vcpus (logically 0 and 1) and
  Nova selects pcpus 14 and 22 and you have mask ^0 to indicate that you
  want all but the first vcpu to be realtime. This should result in the
  following being present in your libvirt xml for the guest:
  
-   <cputune>
-     <vcpupin vcpu='0' cpuset='14'/>
-     <vcpupin vcpu='1' cpuset='22'/>
-     <emulatorpin cpuset='14'/>
-     <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
-   </cputune>
+   <cputune>
+     <vcpupin vcpu='0' cpuset='14'/>
+     <vcpupin vcpu='1' cpuset='22'/>
+     <emulatorpin cpuset='14'/>
+     <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
+   </cputune>
  
  But (current only Mitaka since it does not have this patch) you will get
  this:
  
-   <cputune>
-     <vcpupin vcpu='0' cpuset='14'/>
-     <vcpupin vcpu='1' cpuset='22'/>
-     <emulatorpin cpuset='0'/>
-     <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
-   </cputune>
+   <cputune>
+     <vcpupin vcpu='0' cpuset='14'/>
+     <vcpupin vcpu='1' cpuset='22'/>
+     <emulatorpin cpuset='0'/>
+     <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
+   </cputune>
  
  i.e. Nova will always set the emulator pin to be id of the vcpu instead
  of the corresponding pcpu that it is pinned to.
+ 
+ In terms of actual impact this could result in vcpus that are supposed
+ to be isolated not being so and therefore not behaving as expected.
  
  [Test Case]
  
   * deploy openstack mitaka and configure nova.conf with vcpu-pin-
  set=0,1,2,3
  
     https://pastebin.ubuntu.com/25133260/
  
   * configure compute host kernel opts with "isolcpus=0,1,2,3" + reboot
  
   * create flavor with:
  
     openstack flavor create --public --ram 2048 --disk 10 --vcpus 2 --swap 0 
test_flavor
     openstack flavor set --property hw:cpu_realtime_mask='^0' test_flavor
     openstack flavor set --property hw:cpu_policy=dedicated test_flavor
     openstack flavor set --property hw:cpu_thread_policy=prefer test_flavor
     openstack flavor set --property hw:cpu_realtime=yes test_flavor
  
   * boot instance with ^^ flavor
  
   * check that libvirt xml for vm has correct emulator pin cpuset #
  
  [Regression Potential]
  
  None expected.
  
  ====
  
  Description of problem:
  When using the cpu_realtime and cpu_realtim_mask flag to create new instance, 
the 'cpuset' of 'emulatorpin' option is using the id of vcpu which is 
incorrect. The id of host cpu should be used here.
  
  e.g.
    <cputune>
      <vcpupin vcpu='0' cpuset='2'/>
      <vcpupin vcpu='1' cpuset='3'/>
      <emulatorpin cpuset='0'/>          ### the cpuset should be '2' here, 
when cpu_realtime_mask=^0.
      <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
    </cputune>
  
  How reproducible:
  Boot new instance with cpu_realtime_mask flavor.
  
  Steps to Reproduce:
  1. Create RT flavor
  nova flavor-create m1.small.performance 6 2048 20 2
  nova flavor-key m1.small.performance set hw:cpu_realtime=yes
  nova flavor-key m1.small.performance set hw:cpu_realtime_mask=^0
  nova flavor-key m1.small.performance set hw:cpu_policy=dedicated
  2. Boot a instance with this flavor
  3. Check the xml of the new instance
  
  Actual results:
    <cputune>
      <vcpupin vcpu='0' cpuset='2'/>
      <vcpupin vcpu='1' cpuset='3'/>
      <emulatorpin cpuset='0'/>
      <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
    </cputune>
  
  Expected results:
    <cputune>
      <vcpupin vcpu='0' cpuset='2'/>
      <vcpupin vcpu='1' cpuset='3'/>
      <emulatorpin cpuset='2'/>
      <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
    </cputune>

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1614054

Title:
  [SRU] Incorrect host cpu is given to emulator threads when
  cpu_realtime_mask flag is set

To manage notifications about this bug go to:
https://bugs.launchpad.net/cloud-archive/+bug/1614054/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to