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; }