From patchwork Mon Nov 10 14:56:49 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Robert Bragg X-Patchwork-Id: 5266661 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4EF259F3ED for ; Mon, 10 Nov 2014 14:57:26 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 84D002015D for ; Mon, 10 Nov 2014 14:57:25 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 9C11F20109 for ; Mon, 10 Nov 2014 14:57:24 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2D7696F5F0; Mon, 10 Nov 2014 06:57:24 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-wi0-f182.google.com (mail-wi0-f182.google.com [209.85.212.182]) by gabe.freedesktop.org (Postfix) with ESMTP id CC4586F5F0 for ; Mon, 10 Nov 2014 06:57:22 -0800 (PST) Received: by mail-wi0-f182.google.com with SMTP id d1so10638301wiv.3 for ; Mon, 10 Nov 2014 06:57:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=Lw5fzZKwHDUw2Yawwj58U0NLaDXk0s1IvNq8eEQHLFQ=; b=BBpAUibhAgb/eGzj6/kHzvofVGcfplcRKf3tIWfnx686/DcuSb+yCKKY9QoMkno26d FWkVIZ8UzgHpqJyKGePxgUgUWGZDFISDgGN5c3seIwh77mBMiDNTAAcI0cgnUG/5TYEk yVT+w5txy9G9G5Vg6AOl5qkvoip5qqWgkYuolK29ZMuiwaENQuoMmT7GzorKtiZ6g4Tq CROBhz25lUCBkYM3h0h8XMT5gM2Z+jZFUzzGe2JRwbYuKL4+UnskzQLbHkQgBwuOjvT0 83voM6PhJIBanj8KDF0HfIv5CvrE2aCS6n7gxQFy9VK0TQHdVELrUDMzNRDtQ2VgpiLR 6yXg== X-Received: by 10.180.75.179 with SMTP id d19mr31523040wiw.21.1415631440815; Mon, 10 Nov 2014 06:57:20 -0800 (PST) Received: from sixbynine.org (host-80-43-156-179.as13285.net. [80.43.156.179]) by mx.google.com with ESMTPSA id wx3sm23499936wjc.19.2014.11.10.06.57.20 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 10 Nov 2014 06:57:20 -0800 (PST) From: Robert Bragg To: intel-gfx@lists.freedesktop.org Date: Mon, 10 Nov 2014 14:56:49 +0000 Message-Id: <1415631411-11726-3-git-send-email-robert@sixbynine.org> X-Mailer: git-send-email 2.1.3 In-Reply-To: <1415631411-11726-1-git-send-email-robert@sixbynine.org> References: <1415631411-11726-1-git-send-email-robert@sixbynine.org> Subject: [Intel-gfx] [RFC PATCH 2/4] perf: Add PERF_PMU_CAP_IS_DEVICE flag X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.6 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The PERF_PMU_CAP_IS_DEVICE flag provides pmu drivers a way to declare that they only monitor device specific metrics and since they don't monitor any cpu metrics then perf should bypass any cpu centric security checks, as well as disallow cpu centric attributes. Signed-off-by: Robert Bragg --- include/linux/perf_event.h | 1 + kernel/events/core.c | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 893a0d0..c2ae5bd 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -171,6 +171,7 @@ struct perf_event; * pmu::capabilities flags */ #define PERF_PMU_CAP_NO_INTERRUPT 0x01 +#define PERF_PMU_CAP_IS_DEVICE 0x02 /** * struct pmu - generic performance monitoring unit diff --git a/kernel/events/core.c b/kernel/events/core.c index 3abb368..0a3b3cf 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -3209,7 +3209,8 @@ find_get_context(struct pmu *pmu, struct task_struct *task, int cpu) if (!task) { /* Must be root to operate on a CPU event: */ - if (perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN)) + if (!(pmu->capabilities & PERF_PMU_CAP_IS_DEVICE) && + perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN)) return ERR_PTR(-EACCES); /* @@ -7253,11 +7254,6 @@ SYSCALL_DEFINE5(perf_event_open, if (err) return err; - if (!attr.exclude_kernel) { - if (perf_paranoid_kernel() && !capable(CAP_SYS_ADMIN)) - return -EACCES; - } - if (attr.freq) { if (attr.sample_freq > sysctl_perf_event_sample_rate) return -EINVAL; @@ -7316,6 +7312,37 @@ SYSCALL_DEFINE5(perf_event_open, goto err_cpus; } + if (event->pmu->capabilities & PERF_PMU_CAP_IS_DEVICE) { + + /* Don't allow cpu centric attributes... */ + if (event->attr.exclude_user || + event->attr.exclude_callchain_user || + event->attr.exclude_kernel || + event->attr.exclude_callchain_kernel || + event->attr.exclude_hv || + event->attr.exclude_idle || + event->attr.exclude_host || + event->attr.exclude_guest || + event->attr.mmap || + event->attr.comm || + event->attr.task) + return -EINVAL; + + if (attr.sample_type & + (PERF_SAMPLE_IP | + PERF_SAMPLE_TID | + PERF_SAMPLE_ADDR | + PERF_SAMPLE_CALLCHAIN | + PERF_SAMPLE_CPU | + PERF_SAMPLE_BRANCH_STACK | + PERF_SAMPLE_REGS_USER | + PERF_SAMPLE_STACK_USER)) + return -EINVAL; + } else if (!attr.exclude_kernel) { + if (perf_paranoid_kernel() && !capable(CAP_SYS_ADMIN)) + return -EACCES; + } + if (flags & PERF_FLAG_PID_CGROUP) { err = perf_cgroup_connect(pid, event, &attr, group_leader); if (err) {