Hello Shaoqin, On Fri, Aug 02, 2024 at 05:01:47PM +0800, Shaoqin Huang wrote: > Date: Fri, 2 Aug 2024 17:01:47 +0800 > From: Shaoqin Huang <shahuang@xxxxxxxxxx> > Subject: Re: [RFC 0/5] accel/kvm: Support KVM PMU filter > > Hi Zhao, > > On 7/10/24 12:51, Zhao Liu wrote: > > Hi QEMU maintainers, arm and PMU folks, > > > > I picked up Shaoqing's previous work [1] on the KVM PMU filter for arm, > > and now is trying to support this feature for x86 with a JSON-compatible > > API. > > > > While arm and x86 use different KVM ioctls to configure the PMU filter, > > considering they all have similar inputs (PMU event + action), it is > > still possible to abstract a generic, cross-architecture kvm-pmu-filter > > object and provide users with a sufficiently generic or near-consistent > > QAPI interface. > > > > That's what I did in this series, a new kvm-pmu-filter object, with the > > API like: > > > > -object '{"qom-type":"kvm-pmu-filter","id":"f0","events":[{"action":"allow","format":"raw","code":"0xc4"}]}' > > > > For i386, this object is inserted into kvm accelerator and is extended > > to support fixed-counter and more formats ("x86-default" and > > "x86-masked-entry"): > > > > -accel kvm,pmu-filter=f0 \ > > -object pmu='{"qom-type":"kvm-pmu-filter","id":"f0","x86-fixed-counter":{"action":"allow","bitmap":"0x0"},"events":[{"action":"allow","format":"x86-masked-entry","select":"0xc4","mask":"0xff","match":"0","exclude":true},{"action":"allow","format":"x86-masked-entry","select":"0xc5","mask":"0xff","match":"0","exclude":true}]}' > > What if I want to create the PMU Filter on ARM to deny the event range > [0x5,0x10], and allow deny event 0x13, how should I write the json? > Cuurently this doesn't support the event range (since the raw format of x86 event cannot be said to be continuous). So with the basic support, we need to configure events one by one: -object pmu='{"qom-type":"kvm-pmu-filter","id":"f0","events":[{"action":"allow","format":"raw","code":"0x5"},{"action":"allow","format":"raw","select":"0x6"},{"action":"allow","format":"raw","code":"0x7"},{"action":"allow","format":"raw","code":"0x8"},{"action":"allow","format":"raw","code":"0x9"},{"action":"allow","format":"raw","code":"0x10"},{"action":"deny","format":"raw","code":"0x13"}]}' This one looks a lot more complicated, but in the future, arm could further support event-range (maybe implement event-range via mask), but I think this could be arch-specific format since not all architectures' events are continuous. Additional, I'm a bit confused by your example, and I hope you can help me understand that: when configuring 0x5~0x10 to be allow, isn't it true that all other events are denied by default, so denying 0x13 again is a redundant operation? What is the default action for all other events except 0x5~0x10 and 0x13? If we specify action as allow for 0x5~0x10 and deny for the rest by default, then there is no need to set an action for each event but only a global one (as suggested by Dapeng), so the above command line can be simplified as: -object pmu='{"qom-type":"kvm-pmu-filter","id":"f0","action":"allow","events":[{"format":"raw","code":"0x5"},{"format":"raw","select":"0x6"},{"format":"raw","code":"0x7"},{"format":"raw","code":"0x8"},{"format":"raw","code":"0x9"},{"format":"raw","code":"0x10"}]}' Thanks, Zhao