On Wed, Nov 23, 2022 at 13:40:21 +0530, manish.mishra wrote: > Hi Jiri, Thanks, We discussed internally, yes something like that > works for us. We wanted to dicusss how it will look like roughly > before sending patch. Does something like below works. <qemu:cpu> will > be a sub-property within <cpu> and it will contains details only about > cpu-model, cpu-features and check everything else can be as it is. So > for CPU feature and model either user can define those in <cpu> itself > as in example 1 or in <qemu:cpu> as in example 2. Also either example > 1 or example 2 are valid, if user mixes up both, i mean define cpu > feature or models in both <qemu:cpu> and <cpu> it will be a parsing > error to avoid conflicts. In feature policy we as of now need only > require/disable for <qemu:cpu> case and no need of options like match, > mode if <qemu:cpu> is defined. Please let us know if something like > that works. It may vary a bit while working on patch, so probaly it > will be more clear when patch is out, I just wanted to put our > requirements roughly before starting working on patch :). > > <cpu> > <vendor>Intel</vendor> > <topology sockets='240' dies='1' cores='1' threads='1'/> > <cache level='3' mode='emulate'/> > <qemu:cpu check='enfoce'> > <model>Icelake-Server-V4</model> > <feature policy='require' name='smap'/> > <feature policy='require' name='avx'/> > <feature policy='require' name='xsaveopt'/> > <feature policy='disable' name='tsc_adjust'/> > <qemu:cpu /> > <numa> > <cell id='0' cpus='0-239' memory='8388608' unit='KiB' memAccess='shared'/> > </numa> > </cpu> I think this would be quite hard to notice in the XML as it looks almost like a normal CPU definition and it would also complicate the <cpu> parser. We should keep this completely separated similarly to other elements in qemu namespace (as described in https://libvirt.org/drvqemu.html#pass-through-of-arbitrary-qemu-commands So for example, <domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> ... <cpu> <topology sockets='240' dies='1' cores='1' threads='1'/> <cache level='3' mode='emulate'/> <numa>...</numa> ... </cpu> <qemu:cpu> <qemu:model name='Icelake-Server-V4'/> <qemu:option name='enforce' value='on'/> <qemu:option name='smap' value='on'/> <qemu:option name='avx' value='on'/> <qemu:option name='tsc-adjust' value='off'/> <qemu:option name='strange-option' value='1234'/> </qemu:cpu> <devices> ... </devices> </domain> and this would directly translate to -cpu Icelake-Server-V4,enforce=on,smap=on,avx=on,tsc-adjust=off,strange-option=1234 In other words, make it a complete passthrough of the values to QEMU without any extra parsing or translating on libvirt side. This way you can express anything QEMU supports for the -cpu command line option and libvirt has not implemented yet. Defining a CPU model both in <cpu> and <qemu:cpu> would be an error indeed. But eware, even usage of hypervisor features or other XML configuration outside of <cpu> that are translated into -cpu options could be unsupported and overridden by the content of <qemu:cpu>. We have several options for dealing with this: 1. check all of this and report an error 2. document the new <qemu:cpu> element to completely override anything libvirt would pass to -cpu and it's up to the user to include anything they need there (such as hypervisor features) 3. use the content of <qemu:cpu> as a base for -cpu and add other staff there as usual with a proper documentation that mentioning a specific option both in <qemu:cpu> and elsewhere results in an undefined behavior Personally, I would vote for 2 or 3 and perhaps slightly more for 3 as it is a bit more user friendly in case the goal is to override the CPU model but keep using normal configuration for hypervisor features. And of course, using <qemu:cpu> element would result in the domain being tainted with a new VIR_DOMAIN_TAINT_CUSTOM_CPU. Jirka