From patchwork Thu Nov 7 21:03:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Paul X-Patchwork-Id: 11233777 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E8233139A for ; Thu, 7 Nov 2019 21:03:28 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CFCAF21D79 for ; Thu, 7 Nov 2019 21:03:28 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CFCAF21D79 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=poorly.run Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1BA136F7C2; Thu, 7 Nov 2019 21:03:26 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-yw1-xc44.google.com (mail-yw1-xc44.google.com [IPv6:2607:f8b0:4864:20::c44]) by gabe.freedesktop.org (Postfix) with ESMTPS id 258516F7BB for ; Thu, 7 Nov 2019 21:03:24 +0000 (UTC) Received: by mail-yw1-xc44.google.com with SMTP id p128so1115445ywc.11 for ; Thu, 07 Nov 2019 13:03:24 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=TuhlZU4MLBpT2FZLEA5wlpltGz8l0CcErofYatLylqE=; b=jLDy5bouZYIhguPJg9lB+I5quPKRtXtLwSldPDjs4IBXGHWDKynHg0f2nPiCq0y9t3 3pO6ShX38PtEq75zt3+D6GSaXygwtVOFhx9R48UR3XjxjeqHFQlM1N8p6Z/2uuZUIC6w JNg+41HwVfLzZiV8sUpoq4xq3n0fG7HrTZ5ygaPq3hm+Yiu+7giAEqoQLiBfAQR0Ai5J Vcl09T69uc2SM02aESATgWpr8MJdizHQtfslJ6Q33CzsP59EhApYtKezWmlKWr16N57u huOfSsSSEGzPnmAqIayKqjgHIUYtKnSi7gmUI62pMFl3/o/l13Zg8eVlogrqcu3Em8dD 9AKg== X-Gm-Message-State: APjAAAVK6pj5EeuNOuyiKw5IGRmwELZPFIn6J5Z25/FU/PJWmfFWY9Pa hrF8fdJCJuEzSqsHCA/NE4/Tt1Yerlo= X-Google-Smtp-Source: APXvYqy63NYJbFcfRtVKUKzqDVf4mprNJJzrb6yLolBs2cyoJgP44AQxLCvNtKGbtqREGJ6nJhJjRw== X-Received: by 2002:a81:6fd6:: with SMTP id k205mr4313950ywc.401.1573160603071; Thu, 07 Nov 2019 13:03:23 -0800 (PST) Received: from rosewood.cam.corp.google.com ([2620:0:1013:11:89c6:2139:5435:371d]) by smtp.gmail.com with ESMTPSA id r14sm1064196ywl.97.2019.11.07.13.03.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 Nov 2019 13:03:22 -0800 (PST) From: Sean Paul To: dri-devel@lists.freedesktop.org Subject: [PATCH 3/6] drm: trace: Add trace events for atomic state lifetime Date: Thu, 7 Nov 2019 16:03:02 -0500 Message-Id: <20191107210316.143216-4-sean@poorly.run> X-Mailer: git-send-email 2.24.0.rc1.363.gb1bccd3e3d-goog In-Reply-To: <20191107210316.143216-1-sean@poorly.run> References: <20191107210316.143216-1-sean@poorly.run> MIME-Version: 1.0 X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=poorly.run; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TuhlZU4MLBpT2FZLEA5wlpltGz8l0CcErofYatLylqE=; b=K34R4yVAdDFJhBqw2gyb2Ab4iHyk4vPJHqWnKexmfwuKP2/JTP/xFkTQpqrCPi4X/u louE6dk/mEXtpkctljjgj1aHL8oLwBvOrX7FqG5Ik27bRAYYVXJYY0naw9EAuW4Gqe9m qWBlS3n2ClWq36BRIODqSW36s5vzminTsik85YDDQSK9ylIKQdMP5GAS932/8rp0ovxP m1CfUaRGDpJSmi0f0hBFfBFnHEGt4aMBKH5cRGcVWUyCOxsFopBL9OJjsdkFSz3yacYi zwzK+w4iO45G3eENL+I4v9j8gBlnTW78q3r/O8YjJmCzMvou0PHoK62YxBZLRTg8hFrU mFdw== X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: daniel.vetter@ffwll.ch, Sean Paul , tzimmermann@suse.de Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Sean Paul Mirror some atomic debug messages which track a state through allocation/clear/check/commit/free Change-Id: I0387ddf4b2f1d84137a5b471e347878c04c6d0af Signed-off-by: Sean Paul --- drivers/gpu/drm/drm_atomic.c | 19 +++++--- drivers/gpu/drm/drm_trace.h | 84 ++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 14aeaf7363210..93ca64af67f55 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -41,6 +41,7 @@ #include "drm_crtc_internal.h" #include "drm_internal.h" +#include "drm_trace.h" void __drm_crtc_commit_free(struct kref *kref) { @@ -118,10 +119,11 @@ struct drm_atomic_state * drm_atomic_state_alloc(struct drm_device *dev) { struct drm_mode_config *config = &dev->mode_config; + struct drm_atomic_state *state; - if (!config->funcs->atomic_state_alloc) { - struct drm_atomic_state *state; - + if (config->funcs->atomic_state_alloc) { + state = config->funcs->atomic_state_alloc(dev); + } else { state = kzalloc(sizeof(*state), GFP_KERNEL); if (!state) return NULL; @@ -129,10 +131,10 @@ drm_atomic_state_alloc(struct drm_device *dev) kfree(state); return NULL; } - return state; } - return config->funcs->atomic_state_alloc(dev); + drm_trace(atomic, alloc, state); + return state; } EXPORT_SYMBOL(drm_atomic_state_alloc); @@ -239,6 +241,7 @@ void drm_atomic_state_clear(struct drm_atomic_state *state) struct drm_device *dev = state->dev; struct drm_mode_config *config = &dev->mode_config; + drm_trace(atomic, clear, state); if (config->funcs->atomic_state_clear) config->funcs->atomic_state_clear(state); else @@ -261,6 +264,7 @@ void __drm_atomic_state_free(struct kref *ref) drm_atomic_state_clear(state); DRM_DEBUG_ATOMIC("Freeing atomic state %p\n", state); + drm_trace(atomic, free, state); if (config->funcs->atomic_state_free) { config->funcs->atomic_state_free(state); @@ -1145,6 +1149,7 @@ int drm_atomic_check_only(struct drm_atomic_state *state) int i, ret = 0; DRM_DEBUG_ATOMIC("checking %p\n", state); + drm_trace(atomic, check, state); for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) { ret = drm_atomic_plane_check(old_plane_state, new_plane_state); @@ -1179,6 +1184,7 @@ int drm_atomic_check_only(struct drm_atomic_state *state) if (ret) { DRM_DEBUG_ATOMIC("atomic driver check for %p failed: %d\n", state, ret); + drm_trace_err(atomic, check_failed, state); return ret; } } @@ -1193,6 +1199,7 @@ int drm_atomic_check_only(struct drm_atomic_state *state) } } + drm_trace(atomic, check_passed, state); return 0; } EXPORT_SYMBOL(drm_atomic_check_only); @@ -1221,6 +1228,7 @@ int drm_atomic_commit(struct drm_atomic_state *state) return ret; DRM_DEBUG_ATOMIC("committing %p\n", state); + drm_trace(atomic, commit, state); return config->funcs->atomic_commit(state->dev, state, false); } @@ -1250,6 +1258,7 @@ int drm_atomic_nonblocking_commit(struct drm_atomic_state *state) return ret; DRM_DEBUG_ATOMIC("committing %p nonblocking\n", state); + drm_trace(atomic, commit_nonblock, state); return config->funcs->atomic_commit(state->dev, state, true); } diff --git a/drivers/gpu/drm/drm_trace.h b/drivers/gpu/drm/drm_trace.h index 19e5f04210586..5d56365d0b439 100644 --- a/drivers/gpu/drm/drm_trace.h +++ b/drivers/gpu/drm/drm_trace.h @@ -2,6 +2,9 @@ #if !defined(_DRM_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ) #define _DRM_TRACE_H_ +#include + +#include #include #include #include @@ -59,6 +62,12 @@ enum drm_trace_event_class { * vblanks and vblank events. */ drm_trace_class_vblank = BIT(1), + + /** + * @drm_trace_class_atomic: This class is used to track the top-level + * atomic state from alloc to free and everywhere in between. + */ + drm_trace_class_atomic = BIT(2), }; /** @@ -150,6 +159,81 @@ DEFINE_EVENT(class_drm_vblank_event, drm_vblank_event_delivered, TP_ARGS(event_class, file, crtc, seq) ); +DECLARE_EVENT_CLASS(class_drm_atomic, + TP_PROTO(unsigned int event_class, + const struct drm_atomic_state *state), + TP_ARGS(event_class, state), + TP_STRUCT__entry( + __field(unsigned int, event_class) + __field(const struct drm_atomic_state *, state) + __field(unsigned int, ref) + __field(bool, allow_modeset) + __field(bool, legacy_cursor_update) + __field(bool, async_update) + __field(bool, duplicated) + __field(unsigned int, num_connector) + __field(unsigned int, num_private_objs) + ), + TP_fast_assign( + __entry->event_class = event_class; + __entry->state = state; /* Do not de-reference! */ + __entry->ref = kref_read(&state->ref); + __entry->allow_modeset = state->allow_modeset; + __entry->legacy_cursor_update = state->legacy_cursor_update; + __entry->async_update = state->async_update; + __entry->duplicated = state->duplicated; + __entry->num_connector = state->num_connector; + __entry->num_private_objs = state->num_private_objs; + ), + TP_printk("state=%pK ref=%d allow_modeset=%d legacy_cursor=%d " + "async_update=%d duplicated=%d num_conn=%d num_priv_objs=%d", + __entry->state, __entry->ref, __entry->allow_modeset, + __entry->legacy_cursor_update, __entry->async_update, + __entry->duplicated, __entry->num_connector, + __entry->num_private_objs) +); +DEFINE_EVENT_PRINT(class_drm_atomic, drm_atomic_alloc, + TP_PROTO(unsigned int event_class, + const struct drm_atomic_state *state), + TP_ARGS(event_class, state), + TP_printk("state=%pK", __entry->state) +); +DEFINE_EVENT(class_drm_atomic, drm_atomic_clear, + TP_PROTO(unsigned int event_class, + const struct drm_atomic_state *state), + TP_ARGS(event_class, state) +); +DEFINE_EVENT(class_drm_atomic, drm_atomic_free, + TP_PROTO(unsigned int event_class, + const struct drm_atomic_state *state), + TP_ARGS(event_class, state) +); +DEFINE_EVENT(class_drm_atomic, drm_atomic_check, + TP_PROTO(unsigned int event_class, + const struct drm_atomic_state *state), + TP_ARGS(event_class, state) +); +DEFINE_EVENT(class_drm_atomic, drm_atomic_commit, + TP_PROTO(unsigned int event_class, + const struct drm_atomic_state *state), + TP_ARGS(event_class, state) +); +DEFINE_EVENT(class_drm_atomic, drm_atomic_commit_nonblock, + TP_PROTO(unsigned int event_class, + const struct drm_atomic_state *state), + TP_ARGS(event_class, state) +); +DEFINE_EVENT(class_drm_atomic, drm_atomic_check_passed, + TP_PROTO(unsigned int event_class, + const struct drm_atomic_state *state), + TP_ARGS(event_class, state) +); +DEFINE_EVENT(class_drm_atomic, drm_atomic_check_failed, + TP_PROTO(unsigned int event_class, + const struct drm_atomic_state *state), + TP_ARGS(event_class, state) +); + #endif /* _DRM_TRACE_H_ */ /* This part must be outside protection */