From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id ADB80EB64DC for ; Wed, 21 Jun 2023 13:21:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=qcfsNKW2wKx3tl7fINlIVOx0a5aBlFV6nUPfOo6zA2E=; b=e1JfNS6YKxuvE7 sn0BfbH1JUpzbl7rsICWnWQQguoV/+V9E3g8ymxO+EYP0zsKtXqkLy3WBrxvxqUdu4dVG4ayAYuRB q2sfysqIXTfMilbJrmoSF5v8CGruHhys82LfkyBLpVfWcfrvbgk/hK2Bi8iPj+xXPdnnxqfntbD32 tabWGRk5tTXA+ozxLeF63yFaPRQN94mx1nZ+0//3JuFycdJAUKTD+zPoAdHyi9/kM6ZPSQVNqmfzY ThVBod+PURKxcvJI77uKM3diiMElY8SSAMU5VG9vzFk/JEWnb0LthZbOytSQ//TAWtDyDzNdQnAcW sNxzKX5CV7DzBvXYAEWw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qBxlj-00EfBy-10; Wed, 21 Jun 2023 13:21:07 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qBxlg-00EfB8-20 for linux-arm-kernel@lists.infradead.org; Wed, 21 Jun 2023 13:21:06 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 2291A1FB; Wed, 21 Jun 2023 06:21:46 -0700 (PDT) Received: from FVFF77S0Q05N (unknown [10.57.27.65]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 198D63F64C; Wed, 21 Jun 2023 06:20:59 -0700 (PDT) Date: Wed, 21 Jun 2023 14:20:57 +0100 From: Mark Rutland To: Anshuman Khandual Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, will@kernel.org, catalin.marinas@arm.com, Mark Brown , James Clark , Rob Herring , Marc Zyngier , Suzuki Poulose , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , linux-perf-users@vger.kernel.org Subject: Re: [PATCH V12 10/10] arm64/perf: Implement branch records save on PMU IRQ Message-ID: References: <20230615133239.442736-1-anshuman.khandual@arm.com> <20230615133239.442736-11-anshuman.khandual@arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20230615133239.442736-11-anshuman.khandual@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230621_062104_780151_0A1D6326 X-CRM114-Status: GOOD ( 28.23 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Thu, Jun 15, 2023 at 07:02:39PM +0530, Anshuman Khandual wrote: > This modifies armv8pmu_branch_read() to concatenate live entries along with > task context stored entries and then process the resultant buffer to create > perf branch entry array for perf_sample_data. It follows the same principle > like task sched out. > > Cc: Catalin Marinas > Cc: Will Deacon > Cc: Mark Rutland > Cc: linux-arm-kernel@lists.infradead.org > Cc: linux-kernel@vger.kernel.org > Tested-by: James Clark > Signed-off-by: Anshuman Khandual The resulting logic looks fine here, but it would be nicer if we had the resulting structure from the outset rather than having to rewrite it (i.e. if when we introduced this we captured all the recores then processed them), as that would keep the diff minimal and make it much clearer as to what wwas happening here. Either way: Acked-by: Mark Rutland Mark. > --- > drivers/perf/arm_brbe.c | 69 +++++++++++++++++++---------------------- > 1 file changed, 32 insertions(+), 37 deletions(-) > > diff --git a/drivers/perf/arm_brbe.c b/drivers/perf/arm_brbe.c > index 3bb17ced2b1d..d28067c896e2 100644 > --- a/drivers/perf/arm_brbe.c > +++ b/drivers/perf/arm_brbe.c > @@ -653,41 +653,44 @@ void armv8pmu_branch_reset(void) > isb(); > } > > -static bool capture_branch_entry(struct pmu_hw_events *cpuc, > - struct perf_event *event, int idx) > +static void brbe_regset_branch_entries(struct pmu_hw_events *cpuc, struct perf_event *event, > + struct brbe_regset *regset, int idx) > { > struct perf_branch_entry *entry = &cpuc->branches->branch_entries[idx]; > - u64 brbinf = get_brbinf_reg(idx); > - > - /* > - * There are no valid entries anymore on the buffer. > - * Abort the branch record processing to save some > - * cycles and also reduce the capture/process load > - * for the user space as well. > - */ > - if (brbe_invalid(brbinf)) > - return false; > + u64 brbinf = regset[idx].brbinf; > > perf_clear_branch_entry_bitfields(entry); > if (brbe_record_is_complete(brbinf)) { > - entry->from = get_brbsrc_reg(idx); > - entry->to = get_brbtgt_reg(idx); > + entry->from = regset[idx].brbsrc; > + entry->to = regset[idx].brbtgt; > } else if (brbe_record_is_source_only(brbinf)) { > - entry->from = get_brbsrc_reg(idx); > + entry->from = regset[idx].brbsrc; > entry->to = 0; > } else if (brbe_record_is_target_only(brbinf)) { > entry->from = 0; > - entry->to = get_brbtgt_reg(idx); > + entry->to = regset[idx].brbtgt; > } > capture_brbe_flags(entry, event, brbinf); > - return true; > +} > + > +static void process_branch_entries(struct pmu_hw_events *cpuc, struct perf_event *event, > + struct brbe_regset *regset, int nr_regset) > +{ > + int idx; > + > + for (idx = 0; idx < nr_regset; idx++) > + brbe_regset_branch_entries(cpuc, event, regset, idx); > + > + cpuc->branches->branch_stack.nr = nr_regset; > + cpuc->branches->branch_stack.hw_idx = -1ULL; > } > > void armv8pmu_branch_read(struct pmu_hw_events *cpuc, struct perf_event *event) > { > - int nr_hw_entries = brbe_get_numrec(cpuc->percpu_pmu->reg_brbidr); > + struct arm64_perf_task_context *task_ctx = event->pmu_ctx->task_ctx_data; > + struct brbe_regset live[BRBE_MAX_ENTRIES]; > + int nr_live, nr_store, nr_hw_entries; > u64 brbfcr, brbcr; > - int idx = 0; > > brbcr = read_sysreg_s(SYS_BRBCR_EL1); > brbfcr = read_sysreg_s(SYS_BRBFCR_EL1); > @@ -699,25 +702,17 @@ void armv8pmu_branch_read(struct pmu_hw_events *cpuc, struct perf_event *event) > write_sysreg_s(brbfcr | BRBFCR_EL1_PAUSED, SYS_BRBFCR_EL1); > isb(); > > - /* Loop through bank 0 */ > - select_brbe_bank(BRBE_BANK_IDX_0); > - while (idx < nr_hw_entries && idx < BRBE_BANK0_IDX_MAX) { > - if (!capture_branch_entry(cpuc, event, idx)) > - goto skip_bank_1; > - idx++; > - } > - > - /* Loop through bank 1 */ > - select_brbe_bank(BRBE_BANK_IDX_1); > - while (idx < nr_hw_entries && idx < BRBE_BANK1_IDX_MAX) { > - if (!capture_branch_entry(cpuc, event, idx)) > - break; > - idx++; > + nr_hw_entries = brbe_get_numrec(cpuc->percpu_pmu->reg_brbidr); > + nr_live = capture_brbe_regset(nr_hw_entries, live); > + if (event->ctx->task) { > + nr_store = task_ctx->nr_brbe_records; > + nr_store = stitch_stored_live_entries(task_ctx->store, live, nr_store, > + nr_live, nr_hw_entries); > + process_branch_entries(cpuc, event, task_ctx->store, nr_store); > + task_ctx->nr_brbe_records = 0; > + } else { > + process_branch_entries(cpuc, event, live, nr_live); > } > - > -skip_bank_1: > - cpuc->branches->branch_stack.nr = idx; > - cpuc->branches->branch_stack.hw_idx = -1ULL; > process_branch_aborts(cpuc); > > /* Unpause the buffer */ > -- > 2.25.1 > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel