[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <gsnt34jv9el6.fsf@coltonlewis-kvm.c.googlers.com>
Date: Wed, 13 Nov 2024 18:24:37 +0000
From: Colton Lewis <coltonlewis@...gle.com>
To: Peter Zijlstra <peterz@...radead.org>
Cc: kvm@...r.kernel.org, oliver.upton@...ux.dev, seanjc@...gle.com,
mingo@...hat.com, acme@...nel.org, namhyung@...nel.org, mark.rutland@....com,
alexander.shishkin@...ux.intel.com, jolsa@...nel.org, irogers@...gle.com,
adrian.hunter@...el.com, kan.liang@...ux.intel.com, will@...nel.org,
linux@...linux.org.uk, catalin.marinas@....com, mpe@...erman.id.au,
npiggin@...il.com, christophe.leroy@...roup.eu, naveen@...nel.org,
hca@...ux.ibm.com, gor@...ux.ibm.com, agordeev@...ux.ibm.com,
borntraeger@...ux.ibm.com, svens@...ux.ibm.com, tglx@...utronix.de,
bp@...en8.de, dave.hansen@...ux.intel.com, x86@...nel.org, hpa@...or.com,
linux-perf-users@...r.kernel.org, linux-kernel@...r.kernel.org,
linux-arm-kernel@...ts.infradead.org, linuxppc-dev@...ts.ozlabs.org,
linux-s390@...r.kernel.org
Subject: Re: [PATCH v7 4/5] x86: perf: Refactor misc flag assignments
Peter Zijlstra <peterz@...radead.org> writes:
> On Fri, Nov 08, 2024 at 08:20:44PM +0100, Peter Zijlstra wrote:
>> Isn't the below more or less what you want?
>> static unsigned long misc_flags(struct pt_regs *regs)
>> {
>> unsigned long flags = 0;
>> if (regs->flags & PERF_EFLAGS_EXACT)
>> flags |= PERF_RECORD_MISC_EXACT_IP;
>> return flags;
>> }
>> static unsigned long native_flags(struct pt_regs *regs)
>> {
>> unsigned long flags = 0;
>> if (user_mode(regs))
>> flags |= PERF_RECORD_MISC_USER;
>> else
>> flags |= PERF_RECORD_MISC_KERNEL;
>> return flags;
>> }
>> static unsigned long guest_flags(struct pt_regs *regs)
>> {
>> unsigned long guest_state = perf_guest_state();
>> unsigned long flags = 0;
>> if (guest_state & PERF_GUEST_ACTIVE) {
>> if (guest_state & PERF_GUEST_USER)
>> flags |= PERF_RECORD_MISC_GUEST_USER;
>> else
>> flags |= PERF_RECORD_MISC_GUEST_KERNEL;
>> }
>> return flags;
>> }
>> unsigned long perf_arch_guest_misc_flags(struct pt_regs *regs)
>> {
>> unsigned long flags;
>> flags = misc_flags(regs);
>> flags |= guest_flags(regs);
>> return flags;
>> }
>> unsigned long perf_arch_misc_flags(struct pt_regs *regs)
>> {
>> unsigned long flags;
>> unsigned long guest;
>> flags = misc_flags(regs);
>> guest = guest_flags(regs);
>> if (guest)
>> flags |= guest;
>> else
>> flags |= native_flags(regs);
>> return flags;
>> }
> This last can be written more concise:
> unsigned long perf_arch_misc_flags(struct pt_regs *regs)
> {
> unsigned long flags;
> flags = guest_flags(regs);
> if (!flags)
> flags |= native_flags(regs);
> flgs |= misc_flags(regs);
> return flags;
> }
This isn't right because it is choosing to return guest or native
flags depending on the presence of guest flags, but that's not what we
want.
See perf_misc_flags in kernel/events/core.c which chooses to return
perf_arch_guest_misc_flags or perf_arch_misc_flags depending on
should_sample_guest which depends on more than current guest state.
But I will take some of your suggestions to split the functions out
more.
Powered by blists - more mailing lists