From patchwork Thu May 26 12:35:18 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 9136947 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 036B16075C for ; Thu, 26 May 2016 12:35:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EA8EB27CB2 for ; Thu, 26 May 2016 12:35:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DF35328278; Thu, 26 May 2016 12:35:32 +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]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5604327CB2 for ; Thu, 26 May 2016 12:35:32 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 9C8E56EACD; Thu, 26 May 2016 12:35:29 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wm0-x244.google.com (mail-wm0-x244.google.com [IPv6:2a00:1450:400c:c09::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 984A56EACD; Thu, 26 May 2016 12:35:27 +0000 (UTC) Received: by mail-wm0-x244.google.com with SMTP id a136so5009084wme.0; Thu, 26 May 2016 05:35:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=lzT8imdEse9GnkMaV9RKIlUpa5FvjIuFfzwZ4TWLQBE=; b=lMbRMavXza3QIZELTunufeO+nwZUd8SHVDXU91hFev9igHZit6HoRttn0t/nHBP2K+ ZXf9QuBPjei2HWSZnJqZOgPUVxTjrr1mtiVvJNK+sRshHmlQL2ZD0UkLmICba0pRxMwY TSIP9pPGWZhkveki1zae5TMxxd7JmGsTIlW1HnHuvMeH9Gi9XbmXJqIe2baFBFy34Y9Y 6HBoyf5xz2KTwYFpuN1QwQVph0Oz0IzvVKny84HXVj/naWiKB+eZlRQ9M0XTS72Xw5+3 OSXbhmTYVMZH4nKEKv9PT4LtdrY/APzXp+kpMvFutz9fKmL5M/0pYX/WHLfzBV0kLFBe 4Jhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=lzT8imdEse9GnkMaV9RKIlUpa5FvjIuFfzwZ4TWLQBE=; b=g6uh4QKaTeIuj3EmVztTo7lmPkuZx03EXnIBpIKmQLhMxYKne5xgTLxjvqwBw72joh /t5JxlMQ9oJSQOsq2f9qEhlJ6QKQnM8aDlEFI2AOyYtywU+9QmET1yRFrBe7nNQlNjx+ KPjKMxg9ty/FoNE2w27nD0EBHUsFGsOrVHA8uhRRh21//NSwv02sH3xWzDeQsHjfMjG/ KmL3qns4u2Bw6xpBuGd9cMk0q2jpoX/ez+n/0JoaerenlnHfv+RG2lLuRjhh3PGsePXM kRlCa5x780vlkPet6KN+1oQT6w9CC+85FfJdHYdj5ZBk3dtMrgACRCcT7bkcrIXhuZV+ 97PQ== X-Gm-Message-State: ALyK8tIBcj42E2tz3DgDG0IQYRnFZXG1WcBY9IqF4az0UrVPpgO3l8FH5F2J9jkVL9MtDA== X-Received: by 10.194.234.71 with SMTP id uc7mr10494499wjc.80.1464266125820; Thu, 26 May 2016 05:35:25 -0700 (PDT) Received: from haswell.alporthouse.com ([78.156.65.138]) by smtp.gmail.com with ESMTPSA id c7sm14115471wji.38.2016.05.26.05.35.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 May 2016 05:35:24 -0700 (PDT) From: Chris Wilson To: intel-gfx@lists.freedesktop.org Subject: [PATCH] drm: Register the debugfs interfaces after loading the driver Date: Thu, 26 May 2016 13:35:18 +0100 Message-Id: <1464266118-18567-1-git-send-email-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.8.1 In-Reply-To: <20160526114509.GQ4329@intel.com> References: <20160526114509.GQ4329@intel.com> Cc: dri-devel@lists.freedesktop.org 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-Virus-Scanned: ClamAV using ClamSMTP In order to give the driver the chance to initialise the data structures that will be exposed through debugfs, perform driver->load() before registering the debugfs entries. (Otherwise it may be possible for userspace to cause an oops through the debugfs interfaces.) As the driver load is now before debugfs registration, make the registration non-fatal (as it simply prevents us exposing an optional debug facility and not hard ABI). Signed-off-by: Chris Wilson --- drivers/gpu/drm/drm_debugfs.c | 13 ++++++--- drivers/gpu/drm/drm_drv.c | 62 +++++++++++++++++++++++++++++++------------ 2 files changed, 54 insertions(+), 21 deletions(-) diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c index 3bcf8e6a85b3..8f36e014fbd2 100644 --- a/drivers/gpu/drm/drm_debugfs.c +++ b/drivers/gpu/drm/drm_debugfs.c @@ -160,10 +160,8 @@ int drm_debugfs_init(struct drm_minor *minor, int minor_id, ret = drm_debugfs_create_files(drm_debugfs_list, DRM_DEBUGFS_ENTRIES, minor->debugfs_root, minor); if (ret) { - debugfs_remove(minor->debugfs_root); - minor->debugfs_root = NULL; DRM_ERROR("Failed to create core drm debugfs files\n"); - return ret; + goto err_root; } if (dev->driver->debugfs_init) { @@ -171,10 +169,17 @@ int drm_debugfs_init(struct drm_minor *minor, int minor_id, if (ret) { DRM_ERROR("DRM: Driver failed to initialize " "/sys/kernel/debug/dri.\n"); - return ret; + goto err_core; } } return 0; + +err_core: + drm_debugfs_remove_files(drm_debugfs_list, DRM_DEBUGFS_ENTRIES, minor); +err_root: + debugfs_remove(minor->debugfs_root); + minor->debugfs_root = NULL; + return ret; } diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index bff89226a344..82d1e80c2bf4 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c @@ -307,15 +307,9 @@ static int drm_minor_register(struct drm_device *dev, unsigned int type) if (!minor) return 0; - ret = drm_debugfs_init(minor, minor->index, drm_debugfs_root); - if (ret) { - DRM_ERROR("DRM: Failed to initialize /sys/kernel/debug/dri.\n"); - return ret; - } - ret = device_add(minor->kdev); if (ret) - goto err_debugfs; + return ret; /* replace NULL with @minor so lookups will succeed from now on */ spin_lock_irqsave(&drm_minor_lock, flags); @@ -324,10 +318,36 @@ static int drm_minor_register(struct drm_device *dev, unsigned int type) DRM_DEBUG("new minor registered %d\n", minor->index); return 0; +} + +static void drm_debugfs_register(struct drm_device *dev, unsigned int type) +{ + struct drm_minor *minor; + + DRM_DEBUG("\n"); + if (!drm_debugfs_root) + return; + + minor = *drm_minor_get_slot(dev, type); + if (!minor) + return; + + if (drm_debugfs_init(minor, minor->index, drm_debugfs_root)) + DRM_ERROR("DRM: Failed to initialize /sys/kernel/debug/dri.\n"); +} + +static void drm_debugfs_unregister(struct drm_device *dev, unsigned int type) +{ + struct drm_minor *minor; + + if (!drm_debugfs_root) + return; + + minor = *drm_minor_get_slot(dev, type); + if (!minor || !device_is_registered(minor->kdev)) + return; -err_debugfs: drm_debugfs_cleanup(minor); - return ret; } static void drm_minor_unregister(struct drm_device *dev, unsigned int type) @@ -346,7 +366,6 @@ static void drm_minor_unregister(struct drm_device *dev, unsigned int type) device_del(minor->kdev); dev_set_drvdata(minor->kdev, NULL); /* safety belt */ - drm_debugfs_cleanup(minor); } /** @@ -460,6 +479,10 @@ EXPORT_SYMBOL(drm_put_dev); void drm_unplug_dev(struct drm_device *dev) { + drm_debugfs_unregister(dev, DRM_MINOR_LEGACY); + drm_debugfs_unregister(dev, DRM_MINOR_RENDER); + drm_debugfs_unregister(dev, DRM_MINOR_CONTROL); + /* for a USB device */ drm_minor_unregister(dev, DRM_MINOR_LEGACY); drm_minor_unregister(dev, DRM_MINOR_RENDER); @@ -759,6 +782,10 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags) goto err_minors; } + drm_debugfs_register(dev, DRM_MINOR_CONTROL); + drm_debugfs_register(dev, DRM_MINOR_RENDER); + drm_debugfs_register(dev, DRM_MINOR_LEGACY); + ret = 0; goto out_unlock; @@ -800,6 +827,10 @@ void drm_dev_unregister(struct drm_device *dev) list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) drm_legacy_rmmap(dev, r_list->map); + drm_debugfs_unregister(dev, DRM_MINOR_LEGACY); + drm_debugfs_unregister(dev, DRM_MINOR_RENDER); + drm_debugfs_unregister(dev, DRM_MINOR_CONTROL); + drm_minor_unregister(dev, DRM_MINOR_LEGACY); drm_minor_unregister(dev, DRM_MINOR_RENDER); drm_minor_unregister(dev, DRM_MINOR_CONTROL); @@ -904,17 +935,13 @@ static int __init drm_core_init(void) } drm_debugfs_root = debugfs_create_dir("dri", NULL); - if (!drm_debugfs_root) { + if (!drm_debugfs_root) DRM_ERROR("Cannot create /sys/kernel/debug/dri\n"); - ret = -1; - goto err_p3; - } DRM_INFO("Initialized %s %d.%d.%d %s\n", CORE_NAME, CORE_MAJOR, CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE); return 0; -err_p3: - drm_sysfs_destroy(); + err_p2: unregister_chrdev(DRM_MAJOR, "drm"); @@ -925,7 +952,8 @@ err_p1: static void __exit drm_core_exit(void) { - debugfs_remove(drm_debugfs_root); + if (drm_debugfs_root) + debugfs_remove(drm_debugfs_root); drm_sysfs_destroy(); unregister_chrdev(DRM_MAJOR, "drm");