[libvirt] RFC: add <currentVcpu> element
Eric Blake
eblake at redhat.com
Mon Sep 27 17:20:42 UTC 2010
On 09/27/2010 10:25 AM, Daniel Veillard wrote:
>> using these flags:
>>
>> VIR_SET_VCPU_MAXIMUM = 1
>> VIR_SET_VCPU_PERSISTENT = 2
>>
>> such that
>>
>> virDomainSetVcpusFlags(dom,1,0) - same as existing virDomainSetVcpus
>> virDomainSetVcpusFlags(dom,1,VIR_SET_VCPU_MAXIMUM) - error; can't
>> change max on active domain
>> virDomainSetVcpusFlags(dom,1,VIR_SET_VCPU_MAXIMUM|VIR_SET_VCPU_PERSISTENT)
>> - sets<vcpu> xml element for next boot
>> virDomainSetVcpusFlags(dom,1,VIR_SET_VCPU_PERSISTENT) - sets
>> <currentVcpu> xml element for next boot
>>
>
> Yes I suggest to get 2 functions one for set and one for get
> allowing to do the full set of operations with the use of flags.
OK, given your feedback, the proposal is now:
XML layer - still debating on <currentVcpu> vs. <vcpu current=n> (see
other email), but that is relatively trivial to switch between styles
API layer - given your desire to make changes to an active domain also
affect persistent state in one call, we need three flags instead of two.
My current thoughts:
add one new enum and two new functions:
// flags for both virDomainSetVcpusFlags and virDomainGetVcpusFlags
enum virDomainVcpuFlags {
// whether to affect active state or next boot state
VIR_DOMAIN_VCPU_ACTIVE = 1,
VIR_DOMAIN_VCPU_PERSISTENT = 2,
// whether to affect maximum rather than current
VIR_DOMAIN_VCPU_MAXIMUM = 4,
};
At least one of VIR_DOMAIN_VCPU_ACTIVE and VIR_DOMAIN_VCPU_PERSISTENT
must be set. Using VIR_DOMAIN_VCPU_ACTIVE requires an active domain,
while VIR_DOMAIN_VCPU_PERSISTENT works for active and inactive domains.
For setting the count, both flags may be set (although setting both +
VIR_DOMAIN_VCPU_MAXIMUM will fail); for getting, exactly one must be
set. For setting, VIR_DOMAIN_VCPU_MAXIMUM must be paired with
VIR_DOMAIN_VCPU_PERSISTENT; for getting, it can be paired with either flag.
// returns -1 on failure, 0 on success
// virDomainSetVcpus maps to virDomainSetVcpusFlags(,VIR_DOMAIN_VCPU_ACTIVE)
int virDomainSetVcpusFlags(virDomainPtr, unsigned int nvcpus,
unsigned int flags);
// returns -1 on failure, count on success
// virDomainGetVcpus remains more complex regarding pinning info
// virDomainGetMaxVcpus maps to
virDomainGetVcpusFlags(,VIR_DOMAIN_VCPU_ACTIVE|VIR_DOMAIN_VCPU_MAXIMUM)
int virDomainGetVcpusFlags(virDomainPtr, unsigned int flags);
No change to existing API semantics, although the implementation can
wrap old APIs to call the new ones with appropriate flags where
appropriate to minimize code duplication.
> virDomainSetVcpusFlags could be used to set the maximum vcpus
> of the persistant domain definition with a 3rd flag. Maybe we can
> find a better name for that function though the Flags suffix is in
> line with other API functions extensions.
> What we really want is have convenient functions to get
> - max vcpus on stopped guests
virDomainGetVcpusFlags(,VIR_DOMAIN_VCPU_PERSISTENT|VIR_DOMAIN_VCPU_MAXIMUM)
virDomainGetXMLDesc(,VIR_DOMAIN_XML_INACTIVE) + XML parsing
> - max vcpus on running guests
virDomainGetVcpusFlags(,VIR_DOMAIN_VCPU_ACTIVE|VIR_DOMAIN_VCPU_MAXIMUM)
virDomainGetMaxVcpus()
virDomainGetXMLDesc(,0) + XML parsing
> - current vcpu on stopped guests
virDomainGetVcpusFlags(,VIR_DOMAIN_VCPU_PERSISTENT)
[virDomainGetXMLDesc + parsing if XML update goes in]
> - current vcpu on running guests
virDomainGetVcpusFlags(,VIR_DOMAIN_VCPU_ACTIVE)
virDomainGetVcpus() + parsing pinning info
> and set
> - max vcpus on stopped guests
virDomainSetVcpusFlags(,VIR_DOMAIN_VCPU_PERSISTENT|VIR_DOMAIN_VCPU_MAXIMUM)
virDomainGetXMLDesc + XML mod + virDomainDefineXML
> - max vcpu persistent on running guests
virDomainSetVcpusFlags(,VIR_DOMAIN_VCPU_PERSISTENT|VIR_DOMAIN_VCPU_MAXIMUM)
virDomainGetXMLDesc + XML mod + virDomainDefineXML
> - current vcpu on stopped guests
virDomainSetVcpusFlags(,VIR_DOMAIN_VCPU_PERSISTENT)
[virDomainGetXMLDesc + XML mod + virDomainDefineXML if XML update goes in]
> - current vcpu on running guests
virDomainSetVcpusFlags(,VIR_DOMAIN_VCPU_ACTIVE)
virDomainSetVcpus()
> Another thing is that when setting the current vcpu count on a
> running guest we should also save this to the persistant data so
> that on domain restart one get an expected state.
virDomainSetVcpusFlags(,VIR_DOMAIN_VCPU_ACTIVE|VIR_DOMAIN_VCPU_PERSISTENT)
[combination of virDomainSetVcpus() and virDomainGetXMLDesc + XML mod +
virDomainDefineXML if XML update goes in]
So I think my latest proposal with three enum flags fits all these needs.
virsh layer:
vcpuinfo unchanged, tracks pinning info
setvcpus learns --max, --persistent, and --active flags mapping quite
nicely to the three enum values at the API; omitting both --persistent
and --active calls old API (which in turn implies --active)
new vcpucount command, I'm debating whether it is easier to provide all
possible information without needing boolean options, or whether to
provide --max, --persistent, and --active to make the user more closely
match the API
>
> Another question I had, is there a way in QEmu to specifiy a different
> cpu count from the -smp indicating the startup count ?
I wish I knew off-hand, as it would make it easier for me to implement
when I get to that part of the patch series :) But even if there isn't,
I think that starting with the maximum via -smp and immediately after
hot-unplugging to the current count is better than nothing.
--
Eric Blake eblake at redhat.com +1-801-349-2682
Libvirt virtualization library http://libvirt.org
More information about the libvir-list
mailing list