From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757637AbcH3QM7 (ORCPT ); Tue, 30 Aug 2016 12:12:59 -0400 Received: from mail-it0-f67.google.com ([209.85.214.67]:33401 "EHLO mail-it0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754557AbcH3QMy (ORCPT ); Tue, 30 Aug 2016 12:12:54 -0400 MIME-Version: 1.0 In-Reply-To: <1472418058-28659-5-git-send-email-maddy@linux.vnet.ibm.com> References: <1472418058-28659-1-git-send-email-maddy@linux.vnet.ibm.com> <1472418058-28659-5-git-send-email-maddy@linux.vnet.ibm.com> From: Nilay Vaish Date: Tue, 30 Aug 2016 11:11:55 -0500 Message-ID: Subject: Re: [PATCH 04/13] perf/core: Extend perf_output_sample_regs() to include perf_arch_regs To: Madhavan Srinivasan Cc: Linux Kernel list , linuxppc-dev@lists.ozlabs.org, Thomas Gleixner , Ingo Molnar , Peter Zijlstra , Jiri Olsa , Arnaldo Carvalho de Melo , Stephane Eranian , Russell King , Catalin Marinas , Will Deacon , Benjamin Herrenschmidt , Michael Ellerman , Sukadev Bhattiprolu Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 28 August 2016 at 16:00, Madhavan Srinivasan wrote: > diff --git a/kernel/events/core.c b/kernel/events/core.c > index 274288819829..e16bf4d057d1 100644 > --- a/kernel/events/core.c > +++ b/kernel/events/core.c > @@ -5371,16 +5371,24 @@ u64 __attribute__((weak)) perf_arch_reg_value(struct perf_arch_regs *regs, > > static void > perf_output_sample_regs(struct perf_output_handle *handle, > - struct pt_regs *regs, u64 mask) > + struct perf_regs *regs, u64 mask) > { > int bit; > DECLARE_BITMAP(_mask, 64); > + u64 arch_regs_mask = regs->arch_regs_mask; > > bitmap_from_u64(_mask, mask); > for_each_set_bit(bit, _mask, sizeof(mask) * BITS_PER_BYTE) { > u64 val; > > - val = perf_reg_value(regs, bit); > + val = perf_reg_value(regs->regs, bit); > + perf_output_put(handle, val); > + } > + > + bitmap_from_u64(_mask, arch_regs_mask); > + for_each_set_bit(bit, _mask, sizeof(mask) * BITS_PER_BYTE) { > + u64 val; > + val = perf_arch_reg_value(regs->arch_regs, bit); > perf_output_put(handle, val); > } > } > @@ -5792,7 +5800,7 @@ void perf_output_sample(struct perf_output_handle *handle, > if (abi) { > u64 mask = event->attr.sample_regs_user; > perf_output_sample_regs(handle, > - data->regs_user.regs, > + &data->regs_user, > mask); > } > } > @@ -5827,7 +5835,7 @@ void perf_output_sample(struct perf_output_handle *handle, > u64 mask = event->attr.sample_regs_intr; > > perf_output_sample_regs(handle, > - data->regs_intr.regs, > + &data->regs_intr, > mask); > } > } > -- > 2.7.4 > I would like to suggest a slightly different version. Would it make more sense to have something like following: @@ -5792,7 +5800,7 @@ void perf_output_sample(struct perf_output_handle *handle, if (abi) { u64 mask = event->attr.sample_regs_user; perf_output_sample_regs(handle, data->regs_user.regs, mask); } + + if (arch_regs_mask) { + perf_output_pmu_regs(handle, data->regs_users.arch_regs, arch_regs_mask); + } } Somehow I don't like outputting the two sets of registers through the same function call. -- Nilay