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 X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D86EFC43441 for ; Mon, 26 Nov 2018 14:10:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9E3E320862 for ; Mon, 26 Nov 2018 14:10:33 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9E3E320862 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726772AbeK0BEq (ORCPT ); Mon, 26 Nov 2018 20:04:46 -0500 Received: from foss.arm.com ([217.140.101.70]:38440 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726202AbeK0BEq (ORCPT ); Mon, 26 Nov 2018 20:04:46 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 08D4222C7; Mon, 26 Nov 2018 06:10:30 -0800 (PST) Received: from [10.1.196.75] (e110467-lin.cambridge.arm.com [10.1.196.75]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id F24DD3F5A0; Mon, 26 Nov 2018 06:10:25 -0800 (PST) Subject: Re: [PATCH v2 03/20] perf/core: add PERF_PMU_CAP_EXCLUDE for exclusion capable PMUs To: Andrew Murray , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Shawn Guo , Sascha Hauer , Will Deacon , Mark Rutland , Benjamin Herrenschmidt , Thomas Gleixner , Borislav Petkov , x86@kernel.org, Ralf Baechle , Paul Burton , James Hogan , Martin Schwidefsky , Heiko Carstens , "David S . Miller" , sparclinux@vger.kernel.org, Michael Ellerman Cc: linux-s390@vger.kernel.org, linux-mips@linux-mips.org, linux-kernel@vger.kernel.org, linux-alpha@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org References: <1543230756-15319-1-git-send-email-andrew.murray@arm.com> <1543230756-15319-4-git-send-email-andrew.murray@arm.com> From: Robin Murphy Message-ID: <8c9003c3-ccbf-c342-024f-772d697a911b@arm.com> Date: Mon, 26 Nov 2018 14:10:24 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 In-Reply-To: <1543230756-15319-4-git-send-email-andrew.murray@arm.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Andrew, On 26/11/2018 11:12, Andrew Murray wrote: > Many PMU drivers do not have the capability to exclude counting events > that occur in specific contexts such as idle, kernel, guest, etc. These > drivers indicate this by returning an error in their event_init upon > testing the events attribute flags. This approach is error prone and > often inconsistent. > > Let's instead allow PMU drivers to advertise their ability to exclude > based on context via a new capability: PERF_PMU_CAP_EXCLUDE. This > allows the perf core to reject requests for exclusion events where > there is no support in the PMU. > > Signed-off-by: Andrew Murray > --- > include/linux/perf_event.h | 1 + > kernel/events/core.c | 9 +++++++++ > 2 files changed, 10 insertions(+) > > diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h > index b2e806f..69b3d65 100644 > --- a/include/linux/perf_event.h > +++ b/include/linux/perf_event.h > @@ -244,6 +244,7 @@ struct perf_event; > #define PERF_PMU_CAP_EXCLUSIVE 0x10 > #define PERF_PMU_CAP_ITRACE 0x20 > #define PERF_PMU_CAP_HETEROGENEOUS_CPUS 0x40 > +#define PERF_PMU_CAP_EXCLUDE 0x80 > > /** > * struct pmu - generic performance monitoring unit > diff --git a/kernel/events/core.c b/kernel/events/core.c > index 5a97f34..9afb33c 100644 > --- a/kernel/events/core.c > +++ b/kernel/events/core.c > @@ -9743,6 +9743,15 @@ static int perf_try_init_event(struct pmu *pmu, struct perf_event *event) > if (ctx) > perf_event_ctx_unlock(event->group_leader, ctx); > > + if (!ret) { > + if (!(pmu->capabilities & PERF_PMU_CAP_EXCLUDE) && > + event_has_any_exclude_flag(event)) { Technically this is a bisection-breaker, since no driver has this capability yet - ideally, this patch should come after all the ones introducing it to the relevant drivers (with the removal of the now-redundant code from the other drivers at the end). Alternatively, since we already have several other negative capabilities, unless there's a strong feeling against adding any more then it might work out simpler to flip it to PERF_PMU_CAP_NO_EXCLUDE, such that we only need to introduce the core check then directly replace the open-coded event checks with the capability in the appropriate drivers, and need not touch the exclusion-supporting ones at all. Robin. > + if (event->destroy) > + event->destroy(event); > + ret = -EINVAL; > + } > + } > + > if (ret) > module_put(pmu->module); > >