[libvirt] [PATCHv10 0/4] Introduce x86 Cache Monitoring Technology (CMT)

Wang, Huaqiang huaqiang.wang at intel.com
Tue Nov 27 13:28:09 UTC 2018


Hi John,

The issue mentioned is generated by a -1 returned by qemuDomainGetIOThreadsMon. 

Further, it is caused by a -1 returned by virQEMUCapsGet:
 6174         if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_IOTHREAD)) {
 6175             virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
 6176                            _("IOThreads not supported with this binary"));
 6177             goto endjob;
 6178         }

By checking qemuCaps->flags, it seems the bit of QEMU_CAPS_OBJECT_IOTHREAD(176) is not set. 
(gdb) call virBitmapFormat(qemuCaps->flags)
$4 = 0x7f08a4004cb0 "13,33,46,50,54-55,58,61-64,66-70,72-73,77-78,80,87-88,92-93,95-97,99,102-110,112,114,119-121,128-131,141-142,146,148-149,151-156,158-161,165,167,174-175,180,182,188,193-198,210,214,221-222,225,250,255"...

Breakpoint 1 at 0x7f088ef00880: file qemu/qemu_driver.c, line 5492.
(gdb) c
Continuing.
[Switching to Thread 0x7f08bcdcb700 (LWP 24711)]

Breakpoint 1, qemuDomainGetIOThreadsMon (driver=0x7f0874049b80, vm=0x7f08740cd840, iothreads=0x7f08bcdca8b8) at qemu/qemu_driver.c:5492
5492    {
Unprocessed breakpoint [1]
(gdb) finish
Run till exit from #0  qemuDomainGetIOThreadsMon (driver=0x7f0874049b80, vm=0x7f08740cd840, iothreads=0x7f08bcdca8b8) at qemu/qemu_driver.c:5492
0x00007f088ef0098f in qemuDomainGetStatsIOThread (driver=<optimized out>, dom=<optimized out>, record=0x7f08ac000b60, maxparams=0x7f08bcdca9e4, privflags=<optimized out>) at qemu/qemu_driver.c:20885
20885       if ((niothreads = qemuDomainGetIOThreadsMon(driver, dom, &iothreads)) < 0)
Value returned is $1 = -1
(gdb) bt
#0  0x00007f088ef0098f in qemuDomainGetStatsIOThread (driver=<optimized out>, dom=<optimized out>, record=0x7f08ac000b60, maxparams=0x7f08bcdca9e4, privflags=<optimized out>) at qemu/qemu_driver.c:20885
#1  0x00007f088eee70a9 in qemuDomainGetStats (flags=1, record=<synthetic pointer>, stats=255, dom=0x7f08740cd840, conn=0x7f08ac000c50) at qemu/qemu_driver.c:21062
#2  qemuConnectGetAllDomainStats (conn=0x7f08ac000c50, doms=<optimized out>, ndoms=<optimized out>, stats=255, retStats=0x7f08bcdcab10, flags=<optimized out>) at qemu/qemu_driver.c:21162
#3  0x00007f08cd147646 in virConnectGetAllDomainStats (conn=0x7f08ac000c50, stats=0, retStats=retStats at entry=0x7f08bcdcab10, flags=0) at libvirt-domain.c:11685
#4  0x0000562e2404d2c0 in remoteDispatchConnectGetAllDomainStats (server=0x562e24ee74a0, msg=<optimized out>, ret=0x7f08ac001ec0, args=0x7f08ac001f30, rerr=0x7f08bcdcac50, client=0x562e24ef5200) at remote/remote_daemon_dispatch.c:6665
#5  remoteDispatchConnectGetAllDomainStatsHelper (server=0x562e24ee74a0, client=0x562e24ef5200, msg=<optimized out>, rerr=0x7f08bcdcac50, args=0x7f08ac001f30, ret=0x7f08ac001ec0) at remote/remote_daemon_dispatch_stubs.h:743
#6  0x00007f08cd05dad5 in virNetServerProgramDispatchCall (msg=0x562e24ef5910, client=0x562e24ef5200, server=0x562e24ee74a0, prog=0x562e24ee6650) at rpc/virnetserverprogram.c:437
#7  virNetServerProgramDispatch (prog=0x562e24ee6650, server=server at entry=0x562e24ee74a0, client=0x562e24ef5200, msg=0x562e24ef5910) at rpc/virnetserverprogram.c:304
#8  0x00007f08cd063f7d in virNetServerProcessMsg (msg=<optimized out>, prog=<optimized out>, client=<optimized out>, srv=0x562e24ee74a0) at rpc/virnetserver.c:144
#9  virNetServerHandleJob (jobOpaque=<optimized out>, opaque=0x562e24ee74a0) at rpc/virnetserver.c:165
#10 0x00007f08ccf95171 in virThreadPoolWorker (opaque=opaque at entry=0x562e24ee69a0) at util/virthreadpool.c:167
#11 0x00007f08ccf944f8 in virThreadHelper (data=<optimized out>) at util/virthread.c:206
#12 0x00007f08cb213dc5 in start_thread (arg=0x7f08bcdcb700) at pthread_create.c:308
#13 0x00007f08cab3b76d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
(gdb)

My domain configuration is:
[root at dl-c200 libvirt]# virsh list
v^H Id   Name               State
----------------------------------
 1    ubuntu16.04-base   running

[root at dl-c200 libvirt]# virsh dumpxml 1
<domain type='kvm' id='1'>
  <name>ubuntu16.04-base</name>
  <uuid>19d01bd1-ad54-4176-84bd-e510de08fe00</uuid>
  <memory unit='KiB'>10485760</memory>
  <currentMemory unit='KiB'>10485760</currentMemory>
  <vcpu placement='static' current='4'>8</vcpu>
  <cputune>
    <cachetune vcpus='0' id='vcpus_0'>
      <monitor level='3' vcpus='0'/>
    </cachetune>
  </cputune>
  <resource>
    <partition>/machine</partition>
  </resource>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact' check='full'>
    <model fallback='forbid'>Broadwell</model>
    <feature policy='require' name='hypervisor'/>
    <feature policy='require' name='xsaveopt'/>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/tmp/kvm-donot-delete/vm-ubuntu16.04-base'/>
      <backingStore/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <alias name='ide0-0-0'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <alias name='usb'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <alias name='usb'/>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <alias name='usb'/>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <alias name='usb'/>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'>
      <alias name='pci.0'/>
    </controller>
    <controller type='ide' index='0'>
      <alias name='ide'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:eb:24:d3'/>
      <source bridge='virbr0'/>
      <target dev='vnet0'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/1'/>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
      <alias name='serial0'/>
    </serial>
    <console type='pty' tty='/dev/pts/1'>
      <source path='/dev/pts/1'/>
      <target type='serial' port='0'/>
      <alias name='serial0'/>
    </console>
    <input type='mouse' bus='ps2'>
      <alias name='input0'/>
    </input>
    <input type='keyboard' bus='ps2'>
      <alias name='input1'/>
    </input>
    <graphics type='vnc' port='5901' autoport='yes' listen='127.0.0.1'>
      <listen type='address' address='127.0.0.1'/>
    </graphics>
    <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <alias name='balloon0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
  <seclabel type='dynamic' model='selinux' relabel='yes'>
    <label>system_u:system_r:svirt_t:s0:c157,c912</label>
    <imagelabel>system_u:object_r:svirt_image_t:s0:c157,c912</imagelabel>
  </seclabel>
  <seclabel type='dynamic' model='dac' relabel='yes'>
    <label>+0:+0</label>
    <imagelabel>+0:+0</imagelabel>
  </seclabel>
</domain>

I wonder if these message is enough for you to locate the root cause, I don’t have too much time in investigating this today, I'll try to create a fix tomorrow if you need.

Huaqiang

> -----Original Message-----
> From: Wang, Huaqiang
> Sent: Tuesday, November 27, 2018 11:21 AM
> To: 'John Ferlan' <jferlan at redhat.com>; libvir-list at redhat.com
> Subject: RE: [PATCHv10 0/4] Introduce x86 Cache Monitoring Technology
> (CMT)
> 
> 
> 
> > -----Original Message-----
> > From: John Ferlan [mailto:jferlan at redhat.com]
> > Sent: Tuesday, November 27, 2018 10:59 AM
> > To: Wang, Huaqiang <huaqiang.wang at intel.com>; libvir-list at redhat.com
> > Subject: Re: [PATCHv10 0/4] Introduce x86 Cache Monitoring Technology
> > (CMT)
> >
> >
> >
> > On 11/26/18 9:39 PM, Wang, Huaqiang wrote:
> > > Hi John,
> > >
> > > Really appreciate your hard work for the CMT series. Next I'll
> > > working on
> > the MBM.
> > >
> > > In testing the newly pushed code, I find a problem:
> > >
> > > <error message>
> > > [david at dl-c200 ~]$ sudo virsh domstats
> > > error: An error occurred, but the cause is unknown </error message>
> > >
> >
> > I couldn't reproduced in a quick test here. Can you get a thread trace
> > of the failure?
> >
> > What I usually do, build libvirt, then in a terminal session at the
> > top of the git tree "./run gdb src/libvirtd"  (dbg> r)... THen in
> > another terminal session run the virsh command and when the libvirtd
> session stops do a "t a a bt"
> > (thread apply all backtrace)...
> >
> > John
> 
> I'll trace the error.
> 
> Thanks.
> Huaqiang
> 
> >
> > (done for the night)
> >
> > > seems it is caused by qemuDomainGetStatsIOThread not by the new
> > series.
> > > What I test is return 0 immediately at top of
> > > qemuDomainGetStatsIOThread, the command 'virsh domstats' reports
> > the cache statistics normally.
> > >
> > > BR
> > > Huaqiang
> > >
> > >> -----Original Message-----
> > >> From: John Ferlan [mailto:jferlan at redhat.com]
> > >> Sent: Tuesday, November 27, 2018 9:49 AM
> > >> To: Wang, Huaqiang <huaqiang.wang at intel.com>; libvir-
> > list at redhat.com
> > >> Subject: Re: [PATCHv10 0/4] Introduce x86 Cache Monitoring
> > Technology
> > >> (CMT)
> > >>
> > >>
> > >>
> > >> On 11/26/18 12:56 PM, Wang Huaqiang wrote:
> > >>> These patches are the remaining part for the CMT enabling series,
> > >>> and most of the series have been merged.
> > >>>
> > >>> This series is addressing John's review comments and suggestions,
> > >>> which are
> > >>> https://www.redhat.com/archives/libvir-list/2018-
> > >> November/msg00907.htm
> > >>> l
> > >>> https://www.redhat.com/archives/libvir-list/2018-
> > >> November/msg00510.htm
> > >>> l
> > >>> https://www.redhat.com/archives/libvir-list/2018-
> > >> November/msg00561.htm
> > >>> l
> > >>>
> > >>> Change lists:
> > >>> Changes in v10:
> > >>> -. Add tag (virResctrlMonitorType) in
> qemuDomainGetResctrlMonData,
> > >> thus
> > >>>    qemuDomainGetResctrlMonData could be reused for MBM.
> > >>> -. Using VIR_APPEND_ELEMENT to append
> virQEMUResctrlMonDataPtr
> > >> list.
> > >>> -. Add qemuDomainFreeResctrlMonData.
> > >>> -. Add virResctrlMonitorFreeStats.
> > >>> -. Return a list of virResctrlMonitorStatsPtr instead of
> > >>>    a virResctrlMonitorStats array in virResctrlMonitorGetStats.
> > >>>
> > >>> Changes in V9:
> > >>> -. Addressing code review comments form John.
> > >>> -. Refined the names for new data structure and new functions.
> > >>> -. Merged qemuDomainGetStatsCpuResMonitorPerTag and
> > >> qemuDomainGetStatsCpuResMonitor,
> > >>>    and refined new function name based on the fact that we only
> > >>> support
> > >> cache monitor now.
> > >>> Wang Huaqiang (4):
> > >>>   util: Return a list of pointer in virResctrlMonitorGetStats
> > >>>   util: Add function to free monitor statistical data
> > >>>   qemu: Report cache occupancy (CMT) with domstats
> > >>>   docs: Updated news.xml for CMT
> > >>>
> > >>>  docs/news.xml            |  12 ++++
> > >>>  src/libvirt-domain.c     |  12 ++++
> > >>>  src/libvirt_private.syms |   1 +
> > >>>  src/qemu/qemu_driver.c   | 183
> > >> ++++++++++++++++++++++++++++++++++++++++++++++-
> > >>>  src/util/virresctrl.c    |  26 +++++--
> > >>>  src/util/virresctrl.h    |   8 ++-
> > >>>  tools/virsh.pod          |  14 ++++
> > >>>  7 files changed, 248 insertions(+), 8 deletions(-)
> > >>>
> > >>
> > >> Reviewed-by: John Ferlan <jferlan at redhat.com>
> > >> (series)
> > >>
> > >> and pushed,
> > >>
> > >> John




More information about the libvir-list mailing list