From patchwork Fri Apr 22 11:33:59 2016 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: 8911041 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 685A6BF29F for ; Fri, 22 Apr 2016 11:33:40 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 720A920212 for ; Fri, 22 Apr 2016 11:33:39 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 6E4BD201C7 for ; Fri, 22 Apr 2016 11:33:38 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D8E5C6EEA2; Fri, 22 Apr 2016 11:33:33 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTP id EE07C6EE9E for ; Fri, 22 Apr 2016 11:32:54 +0000 (UTC) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga103.jf.intel.com with ESMTP; 22 Apr 2016 04:32:54 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,517,1455004800"; d="scan'208";a="690445912" Received: from sourab-desktop.iind.intel.com ([10.223.82.63]) by FMSMGA003.fm.intel.com with ESMTP; 22 Apr 2016 04:32:52 -0700 From: sourab.gupta@intel.com To: intel-gfx@lists.freedesktop.org Date: Fri, 22 Apr 2016 17:03:59 +0530 Message-Id: <1461324845-25755-11-git-send-email-sourab.gupta@intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1461324845-25755-1-git-send-email-sourab.gupta@intel.com> References: <1461324845-25755-1-git-send-email-sourab.gupta@intel.com> Cc: Daniel Vetter , Sourab Gupta , Deepak S Subject: [Intel-gfx] [PATCH 10/16] 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-Spam-Status: No, score=-5.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, 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 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 | 2 ++ drivers/gpu/drm/i915/i915_perf.c | 48 +++++++++++++++++++++++++++++++++++++++- include/uapi/drm/i915_drm.h | 7 ++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 53bf148..021b34e 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1836,6 +1836,7 @@ struct i915_perf_cs_data_node { struct drm_i915_gem_request *request; u32 offset; u32 ctx_id; + u32 pid; }; struct drm_i915_private { @@ -2177,6 +2178,7 @@ struct drm_i915_private { } command_stream_buf; u32 last_ctx_id; + u32 last_pid; struct list_head node_list; spinlock_t node_list_lock; } perf; diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c index a112c20..0d347d2 100644 --- a/drivers/gpu/drm/i915/i915_perf.c +++ b/drivers/gpu/drm/i915/i915_perf.c @@ -87,6 +87,7 @@ static u32 i915_perf_stream_paranoid = true; struct oa_sample_data { u32 source; u32 ctx_id; + u32 pid; const u8 *report; }; @@ -132,6 +133,7 @@ static struct i915_oa_format gen8_plus_oa_formats[I915_OA_FORMAT_MAX] = { #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 { u32 sample_flags; @@ -313,6 +315,7 @@ static void i915_perf_command_stream_hook_oa(struct drm_i915_gem_request *req) goto out; entry->ctx_id = ctx->global_id; + entry->pid = current->pid; i915_gem_request_assign(&entry->request, req); addr = dev_priv->perf.command_stream_buf.vma->node.start + @@ -573,6 +576,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; @@ -615,6 +624,9 @@ static int append_oa_buffer_sample(struct i915_perf_stream *stream, data.ctx_id = dev_priv->perf.oa.ops.oa_buffer_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; @@ -1043,6 +1055,11 @@ static int append_oa_rcs_sample(struct i915_perf_stream *stream, dev_priv->perf.last_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; @@ -1833,6 +1850,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; @@ -1959,6 +1977,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 cs_error; } if (props->cs_mode) { @@ -1969,7 +2001,13 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream, goto cs_error; } - 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( "Ring given without requesting any CS specific property"); ret = -EINVAL; @@ -1978,6 +2016,11 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream, 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 cs_error; @@ -2631,6 +2674,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; case DRM_I915_PERF_PROP_MAX: BUG(); } diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h index e7f9479..8567373 100644 --- a/include/uapi/drm/i915_drm.h +++ b/include/uapi/drm/i915_drm.h @@ -1255,6 +1255,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 */ }; @@ -1321,6 +1327,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 * }; */