On Thu, Dec 17, 2009 at 09:21:42PM +0100, Jiri Denemark wrote: > Each driver supporting CPU selection must fill in host CPU capabilities. > When filling them, drivers for hypervisors running on the same node as > libvirtd can use cpuNodeData() to obtain raw CPU data. Other drivers, > such as VMware, need to implement their own way of getting such data. > Raw data can be decoded into virCPUDefPtr using cpuDecode() function. > > When implementing virConnectCompareCPU(), a hypervisor driver can just > call cpuCompareXML() function with host CPU capabilities. > > For each guest for which a driver supports selecting CPU models, it must > set the appropriate feature in guest's capabilities: > > virCapabilitiesAddGuestFeature(guest, "cpuselection", 1, 0) > > Actions needed when a domain is being created depend on whether the > hypervisor understands raw CPU data (currently CPUID for i686, x86_64 > architectures) or symbolic names has to be used. > > Typical use by hypervisors which prefer CPUID (such as VMware and Xen): > > - convert guest CPU configuration from domain's XML into a set of raw > data structures each representing one of the feature policies: > > cpuEncode(conn, architecture, guest_cpu_config, > &forced_data, &required_data, &optional_data, > &disabled_data, &forbidden_data) > > - create a mask or whatever the hypervisor expects to see and pass it > to the hypervisor > > Typical use by hypervisors with symbolic model names (such as QEMU): > > - get raw CPU data for a computed guest CPU: > > cpuGuestData(conn, host_cpu, guest_cpu_config, &data) > > - decode raw data into virCPUDefPtr with a possible restriction on > allowed model names: > > cpuDecode(conn, guest, data, n_allowed_models, allowed_models) > > - pass guest->model and guest->features to the hypervisor > > Signed-off-by: Jiri Denemark <jdenemar@xxxxxxxxxx> > --- > configure.in | 20 + > src/Makefile.am | 12 + > src/cpu/cpu.c | 242 ++++++++++ > src/cpu/cpu.h | 129 +++++ > src/cpu/cpu_generic.c | 123 +++++ > src/cpu/cpu_generic.h | 32 ++ > src/cpu/cpu_map.c | 130 ++++++ > src/cpu/cpu_map.h | 41 ++ > src/cpu/cpu_x86.c | 1162 ++++++++++++++++++++++++++++++++++++++++++++++ > src/cpu/cpu_x86.h | 31 ++ > src/cpu/cpu_x86_data.h | 45 ++ > src/libvirt_private.syms | 10 + > 12 files changed, 1977 insertions(+), 0 deletions(-) > create mode 100644 src/cpu/cpu.c > create mode 100644 src/cpu/cpu.h > create mode 100644 src/cpu/cpu_generic.c > create mode 100644 src/cpu/cpu_generic.h > create mode 100644 src/cpu/cpu_map.c > create mode 100644 src/cpu/cpu_map.h > create mode 100644 src/cpu/cpu_x86.c > create mode 100644 src/cpu/cpu_x86.h > create mode 100644 src/cpu/cpu_x86_data.h Okay, I just add to remove empty lines at end of C files and extend po/POTFILES.in with the new files with translatable comments, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list