Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp524427ybi; Thu, 30 May 2019 02:26:50 -0700 (PDT) X-Google-Smtp-Source: APXvYqzhU19hpiU+n/emBV47rtpOe3kmBkIA6WQgJpz/F5RJ7JimsOCy9tvC5ZnBz5HeG0yssSby X-Received: by 2002:a17:90a:7107:: with SMTP id h7mr2570967pjk.38.1559208410199; Thu, 30 May 2019 02:26:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559208410; cv=none; d=google.com; s=arc-20160816; b=kDA3wwxQM3HVT0KQvW16dIN9D7/dw+CCQ+4zW7gGQWb/XwXTbaLMA298zKSYLCZsMr aMgxy1tIncRy2dP2PlYOW9PV8CbQ6k94GpSAfEpH5R/SatnRebGGobJrsZEF8SxnKn4b WInzvf9ZAwWjqr+Xifj632fvmUtEw5O8vy1ZLYKx1fTwc6YM45ZJd5SZrJxIAZ3vVdFZ TWqXLtlLV0OC9MM9cfcFvJyDkebUA1a2lmy18KXFsuy5iEYCXJKMk7Bn3Ib8p+xJyjvC Sb/neWN/kJaUmXZUnHmZrzMMKfEOOablY/i0q2J89WPDV8N2ZNzs+YrjZOCQVeCgc8OI 1Ing== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=mgtNhZ4mGskWw4micxkYwrM9himOk6wqCRMx4kzxMLE=; b=wyGvoqfuH7n1Mbf57rFwROasAnFXhTBz2/lXR4puOzMYsB9p/wMI7mtlrubQBmmbPm mKJL3zib3IaJK+bRtliUEqWIpY+gO6/A+teLcs9TAxfvRl7OEF6M/ULwd1ilg1IvaPaD dKaKMCQ7l0sVFkh7bHKrukeifnximIVDgZMcsn00rbQSviwQNZc05GJamJVjUllhuEaX RNG3A7Nf4HpqZF9Y5lvBTMWrABvIKI0HKlOQS4aoXebg7/Bmy+U6v/9HnkvFai15kRm4 qqumOpDoBu7XOArJpzbLvBVLZFnbc6Pd9z6qRCo2tfBsSmg3a3FJUBIZLW55MogBpe6p 1hBQ== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m1si2278628pjq.83.2019.05.30.02.26.33; Thu, 30 May 2019 02:26:50 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727471AbfE3JZI (ORCPT + 99 others); Thu, 30 May 2019 05:25:08 -0400 Received: from mga07.intel.com ([134.134.136.100]:12824 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726382AbfE3JZH (ORCPT ); Thu, 30 May 2019 05:25:07 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 May 2019 02:25:06 -0700 Received: from jkrzyszt-desk.igk.intel.com ([172.22.244.18]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 May 2019 02:25:03 -0700 From: Janusz Krzysztofik To: intel-gfx@lists.freedesktop.org Cc: Chris Wilson , Daniel Vetter , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , David Airlie , Michal Wajdeczko , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Janusz Krzysztofik Subject: [RFC PATCH 1/1] drm/i915: Split off pci_driver.remove() tail to drm_driver.release() Date: Thu, 30 May 2019 11:24:26 +0200 Message-Id: <20190530092426.23880-2-janusz.krzysztofik@linux.intel.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190530092426.23880-1-janusz.krzysztofik@linux.intel.com> References: <20190530092426.23880-1-janusz.krzysztofik@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In order to support driver hot unbind, some cleanup operations, now performed on PCI driver remove, must be called later, after all device file descriptors are closed. Split out those operations from the tail of pci_driver.remove() callback and put them into drm_driver.release() which is called as soon as all references to the driver are put. As a result, those cleanups will be now run on last drm_dev_put(), either still called from pci_driver.remove() if all device file descriptors are already closed, or on last drm_release() file operation. Signed-off-by: Janusz Krzysztofik --- drivers/gpu/drm/i915/i915_drv.c | 17 +++++++++++++---- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/i915_gem.c | 10 +++++++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 83d2eb9e74cb..8be69f84eb6d 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -738,6 +738,7 @@ static int i915_load_modeset_init(struct drm_device *dev) cleanup_gem: i915_gem_suspend(dev_priv); + i915_gem_fini_hw(dev_priv); i915_gem_fini(dev_priv); cleanup_modeset: intel_modeset_cleanup(dev); @@ -1685,7 +1686,6 @@ static void i915_driver_cleanup_hw(struct drm_i915_private *dev_priv) pci_disable_msi(pdev); pm_qos_remove_request(&dev_priv->pm_qos); - i915_ggtt_cleanup_hw(dev_priv); } /** @@ -1909,6 +1909,7 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent) out_cleanup_hw: i915_driver_cleanup_hw(dev_priv); + i915_ggtt_cleanup_hw(dev_priv); out_cleanup_mmio: i915_driver_cleanup_mmio(dev_priv); out_runtime_pm_put: @@ -1960,21 +1961,29 @@ void i915_driver_unload(struct drm_device *dev) cancel_delayed_work_sync(&dev_priv->gpu_error.hangcheck_work); i915_reset_error_state(dev_priv); - i915_gem_fini(dev_priv); + i915_gem_fini_hw(dev_priv); intel_power_domains_fini_hw(dev_priv); i915_driver_cleanup_hw(dev_priv); - i915_driver_cleanup_mmio(dev_priv); enable_rpm_wakeref_asserts(dev_priv); - intel_runtime_pm_cleanup(dev_priv); } static void i915_driver_release(struct drm_device *dev) { struct drm_i915_private *dev_priv = to_i915(dev); + disable_rpm_wakeref_asserts(dev_priv); + + i915_gem_fini(dev_priv); + + i915_ggtt_cleanup_hw(dev_priv); + i915_driver_cleanup_mmio(dev_priv); + + enable_rpm_wakeref_asserts(dev_priv); + intel_runtime_pm_cleanup(dev_priv); + i915_driver_cleanup_early(dev_priv); i915_driver_destroy(dev_priv); } diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index a2664ea1395b..d08e7bd83544 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -3047,6 +3047,7 @@ void i915_gem_init_mmio(struct drm_i915_private *i915); int __must_check i915_gem_init(struct drm_i915_private *dev_priv); int __must_check i915_gem_init_hw(struct drm_i915_private *dev_priv); void i915_gem_init_swizzling(struct drm_i915_private *dev_priv); +void i915_gem_fini_hw(struct drm_i915_private *dev_priv); void i915_gem_fini(struct drm_i915_private *dev_priv); int i915_gem_wait_for_idle(struct drm_i915_private *dev_priv, unsigned int flags, long timeout); diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 7cafd5612f71..c6a8e665a6ba 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -4667,7 +4667,7 @@ int i915_gem_init(struct drm_i915_private *dev_priv) return ret; } -void i915_gem_fini(struct drm_i915_private *dev_priv) +void i915_gem_fini_hw(struct drm_i915_private *dev_priv) { GEM_BUG_ON(dev_priv->gt.awake); @@ -4681,6 +4681,14 @@ void i915_gem_fini(struct drm_i915_private *dev_priv) intel_uc_fini_hw(dev_priv); intel_uc_fini(dev_priv); intel_engines_cleanup(dev_priv); + mutex_unlock(&dev_priv->drm.struct_mutex); + + i915_gem_drain_freed_objects(dev_priv); +} + +void i915_gem_fini(struct drm_i915_private *dev_priv) +{ + mutex_lock(&dev_priv->drm.struct_mutex); i915_gem_contexts_fini(dev_priv); i915_gem_fini_scratch(dev_priv); mutex_unlock(&dev_priv->drm.struct_mutex); -- 2.21.0