From patchwork Wed Nov 19 17:38:06 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Vetter X-Patchwork-Id: 5339841 Return-Path: X-Original-To: patchwork-dri-devel@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 5C8769F2ED for ; Wed, 19 Nov 2014 17:37:59 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 870E620172 for ; Wed, 19 Nov 2014 17:37:58 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 8C4AF201EF for ; Wed, 19 Nov 2014 17:37:57 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 6B69B6E658; Wed, 19 Nov 2014 09:37:56 -0800 (PST) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wg0-f43.google.com (mail-wg0-f43.google.com [74.125.82.43]) by gabe.freedesktop.org (Postfix) with ESMTP id 9EBE56E658 for ; Wed, 19 Nov 2014 09:37:54 -0800 (PST) Received: by mail-wg0-f43.google.com with SMTP id l18so1406396wgh.30 for ; Wed, 19 Nov 2014 09:37:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=from:to:cc:subject:date:message-id; bh=OQFo6+bzVrLBr6irv6xw28KmVKSveLEjqp2Dve7YcEw=; b=hbom8c4jhrt3hQiChWA8xyz1KdqszbxtwFvIleTymJ4oNX0T91tZF4JLeHjwbXR39G NfmzsCCR88Ey/JksT8VtxWEuYXpFpeWfRGeligbLwepi0rwhUTaFLP//f5Lzngo+ba6a hK0kg61eRRy7SKRsffojVa6/s5yQIb5FgLf/s= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=OQFo6+bzVrLBr6irv6xw28KmVKSveLEjqp2Dve7YcEw=; b=E9JZmMcLZN4ohJr8dgXfw0rrzCn0JrWVminSRM/WuuEMommdrbEOXoOirSXZON+kVD BZlQX1XzvsU0Xt4FE7TgN0q5GILA56omEfZSxAyKQ4Mf4+71NyfrYwMVTrQNqGLhfqgv vp92fh2fdgqTEyejQTMgHc4yD+rDkgeO1YQS3O1kRSTojD5vK7839gMYiKImBs1oCjF5 4TPIm2F/SXYJAIkGOBAurutLdHciug2j0HB6/OrkyJHPaT5MnqcludMSO5Hwbq9EmUvT vquazlVg7zCB3nKsEBV8SF0Xf8bioDobOh0suMwY0zXmB7rKu8Ob6fadxyKVHYM1SI6R VLJg== X-Gm-Message-State: ALoCoQlcYn8bHapGNOxOPJCimTHA2buJ7SYSWgdvK0WIC5mP+ZoqiZZwOOouOW0u6/vm8ajjbNGy X-Received: by 10.180.206.4 with SMTP id lk4mr7769732wic.47.1416418673033; Wed, 19 Nov 2014 09:37:53 -0800 (PST) Received: from phenom.ffwll.local (84-73-67-144.dclient.hispeed.ch. [84.73.67.144]) by mx.google.com with ESMTPSA id h2sm567617wix.5.2014.11.19.09.37.51 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Nov 2014 09:37:52 -0800 (PST) From: Daniel Vetter To: DRI Development Subject: [PATCH 1/6] drm/atomic: Ensure that drm_connector_index is stable Date: Wed, 19 Nov 2014 18:38:06 +0100 Message-Id: <1416418691-24747-1-git-send-email-daniel.vetter@ffwll.ch> X-Mailer: git-send-email 2.1.1 Cc: Daniel Vetter , Intel Graphics Development , Daniel Vetter X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED, T_DKIM_INVALID, T_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 I've totally forgotten that with DP MST connectors can now be hotplugged. And failed to adapt Rob's drm_atomic_state code (which predates connector hotplugging) to the new realities. The first step is to make sure that the connector indices used to access the arrays of pointers are stable. The connection mutex gives us enough guarantees for that, which means we won't unecessarily block on concurrent modesets or background probing. So add a locking WARN_ON and shuffle the code slightly to make sure we always hold the right lock. Signed-off-by: Daniel Vetter Reviewed-by: Rob Clark --- drivers/gpu/drm/drm_atomic.c | 8 ++++---- drivers/gpu/drm/drm_crtc.c | 5 +++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index ed22a719440f..90b2d1644bd7 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -295,15 +295,15 @@ drm_atomic_get_connector_state(struct drm_atomic_state *state, struct drm_mode_config *config = &connector->dev->mode_config; struct drm_connector_state *connector_state; + ret = drm_modeset_lock(&config->connection_mutex, state->acquire_ctx); + if (ret) + return ERR_PTR(ret); + index = drm_connector_index(connector); if (state->connector_states[index]) return state->connector_states[index]; - ret = drm_modeset_lock(&config->connection_mutex, state->acquire_ctx); - if (ret) - return ERR_PTR(ret); - connector_state = connector->funcs->atomic_duplicate_state(connector); if (!connector_state) return ERR_PTR(-ENOMEM); diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 56737e74b59d..5c878f172365 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -867,6 +867,8 @@ int drm_connector_init(struct drm_device *dev, drm_connector_get_cmdline_mode(connector); + /* We should add connectors at the end to avoid upsetting the connector + * index too much. */ list_add_tail(&connector->head, &dev->mode_config.connector_list); dev->mode_config.num_connector++; @@ -930,6 +932,9 @@ unsigned int drm_connector_index(struct drm_connector *connector) { unsigned int index = 0; struct drm_connector *tmp; + struct drm_mode_config *config = &connector->dev->mode_config; + + WARN_ON(!drm_modeset_is_locked(&config->connection_mutex)); list_for_each_entry(tmp, &connector->dev->mode_config.connector_list, head) { if (tmp == connector)