Re: [PATCH v2 15/18] perf: arm_spe: Handle guest/host exclusion flags

Marc Zyngier
2019-12-23T12:18:18Z

On 2019-12-23 12:10, Andrew Murray wrote:
> On Sun, Dec 22, 2019 at 12:10:52PM +0000, Marc Zyngier wrote:
>> On Fri, 20 Dec 2019 14:30:22 +0000,
>> Andrew Murray <andrew.murray@arm.com> wrote:
>> >
>> > A side effect of supporting the SPE in guests is that we prevent
>> the
>> > host from collecting data whilst inside a guest thus creating a
>> black-out
>> > window. This occurs because instead of emulating the SPE, we share
>> it
>> > with our guests.
>> >
>> > Let's accurately describe our capabilities by using the perf
>> exclude
>> > flags to prevent !exclude_guest and exclude_host flags from being
>> used.
>> >
>> > Signed-off-by: Andrew Murray <andrew.murray@arm.com>
>> > ---
>> > drivers/perf/arm_spe_pmu.c | 3 +++
>> > 1 file changed, 3 insertions(+)
>> >
>> > diff --git a/drivers/perf/arm_spe_pmu.c
>> b/drivers/perf/arm_spe_pmu.c
>> > index 2d24af4cfcab..3703dbf459de 100644
>> > --- a/drivers/perf/arm_spe_pmu.c
>> > +++ b/drivers/perf/arm_spe_pmu.c
>> > @@ -679,6 +679,9 @@ static int arm_spe_pmu_event_init(struct
>> perf_event *event)
>> > if (attr->exclude_idle)
>> > return -EOPNOTSUPP;
>> >
>> > + if (!attr->exclude_guest || attr->exclude_host)
>> > + return -EOPNOTSUPP;
>> > +
>>
>> I have the opposite approach. If the host decides to profile the
>> guest, why should that be denied? If there is a black hole, it
>> should
>> take place in the guest. Today, the host does expect this to work,
>> and
>> there is no way that we unconditionally allow it to regress.
>
> That seems reasonable.
>
> Upon entering the guest we'd have to detect if the host is using SPE,
> and if
> so choose not to restore the guest registers. Instead we'd have to
> trap them
> and let the guest read/write emulated values until the host has
> finished with
> SPE - at which time we could restore the guest SPE registers to
> hardware.
>
> Does that approach make sense?

Yes, this would be much better. All of this can be found out at
vcpu_load()
time, and once you've moved most of the SPE sysreg handling there, it
will
just follow the normal scheduling flow.

M.
--
Jazz is not dead. It just smells funny...