On Mon, May 13, 2024 at 02:52:14PM +0800, Zhao Liu wrote: > Hi Daniel, > > > Please describe it in terms of a QAPI definition, as that's what we're > > striving for with all QEMU public interfaces. Once the QAPI design is > > agreed, then the -object mapping is trivial, as -object's JSON format > > supports arbitrary QAPI structures. > > Thank you for your guidance! > > I rethought and and modified my previous proposal: > > Let me show the command examples firstly: > * Add a single event: > (x86) -object kvm-pmu-event,id=e0,action=allow,format=x86-default,\ > select=0x3c,umask=0x00 > (arm or general) -object kvm-pmu-event,id=e1,action=deny,\ > format=raw,code=0x01 > > * Add a counter bitmap: > (x86) -object kvm-pmu-counter,id=cnt,action=allow,type=x86-fixed,\ > bitmap=0xffff0000 > > * Add an event list (must use Json syntax format): > (x86) -object '{"qom-type":"kvm-pmu-event-list","id"="filter0","action"="allow","format"="x86-default","events=[{"select"=0x3c,"umask"=0x00},{"select"=0x2e,"umask"=0x4f}]' > (arm) -object '{"qom-type":"kvm-pmu-event-list","id"="filter1","action"="allow","format"="raw","events"=[{"code"=0x01},{"code"=0x02}]' > > > The specific JSON definitions are as follows (IIUC, this is "in terms of > a QAPI definition", right? ;-)): > * Define PMU event and counter bitmap with JSON format: > - basic filter action: > > { 'enum': 'KVMPMUFilterAction', > 'prefix': 'KVM_PMU_FILTER_ACTION', > 'data': ['deny', 'allow' ] } > > - PMU counter: > > { 'enum': 'KVMPMUCounterType', > 'prefix': 'KVM_PMU_COUNTER_TYPE', > 'data': [ 'x86-fixed' ] } > > { 'struct': 'KVMPMUX86FixedCounter', > 'data': { 'bitmap': 'uint32' } } > > - PMU events (total 3 formats): > > # 3 encoding formats: "raw" is compatible with shaoqin's ARM format as > # well as the x86 raw format, and could support other architectures in > # the future. > { 'enum': 'KVMPMUEventEncodeFmt', > 'prefix': 'KVM_PMU_EVENT_ENCODE_FMT', > 'data': ['raw', 'x86-default', 'x86-masked-entry' ] } > > # A general format. > { 'struct': 'KVMPMURawEvent', > 'data': { 'code': 'uint64' } } > > # x86-specific > { 'struct': 'KVMPMUX86DefalutEvent', > 'data': { 'select': 'uint16', > 'umask': 'uint16' } } > > # another x86 specific > { 'struct': 'KVMPMUX86MaskedEntry', > 'data': { 'select': 'uint16', > 'match': 'uint8', > 'mask': 'uint8', > 'exclude': 'bool' } } > > # And their list wrappers: > { 'struct': 'KVMPMURawEventList', > 'data': { 'events': ['KVMPMURawEvent'] } } > > { 'struct': 'KVMPMUX86DefalutEventList', > 'data': { 'events': ['KVMPMUX86DefalutEvent'] } } > > { 'struct': 'KVMPMUX86MaskedEntryList', > 'data': { 'events': ['KVMPMUX86MaskedEntryList'] } } > > > Based on the above basic structs, we could provide 3 new more qom-types: > - 'kvm-pmu-counter': 'KVMPMUFilterCounter' > > # This is a single object option to configure PMU counter > # bitmap filter. > { 'union': 'KVMPMUFilterCounter', > 'base': { 'action': 'KVMPMUFilterAction', > 'type': 'KVMPMUCounterType' }, > 'discriminator': 'type', > 'data': { 'x86-fixed': 'KVMPMUX86FixedCounter' } } > > > - 'kvm-pmu-counter': 'KVMPMUFilterCounter' > > # This option is used to configure a single PMU event for > # PMU filter. > { 'union': 'KVMPMUFilterEvent', > 'base': { 'action': 'KVMPMUFilterAction', > 'format': 'KVMPMUEventEncodeFmt' }, > 'discriminator': 'format', > 'data': { 'raw': 'KVMPMURawEvent', > 'x86-default': 'KVMPMUX86DefalutEvent', > 'x86-masked-entry': 'KVMPMUX86MaskedEntry' } } > > > - 'kvm-pmu-event-list': 'KVMPMUFilterEventList' > > # Used to configure multiple events. > { 'union': 'KVMPMUFilterEventList', > 'base': { 'action': 'KVMPMUFilterAction', > 'format': 'KVMPMUEventEncodeFmt' }, > 'discriminator': 'format', > 'data': { 'raw': 'KVMPMURawEventList', > 'x86-default': 'KVMPMUX86DefalutEventList', > 'x86-masked-entry': 'KVMPMUX86MaskedEntryList' } } > > > Compared to Shaoqin's original format, kvm-pmu-event-list is not able to > enumerate events continuously (similar to 0x00-0x30 before), and now > user must enumerate events one by one individually. > > What do you think about the above 3 new commands? I don't know enough about KVM PMU to give feedback on the specific choices, but in terms of how to do QAPI design, this looks like a good start. With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|