From patchwork Thu Mar 16 06:14:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: sourab.gupta@intel.com X-Patchwork-Id: 9627245 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id CF616604A9 for ; Thu, 16 Mar 2017 06:12:46 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BF9852843D for ; Thu, 16 Mar 2017 06:12:46 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B4777285EF; Thu, 16 Mar 2017 06:12:46 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 538892843D for ; Thu, 16 Mar 2017 06:12:46 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id CEBB96E9F6; Thu, 16 Mar 2017 06:12:45 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id F0D646E9F6 for ; Thu, 16 Mar 2017 06:12:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=intel.com; i=@intel.com; q=dns/txt; s=intel; t=1489644765; x=1521180765; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=3ADeCwMhpU6Y9sgmp0L8xLJoAdAR9TfS/9zSuN401r0=; b=Zhl1qFPDv6LVyXEB464tdlpXL9eEGvh3B4HLposhFd8UKY1RzKShRwho IoSYG6PqrM37BpLdJR/6QQ4bngR2hw==; Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 15 Mar 2017 23:12:44 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,170,1486454400"; d="scan'208";a="944882009" Received: from sourab-desktop.iind.intel.com ([10.223.82.140]) by orsmga003.jf.intel.com with ESMTP; 15 Mar 2017 23:12:42 -0700 From: sourab.gupta@intel.com To: intel-gfx@lists.freedesktop.org Date: Thu, 16 Mar 2017 11:44:14 +0530 Message-Id: <1489644855-25562-8-git-send-email-sourab.gupta@intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1489644855-25562-1-git-send-email-sourab.gupta@intel.com> References: <1489644855-25562-1-git-send-email-sourab.gupta@intel.com> Cc: Daniel Vetter , Sourab Gupta , Matthew Auld Subject: [Intel-gfx] [PATCH 7/8] drm/i915: Add support for having pid output with OA report 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-Virus-Scanned: ClamAV using ClamSMTP From: Sourab Gupta This patch introduces flags and adds support for having pid output with the OA reports generated through the RCS commands. When the stream is opened with pid sample type, the pid information is also captured through the command stream samples and forwarded along with the OA reports. Signed-off-by: Sourab Gupta --- drivers/gpu/drm/i915/i915_drv.h | 7 ++++++ drivers/gpu/drm/i915/i915_perf.c | 50 ++++++++++++++++++++++++++++++++++++++-- include/uapi/drm/i915_drm.h | 7 ++++++ 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 7a6dcb3..fa1d3fc 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -2165,6 +2165,12 @@ struct i915_perf_cs_sample { * @ctx_id: Context ID associated with this perf sample */ u32 ctx_id; + + /** + * @pid: PID of the process in context of which the workload was + * submitted, pertaining to this perf sample + */ + u32 pid; }; struct intel_cdclk_state { @@ -2620,6 +2626,7 @@ struct drm_i915_private { } command_stream_buf; u32 last_cmd_stream_ctx_id; + u32 last_pid; struct list_head cs_samples; spinlock_t sample_lock; } perf; diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c index 208179f..6e8af2d 100644 --- a/drivers/gpu/drm/i915/i915_perf.c +++ b/drivers/gpu/drm/i915/i915_perf.c @@ -289,6 +289,7 @@ struct oa_sample_data { u32 source; u32 ctx_id; + u32 pid; const u8 *report; }; @@ -342,6 +343,7 @@ struct oa_sample_data { #define SAMPLE_OA_REPORT (1<<0) #define SAMPLE_OA_SOURCE_INFO (1<<1) #define SAMPLE_CTX_ID (1<<2) +#define SAMPLE_PID (1<<3) /** * struct perf_open_properties - for validated properties given to open a stream @@ -532,6 +534,7 @@ static void i915_perf_command_stream_hook_oa(struct i915_perf_stream *stream, } sample->ctx_id = ctx->hw_id; + sample->pid = current->pid; i915_gem_request_assign(&sample->request, request); insert_perf_sample(dev_priv, sample); @@ -977,6 +980,12 @@ static int append_oa_sample(struct i915_perf_stream *stream, buf += 4; } + if (sample_flags & SAMPLE_PID) { + if (copy_to_user(buf, &data->pid, 4)) + return -EFAULT; + buf += 4; + } + if (sample_flags & SAMPLE_OA_REPORT) { if (copy_to_user(buf, data->report, report_size)) return -EFAULT; @@ -1013,6 +1022,9 @@ static int append_oa_buffer_sample(struct i915_perf_stream *stream, if (sample_flags & SAMPLE_CTX_ID) data.ctx_id = dev_priv->perf.oa.ops.get_ctx_id(stream, report); + if (sample_flags & SAMPLE_PID) + data.pid = dev_priv->perf.last_pid; + if (sample_flags & SAMPLE_OA_REPORT) data.report = report; @@ -1589,6 +1601,11 @@ static int append_oa_rcs_sample(struct i915_perf_stream *stream, dev_priv->perf.last_cmd_stream_ctx_id = node->ctx_id; } + if (sample_flags & SAMPLE_PID) { + data.pid = node->pid; + dev_priv->perf.last_pid = node->pid; + } + if (sample_flags & SAMPLE_OA_REPORT) data.report = report; @@ -2665,6 +2682,7 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream, struct drm_i915_private *dev_priv = stream->dev_priv; bool require_oa_unit = props->sample_flags & (SAMPLE_OA_REPORT | SAMPLE_OA_SOURCE_INFO); + bool require_cs_mode = props->sample_flags & SAMPLE_PID; bool cs_sample_data = props->sample_flags & SAMPLE_OA_REPORT; int ret; @@ -2790,6 +2808,20 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream, if (props->sample_flags & SAMPLE_CTX_ID) { stream->sample_flags |= SAMPLE_CTX_ID; stream->sample_size += 4; + + /* + * NB: it's meaningful to request SAMPLE_CTX_ID with just CS + * mode or periodic OA mode sampling but we don't allow + * SAMPLE_CTX_ID without either mode + */ + if (!require_oa_unit) + require_cs_mode = true; + } + + if (require_cs_mode && !props->cs_mode) { + DRM_ERROR("PID sampling requires a ring to be specified"); + ret = -EINVAL; + goto err_enable; } if (props->cs_mode) { @@ -2800,13 +2832,25 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream, goto err_enable; } - if (!(props->sample_flags & SAMPLE_CTX_ID)) { + /* + * The only time we should allow enabling CS mode if it's not + * strictly required, is if SAMPLE_CTX_ID has been requested + * as it's usable with periodic OA or CS sampling. + */ + if (!require_cs_mode && + !(props->sample_flags & SAMPLE_CTX_ID)) { DRM_ERROR( "Stream engine given without requesting any CS specific property"); ret = -EINVAL; goto err_enable; } stream->cs_mode = true; + + if (props->sample_flags & SAMPLE_PID) { + stream->sample_flags |= SAMPLE_PID; + stream->sample_size += 4; + } + ret = alloc_command_stream_buf(dev_priv); if (ret) goto err_enable; @@ -3601,7 +3645,9 @@ static int read_properties_unlocked(struct drm_i915_private *dev_priv, case DRM_I915_PERF_PROP_SAMPLE_CTX_ID: props->sample_flags |= SAMPLE_CTX_ID; break; - + case DRM_I915_PERF_PROP_SAMPLE_PID: + props->sample_flags |= SAMPLE_PID; + break; default: MISSING_CASE(id); DRM_DEBUG("Unknown i915 perf property ID\n"); diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h index 4cbefc8..25cf612 100644 --- a/include/uapi/drm/i915_drm.h +++ b/include/uapi/drm/i915_drm.h @@ -1373,6 +1373,12 @@ enum drm_i915_perf_property_id { */ DRM_I915_PERF_PROP_SAMPLE_CTX_ID, + /** + * The value of this property set to 1 requests inclusion of pid in the + * perf sample data. + */ + DRM_I915_PERF_PROP_SAMPLE_PID, + DRM_I915_PERF_PROP_MAX /* non-ABI */ }; @@ -1440,6 +1446,7 @@ enum drm_i915_perf_record_type { * * { u32 source_info; } && DRM_I915_PERF_PROP_SAMPLE_OA_SOURCE * { u32 ctx_id; } && DRM_I915_PERF_PROP_SAMPLE_CTX_ID + * { u32 pid; } && DRM_I915_PERF_PROP_SAMPLE_PID * { u32 oa_report[]; } && DRM_I915_PERF_PROP_SAMPLE_OA * }; */