Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp575705pxk; Fri, 11 Sep 2020 14:53:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJziLt17ga6j18/qOONlQxOvqDXyckosF+LZIpicBy57C3Ht8jSugGEfWrLI9nZVgj7fZDsK X-Received: by 2002:a05:6402:2d9:: with SMTP id b25mr4723289edx.131.1599861184039; Fri, 11 Sep 2020 14:53:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1599861184; cv=none; d=google.com; s=arc-20160816; b=X/vq8wcEPWjvU45HByh+G5BmLrLXTbKnLlHX74t/H4nAEKz0OOgPD6TqmI5J2YQ4g+ ycuLxz1HLaRDQd7hikVSELdP2wiEBqLKhM6aMePAQVpPZJIfTrhYACfBOmyEo2Uv39/H 7jRQG7nIqVfesALr31BhYoDnvJ4PU6s4GbGjD9QfndqMntcWOVYDu4CvEj9gRvW5LU6x V0QWI6Z2JV0leo6WvDoLKM6MnOXfrxO6miqumk5oFnXdUM79K5a7S5mBObdhbKdagtlU RxxVaa/v0sat8AWFq9UK8rTSG8LDUYC6LyeHzWOGcIipmFBAG7eNwurwTRhXBMFNSsXL 1gtg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=evx4ES4Aelq1S/aOsFR1P9EyHf1WVald+woJD7LPgyY=; b=op4z9nup0e+6blG3qPRVckmFG8tp5YWEk2BdtC4StEm6AVGEjKdyEtUPUV2TAJ1olC TFlWJKTNf+Alp3O59vT5p2Hd4YQyAPnrlDft/HcJtvCe+NStoosTIl8dPvqSOc33y4Lx aevZeRAmjPndcGU25WbkgwlZljJxcQC3/0yunpsf608CHRsSHIsoKvdUJpM8dT4fPOAU ZSzNGmjXQTWmoPndlJexRMU1LheNcx/ZmYqDBu9vqT57P3HIY5JYJLakdrEsJfkio/1p F10qksSmOdkPC0gddD5GX/HvbIUlNU0u69uLQcErNeluaBGB7la2In5981yPhV0lsMua GJ5Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id r11si2034337eju.461.2020.09.11.14.52.41; Fri, 11 Sep 2020 14:53:04 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725930AbgIKVvq (ORCPT + 99 others); Fri, 11 Sep 2020 17:51:46 -0400 Received: from mail-il1-f195.google.com ([209.85.166.195]:40198 "EHLO mail-il1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725876AbgIKVvZ (ORCPT ); Fri, 11 Sep 2020 17:51:25 -0400 Received: by mail-il1-f195.google.com with SMTP id y2so10344544ilp.7 for ; Fri, 11 Sep 2020 14:51:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=evx4ES4Aelq1S/aOsFR1P9EyHf1WVald+woJD7LPgyY=; b=EFupZm/0IFrMHl8lLrhitY+emMWkFiTuZzuO/fMGYuDcYFKvsg5riv8PIKKX3ewzwM FqfVKTsEz+foy5fvGUgm/w1RUu+5WGDtYppqT0PQqnv8SkYtDFYXAPHHHhzwD13UxMOs mKXz+K3249Jjfz5uUb4n2/EgTtkuIOUAgHPcDnWQypLxNVlfCj4/1dHx5N4okI4/xNux 5w3fob/PS3SpS0s3Z22bAp+qMFA/kwRzXNiccrtvT62fMD0UEudna/hNzAhZRxr5VXXc uWQjt1879zSepGt/QBjNRb7L8aiiCb6Y/zNESZjq1F1Xs6A4e/KQSOta1MTkeIyrpPU+ 3LZA== X-Gm-Message-State: AOAM5318Y7+jG74BYw7FenLw5BU2HEploA90NHWSLn44E0Z3HYf9Jt6x BtfIwAvJoykLcnEczx38VQ== X-Received: by 2002:a92:cd11:: with SMTP id z17mr3449198iln.31.1599861083542; Fri, 11 Sep 2020 14:51:23 -0700 (PDT) Received: from xps15.herring.priv ([64.188.179.251]) by smtp.googlemail.com with ESMTPSA id a20sm1927966ilq.57.2020.09.11.14.51.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Sep 2020 14:51:22 -0700 (PDT) From: Rob Herring To: Will Deacon , Catalin Marinas , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Jiri Olsa Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Alexander Shishkin , Namhyung Kim , Raphael Gault , Mark Rutland , Jonathan Cameron , Ian Rogers , honnappa.nagarahalli@arm.com Subject: [PATCH v3 02/10] arm64: pmu: Add function implementation to update event index in userpage Date: Fri, 11 Sep 2020 15:51:10 -0600 Message-Id: <20200911215118.2887710-3-robh@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200911215118.2887710-1-robh@kernel.org> References: <20200911215118.2887710-1-robh@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Raphael Gault In order to be able to access the counter directly for userspace, we need to provide the index of the counter using the userpage. We thus need to override the event_idx function to retrieve and convert the perf_event index to armv8 hardware index. Since the arm_pmu driver can be used by any implementation, even if not armv8, two components play a role into making sure the behaviour is correct and consistent with the PMU capabilities: * the ARMPMU_EL0_RD_CNTR flag which denotes the capability to access counter from userspace. * the event_idx call back, which is implemented and initialized by the PMU implementation: if no callback is provided, the default behaviour applies, returning 0 as index value. Signed-off-by: Raphael Gault Signed-off-by: Rob Herring --- arch/arm64/kernel/perf_event.c | 21 +++++++++++++++++++++ include/linux/perf/arm_pmu.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c index 70538ae684da..2727d126cecd 100644 --- a/arch/arm64/kernel/perf_event.c +++ b/arch/arm64/kernel/perf_event.c @@ -820,6 +820,22 @@ static void armv8pmu_clear_event_idx(struct pmu_hw_events *cpuc, clear_bit(idx - 1, cpuc->used_mask); } +static int armv8pmu_access_event_idx(struct perf_event *event) +{ + if (!(event->hw.flags & ARMPMU_EL0_RD_CNTR)) + return 0; + + /* + * We remap the cycle counter index to 32 to + * match the offset applied to the rest of + * the counter indices. + */ + if (event->hw.idx == ARMV8_IDX_CYCLE_COUNTER) + return 32; + + return event->hw.idx; +} + /* * Add an event filter to a given event. */ @@ -916,6 +932,9 @@ static int __armv8_pmuv3_map_event(struct perf_event *event, if (armv8pmu_event_is_64bit(event)) event->hw.flags |= ARMPMU_EVT_64BIT; + if (!armv8pmu_event_is_chained(event)) + event->hw.flags |= ARMPMU_EL0_RD_CNTR; + /* Only expose micro/arch events supported by this PMU */ if ((hw_event_id > 0) && (hw_event_id < ARMV8_PMUV3_MAX_COMMON_EVENTS) && test_bit(hw_event_id, armpmu->pmceid_bitmap)) { @@ -1092,6 +1111,8 @@ static int armv8_pmu_init(struct arm_pmu *cpu_pmu, char *name, cpu_pmu->set_event_filter = armv8pmu_set_event_filter; cpu_pmu->filter_match = armv8pmu_filter_match; + cpu_pmu->pmu.event_idx = armv8pmu_access_event_idx; + cpu_pmu->name = name; cpu_pmu->map_event = map_event; cpu_pmu->attr_groups[ARMPMU_ATTR_GROUP_EVENTS] = events ? diff --git a/include/linux/perf/arm_pmu.h b/include/linux/perf/arm_pmu.h index 5b616dde9a4c..74fbbbd29dc7 100644 --- a/include/linux/perf/arm_pmu.h +++ b/include/linux/perf/arm_pmu.h @@ -26,6 +26,8 @@ */ /* Event uses a 64bit counter */ #define ARMPMU_EVT_64BIT 1 +/* Allow access to hardware counter from userspace */ +#define ARMPMU_EL0_RD_CNTR 2 #define HW_OP_UNSUPPORTED 0xFFFF #define C(_x) PERF_COUNT_HW_CACHE_##_x -- 2.25.1