On Tue, 2016-05-31 at 16:08 +1000, David Gibson wrote: > > QEMU fails with errors like > > > > qemu-kvm: Cannot support more than 8 threads on PPC with KVM > > qemu-kvm: Cannot support more than 1 threads on PPC with TCG > > > > depending on the guest type. > > Note that in a sense the two errors come about for different reasons. > > On Power, to a much greater degree than x86, threads on the same core > have observably different behaviour from threads on different cores. > Because of that, there's no reasonable way for KVM to present more > guest threads-per-core than there are host threads-per-core. > > The limit of 1 thread on TCG is simply because no-one's ever bothered > to implement SMT emulation in qemu. That just means in the future we might have to expose something other than an hardcoded '1' as guest thread limit for TCG guests; the interface would remain valid AFAICT. > > physical_core_id would be 32 for all of the above - it would > > just be the very value of core_id the kernel reads from the > > hardware and reports through sysfs. > > > > The tricky bit is that, when subcores are in use, core_id and > > physical_core_id would not match. They will always match on > > architectures that lack the concept of subcores, though. > > Yeah, I'm still not terribly convinced that we should even be > presenting physical core info instead of *just* logical core info. If > you care that much about physical core topology, you probably > shouldn't be running your system in subcore mode. Me neither. We could leave it out initially, and add it later if it turns out to be useful, I guess. > > > > The optimal guest topology in this case would be > > > > > > > > <vcpu placement='static' cpuset='4'>4</vcpu> > > > > <cpu> > > > > <topology sockets='1' cores='1' threads='4'/> > > > > </cpu> > > > > > > So when we pin to logical CPU #4, ppc KVM is smart enough to see that it's a > > > subcore thread, will then make use of the offline threads in the same subcore? > > > Or does libvirt do anything fancy to facilitate this case? > > > > My understanding is that libvirt shouldn't have to do anything > > to pass the hint to kvm, but David will have the authoritative > > answer here. > > Um.. I'm not totally certain. It will be one of two things: > a) you just bind the guest thread to the representative host thread > b) you bind the guest thread to a cpumask with all of the host > threads on the relevant (sub)core - including the offline host > threads > > I'll try to figure out which one it is. I played with this a bit: I created a guest with <vcpu placement='static' cpuset='0,8'>8</vcpu> <cpu> <topology sockets='1' cores='2' threads='4'/> </cpu> and then, inside the guest, I used cgroups to pin a bunch of busy loops to specific vCPUs. As long as all the load (8+ busy loops) was distributed only across vCPUs 0-3, one of the host threads remained idle. As soon as the first of the jobs was moved to vCPUs 4-7, the other host thread immediately jumped to 100%. This seems to indicate that QEMU / KVM are actually smart enough to schedule guest threads on the corresponding host threads. I think :) On the other hand, when I changed the guest to distribute the 8 vCPUs among 2 sockets with 4 cores each instead, the second host thread would start running as soon as I started the second busy loop. > > We won't know whether the proposal is actually sensible until > > David weighs in, but I'm adding Martin back in the loop so > > we can maybe give us the oVirt angle in the meantime. > > TBH, I'm not really sure what you want from me. Most of the questions > seem to be libvirt design decisions which are independent of the layers > below. I mostly need you to sanity check my proposals and point out any incorrect / dubious claims, just like you did above :) The design of features like this one can have pretty significant consequences for the interactions between the various layers, and when the choices are not straightforward I think it's better to gather as much feedback as possible from across the stack before moving forward with an implementation. -- Andrea Bolognani Software Engineer - Virtualization Team -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list