Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp1643295imm; Tue, 22 May 2018 07:14:15 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrushOIQybzEYa/+maEPoEWTXEO/pxwAlqLEaTFFXrv24iVH2c6ZAatO99B+O74SLNvyuJ3 X-Received: by 2002:a17:902:ab98:: with SMTP id f24-v6mr24500069plr.144.1526998455235; Tue, 22 May 2018 07:14:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526998455; cv=none; d=google.com; s=arc-20160816; b=h8l8QotErW/QOPj7p/ckAkuCKjEwg90EOgATfjTZCKP62y8o34vTdXcYKnrAD2vemG AavXJMhzv0oJS6ixzm3hoCSNoQrUGKuJQIyyuRwM0nFgc0B+a1sLj7GsFjSmykQpgzQ9 b26ZtNb55IuOP5+jbgHfVbH9rjYSz2XmB/epGrbSYLIZEOpBHEhfZ9grglzpllPWrCaz uriZJW4TtxV+0rvBl493p89oKacmk/MKj++MjuhuOyZcrr25NzrdQd6RM4schEvmXsMT iJJ7oaoKebw8+lB2sCcZExRer5Sp6o15sKDvFMnS5s5ctPWG/0wM0YUAb/mCf0C7yllv l3aQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=EjYInDPr33WDwWzCeMWH7UuNSp7NlVL7PkMtYFHupUs=; b=JP5ZZZErRh6fCXBhM1JBdvY1MC+aptPA9Na0zv6bICv9/epKmGwOfjhc2+VIwHRuKl YZL1C50FftC1uckQWzQSqIypMB/wI8Eqzvi8LCTN9bsS/lQWaXLSuAhrTEe/GXhO/wvY VZs9xxaSqzXs9+XQFxY99hnh0ciq1F94OlwvOJeL7qdg00w9TEmy88sJmk8ULPPznGnf b1+JCiHgd2FUo0+oAdqwbW7NDhaKkwFtrZPpzDCUXQIHfTNpo1VDpQUF4tNanexYm8sF E/pIGUkQm1aJgTFcoVH4NFlW6BS37fmxdkcT7Pnn0U1wWFfAqQqEf2UTxA5bycROtzBO PYRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=iA+pJlvB; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y1-v6si13247626pge.248.2018.05.22.07.13.48; Tue, 22 May 2018 07:14:15 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=iA+pJlvB; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751586AbeEVONV (ORCPT + 99 others); Tue, 22 May 2018 10:13:21 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:34687 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751236AbeEVONU (ORCPT ); Tue, 22 May 2018 10:13:20 -0400 Received: by mail-wm0-f66.google.com with SMTP id a137-v6so16682713wme.1 for ; Tue, 22 May 2018 07:13:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=EjYInDPr33WDwWzCeMWH7UuNSp7NlVL7PkMtYFHupUs=; b=iA+pJlvBvzBk+0UHQrCkrn1eTH7RrsGm7XlN9R2LYfzFWw2aDSHbZP7X9n1pGCkSnP gctHwyzbvHgvXi7fHlaEha69IDu1yVVhIPxzbl4fSuY/gLWlrn0EMnUgQ9ouOxmqudf8 7b0XGHVgiEEbLeE3CakpHzt/Iys6bH2Nn3FRt0+CzHApjmvj9FBA8hPt5bKXN9d/6WE0 nCgsAXRE0Vi0niyjnUEXRcBtB7aAnFoci4rogJ7XxuBOUcgiiMEzbHpLx9F8cZ0pPEyG jVScZOu7830f9Y1nK/AIdEkAUiciif7YNcV3xlPSJU4XZ06UIxVLYNYJPnpkpO3gqOl5 UKHQ== 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:mime-version :content-transfer-encoding; bh=EjYInDPr33WDwWzCeMWH7UuNSp7NlVL7PkMtYFHupUs=; b=B1zVy6n6t5z1hdbrJEyTfkncqE2cZnEgnORll6gFK0q/fr00dgZ3F4kao+0JMtuuF5 Ov/LcWaAK9FewvZ+kLT7RVZyDFTk/VjDy+iYmMX/Seny1w2KVjMSMbsBPL1AxIRQo7Ql uYYAX2mXYlkcUPZalZzx6g5hwelDdA/c3m2UCMH5M1YWinQCRN3q1+hG3JaKa1TCwJ8X /Ylp/myymx+ihb5l1RArAEsiQdWb5taM9WGqLdSKBqwfYQGT6t3Ua++xN+SwNy4UyRWr H4dFDzojfJhxYjfoWyqqe1YJFby4AO2bAsvDaaolaMfwLJPQo/XJuOCIXAbgxDsGknB8 9Wfg== X-Gm-Message-State: ALKqPweqxnZJiaKYlo+1PeHkYSvUGRQqU0V/p1JwapvjL0kvIASKvGsA RwruzQjcQX7vZelCbbRpp9aIog== X-Received: by 2002:a2e:8993:: with SMTP id c19-v6mr15602191lji.123.1526998398560; Tue, 22 May 2018 07:13:18 -0700 (PDT) Received: from a2k-HP-ProDesk-600-G2-SFF.kyiv.epam.com (ll-54.209.223.85.sovam.net.ua. [85.223.209.54]) by smtp.gmail.com with ESMTPSA id k127-v6sm3956016lfe.21.2018.05.22.07.13.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 22 May 2018 07:13:17 -0700 (PDT) From: Oleksandr Andrushchenko To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, airlied@linux.ie, daniel.vetter@intel.com, seanpaul@chromium.org, gustavo@padovan.org Cc: andr2000@gmail.com, Oleksandr Andrushchenko , =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Subject: [PATCH] drm: Fix possible race conditions while unplugging DRM device Date: Tue, 22 May 2018 17:13:04 +0300 Message-Id: <20180522141304.18646-1-andr2000@gmail.com> X-Mailer: git-send-email 2.17.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Oleksandr Andrushchenko When unplugging a hotpluggable DRM device we first unregister it with drm_dev_unregister and then set drm_device.unplugged flag which is used to mark device critical sections with drm_dev_enter()/ drm_dev_exit() preventing access to device resources that are not available after the device is gone. But drm_dev_unregister may lead to hotplug uevent(s) fired to user-space on card and/or connector removal, thus making it possible for user-space to try accessing a disconnected device. Fix this by first making sure device is properly marked as disconnected and only then unregister it. Fixes: bee330f3d672 ("drm: Use srcu to protect drm_device.unplugged") Signed-off-by: Oleksandr Andrushchenko Reported-by: Andrii Chepurnyi Cc: "Noralf Trønnes" --- drivers/gpu/drm/drm_drv.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index b553a6f2ff0e..7af748ed1c58 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c @@ -369,13 +369,6 @@ EXPORT_SYMBOL(drm_dev_exit); */ void drm_dev_unplug(struct drm_device *dev) { - drm_dev_unregister(dev); - - mutex_lock(&drm_global_mutex); - if (dev->open_count == 0) - drm_dev_put(dev); - mutex_unlock(&drm_global_mutex); - /* * After synchronizing any critical read section is guaranteed to see * the new value of ->unplugged, and any critical section which might @@ -384,6 +377,13 @@ void drm_dev_unplug(struct drm_device *dev) */ dev->unplugged = true; synchronize_srcu(&drm_unplug_srcu); + + drm_dev_unregister(dev); + + mutex_lock(&drm_global_mutex); + if (dev->open_count == 0) + drm_dev_put(dev); + mutex_unlock(&drm_global_mutex); } EXPORT_SYMBOL(drm_dev_unplug); -- 2.17.0