Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp190329pxk; Wed, 9 Sep 2020 02:51:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyIArOy1cArZPjcxMWDxXhHM8nUCpdqjp36tUrBcuUM5qIHo0a1Z5KMNtr/V6acZgp0/WNz X-Received: by 2002:a17:906:eced:: with SMTP id qt13mr2698477ejb.357.1599645060935; Wed, 09 Sep 2020 02:51:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1599645060; cv=none; d=google.com; s=arc-20160816; b=oWQusJFNC9vJsSWeC0Y+/S7yld/LYWxjUO1GbWluFfdELt7jkDLQ84cZ+u35PGtgyB Aro4TqwEDtGeRBuqOgm27Srs8YNzQLSa7QHjFsKWFIpMecd4bnPDY4NBTJS3vItBznrC WOlUnGkgyKbUSx2shKzpQ4rFdYRQt6WyA9Z0+Ppftxju3JgNM9gxIu2ZAZJUYpUIk4mc zdc30P/2i3NJeBc7zMCrGAlloa6NjlUMijFf439UdYZPL0BdHj9BdXq1OvSYOapxIZ52 fAInTII2nHnsZH70fjb4KbZ96DkOf2L5b4rb9IRMP2iMswVaFIsPc3zIIfd54g4LNDUO FTSA== 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 :message-id:date:subject:cc:to:from:ironport-sdr:ironport-sdr; bh=+YsnaeleAfMvhloeXTB2CUlIFLrdVfh0AYGQjDn+Vms=; b=Bfv/b/D0A1G23/g+sp1ZcFyeB+qXocycKFh4tbKNg+PqxhFTwa1KgRRMXqvhcDySWV 9fCqJTS8hr7beQWAwkVPIStLC65awMzGcSpn+VaLnzAIGjlVCcOqFlQjIpL5C1zvI7M0 lH0gHcA/L3EzBQ3jTUy59ZXE1mbzaCWa1mx5LLXn7Uz+hBAApzUZ59hMAQijnTgZK+wG /b4eWa1mwaa1W3b+l/tZVjwyvjiRcs1ANA061rZRC6rT8LmhxC3QxvhFjrDWKbKXRibj uAHZ9UqWDAi43X+9mD6p2o5q1HWR3bn0s8zzsjobpsMa2LiVgCYy10sFkOgx3MLH2sfa 4vyw== 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id j2si1108792edt.312.2020.09.09.02.50.38; Wed, 09 Sep 2020 02:51:00 -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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726426AbgIIJrz (ORCPT + 99 others); Wed, 9 Sep 2020 05:47:55 -0400 Received: from mga07.intel.com ([134.134.136.100]:26311 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726036AbgIIJry (ORCPT ); Wed, 9 Sep 2020 05:47:54 -0400 IronPort-SDR: RO/bgEntUDYW5lkxOuWxu1wb8+SLTCBoFoDw0RYNEzeawNi5bJEMhRVRqGK995dEOyqGASvRCb DGZDyAZw83Bg== X-IronPort-AV: E=McAfee;i="6000,8403,9738"; a="222504574" X-IronPort-AV: E=Sophos;i="5.76,409,1592895600"; d="scan'208";a="222504574" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Sep 2020 02:47:51 -0700 IronPort-SDR: K9Fcsi9tYeitJtcKN/OY3XAgAK6EsL4Nm4EaFACBJ0KxYfVDXRnfO+3OVAgt3pvncWYXpD36m0 9Dodejd00VIQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.76,409,1592895600"; d="scan'208";a="300098165" Received: from black.fi.intel.com (HELO black.fi.intel.com.) ([10.237.72.28]) by orsmga003.jf.intel.com with ESMTP; 09 Sep 2020 02:47:49 -0700 From: Alexander Shishkin To: Peter Zijlstra , Arnaldo Carvalho de Melo Cc: Ingo Molnar , linux-kernel@vger.kernel.org, Jiri Olsa , Mathieu Poirier , adrian.hunter@intel.com, Alexander Shishkin Subject: [PATCH] perf: Turn kernel address filters into linear address filters Date: Wed, 9 Sep 2020 12:47:43 +0300 Message-Id: <20200909094743.24698-1-alexander.shishkin@linux.intel.com> X-Mailer: git-send-email 2.28.0 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 One thing that the address filters can't do at the moment is cover anonymous mappings. Apparently, there is code out there that generates executable code in anonymous mappings and executes it in place. And at the moment we only allow file-based address filters for userspace. The easiest way to do this is to repurpose the kernel filters and allow those to be used on userspace addresses. The Intel PT driver at the moment does enforce that non-file-based filters are only used with kernel addresses, so that needs to be corrected. The Coresight ETM driver doesn't enforce that, so no changes needed there. No tooling changes required, either. Signed-off-by: Alexander Shishkin --- arch/x86/events/intel/pt.c | 13 ------------- kernel/events/core.c | 22 ++++++++++------------ 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/arch/x86/events/intel/pt.c b/arch/x86/events/intel/pt.c index e94af4a54d0d..2d981dbaac1b 100644 --- a/arch/x86/events/intel/pt.c +++ b/arch/x86/events/intel/pt.c @@ -1347,11 +1347,6 @@ static void pt_addr_filters_fini(struct perf_event *event) event->hw.addr_filters = NULL; } -static inline bool valid_kernel_ip(unsigned long ip) -{ - return virt_addr_valid(ip) && kernel_ip(ip); -} - static int pt_event_addr_filters_validate(struct list_head *filters) { struct perf_addr_filter *filter; @@ -1366,14 +1361,6 @@ static int pt_event_addr_filters_validate(struct list_head *filters) filter->action == PERF_ADDR_FILTER_ACTION_START) return -EOPNOTSUPP; - if (!filter->path.dentry) { - if (!valid_kernel_ip(filter->offset)) - return -EINVAL; - - if (!valid_kernel_ip(filter->offset + filter->size)) - return -EINVAL; - } - if (++range > intel_pt_validate_hw_cap(PT_CAP_num_address_ranges)) return -EOPNOTSUPP; } diff --git a/kernel/events/core.c b/kernel/events/core.c index 57efe3b21e29..8579654d3fc7 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -9989,9 +9989,9 @@ enum { IF_ACT_START, IF_ACT_STOP, IF_SRC_FILE, - IF_SRC_KERNEL, + IF_SRC_LINEAR, IF_SRC_FILEADDR, - IF_SRC_KERNELADDR, + IF_SRC_LINEARADDR, }; enum { @@ -10005,9 +10005,9 @@ static const match_table_t if_tokens = { { IF_ACT_START, "start" }, { IF_ACT_STOP, "stop" }, { IF_SRC_FILE, "%u/%u@%s" }, - { IF_SRC_KERNEL, "%u/%u" }, + { IF_SRC_LINEAR, "%u/%u" }, { IF_SRC_FILEADDR, "%u@%s" }, - { IF_SRC_KERNELADDR, "%u" }, + { IF_SRC_LINEARADDR, "%u" }, { IF_ACT_NONE, NULL }, }; @@ -10022,7 +10022,7 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr, char *start, *orig, *filename = NULL; substring_t args[MAX_OPT_ARGS]; int state = IF_STATE_ACTION, token; - unsigned int kernel = 0; + unsigned int linear = 0; int ret = -EINVAL; orig = fstr = kstrdup(fstr, GFP_KERNEL); @@ -10059,9 +10059,9 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr, state = IF_STATE_SOURCE; break; - case IF_SRC_KERNELADDR: - case IF_SRC_KERNEL: - kernel = 1; + case IF_SRC_LINEARADDR: + case IF_SRC_LINEAR: + linear = 1; /* fall through */ case IF_SRC_FILEADDR: @@ -10074,7 +10074,7 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr, if (ret) goto fail; - if (token == IF_SRC_KERNEL || token == IF_SRC_FILE) { + if (token == IF_SRC_LINEAR || token == IF_SRC_FILE) { *args[1].to = 0; ret = kstrtoul(args[1].from, 0, &filter->size); if (ret) @@ -10105,8 +10105,6 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr, */ if (state == IF_STATE_END) { ret = -EINVAL; - if (kernel && event->attr.exclude_kernel) - goto fail; /* * ACTION "filter" must have a non-zero length region @@ -10116,7 +10114,7 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr, !filter->size) goto fail; - if (!kernel) { + if (!linear) { if (!filename) goto fail; -- 2.28.0