On Thu, Apr 18, 2013 at 12:00:09PM +0200, Peter Krempa wrote:
Hmm, okay that seems fair enough. The virDomainSetvcpus api has the
ideal name for this but mixing the semantics of disabling CPUs with
the angent and ripping them out from the hypervisor might lead to
user confusion.
In this case we need to design a new API. Here are a few suggestions:
1) virDomainSetGuestVCPU(virDomainPtr dom,
unsigned int cpu_id,
bool state,
unsigned int flags);
This api would be very easy for us as only one cpu could be modified
at time, thus no painful error reporting on semi-failed
transactions. Harder to use in mgmt apps as they would need to call
it multiple times.
Yep, the simplicity is nice. I don't think it is much of a burden
to apps.
2) virDomainSetGuestVCPUs(virDomainPtr dom,
virBitmapPtr to_online,
virBitmapPtr to_offline,
unsigned int flags);
Doesn't look very nice. Two bitmaps are needed as CPU indexes are
not guaranteed to be contiguous inside of a guest. Is easier to use
for mgmt apps as only a single call is needed. Libvirt will have to
solve failures and maybe even attempt rollback.
More importantly I don't want us to expose virBitmapPtr in the public
API ! We'd want to use raw bitmask as we do for other CPU related
APIs
3) virDomainSetGuestVCPUs(virDomainPtr dom,
virBitmapPtr cpumap,
bool state,
unsigned int flags);
Variation of 2), one cpu map and a state flag that will determine
what action to take with the cpus provided in the map instead of two
separate maps.
Other possibility would be to expose the cpu state in a kind of
array as the agent monitor functions do it right now, but this
wouldn't be expandable and would require users to use that new data
structure.
Again, the getter functions will need to do the same, so that the
user will be able to obtain a map of the system to do decisions
about offlining and onlining processors.
In the future we will also need similar APIs for classic cpu hotplug
as qemu is probably going to support it in that way. With the
classic hotplug we probably won't need to take care of sparse cpu
ID's.
Any other design or naming suggestions are welcome.
Since 'cpu_id' in this refers to the guest OS' notion of CPUs,
do we need some way to expose what the guest OS considers the
CPU IDs to be.
Personally I like the simpler first API, since it has easy to
understand error behaviour.
What is the data format QEMU agent requires for toggling CPUs ?
Does it allow multiple CPUs to be changed at once ?
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|