From patchwork Thu Aug 6 23:34:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Dave Airlie X-Patchwork-Id: 11704543 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 58A7C175A for ; Thu, 6 Aug 2020 23:36:19 +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 6E628221E4 for ; Thu, 6 Aug 2020 23:36:19 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6E628221E4 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com 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 8B5006E934; Thu, 6 Aug 2020 23:36:18 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by gabe.freedesktop.org (Postfix) with ESMTPS id 1A4976E934 for ; Thu, 6 Aug 2020 23:36:17 +0000 (UTC) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-355-C4kE67q3P2i2WMzxwfBpQg-1; Thu, 06 Aug 2020 19:35:07 -0400 X-MC-Unique: C4kE67q3P2i2WMzxwfBpQg-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 67ECE8015F3; Thu, 6 Aug 2020 23:35:06 +0000 (UTC) Received: from tyrion-bne-redhat-com.redhat.com (vpn2-54-227.bne.redhat.com [10.64.54.227]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8E7145F9DC; Thu, 6 Aug 2020 23:35:03 +0000 (UTC) From: Dave Airlie To: dri-devel@lists.freedesktop.org Subject: [PATCH 1/4] drm/amdgpu/ttm: move vram/gtt mgr allocations to mman. Date: Fri, 7 Aug 2020 09:34:56 +1000 Message-Id: <20200806233459.4057784-2-airlied@gmail.com> In-Reply-To: <20200806233459.4057784-1-airlied@gmail.com> References: <20200806233459.4057784-1-airlied@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=airlied@gmail.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: gmail.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: bskeggs@redhat.com, christian.koenig@amd.com Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Dave Airlie Christian suggested this and it makes sense. Signed-off-by: Dave Airlie Reviewed-by: Christian König --- drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 21 ++++------------- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 19 ++++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 24 ++++---------------- 3 files changed, 27 insertions(+), 37 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c index c847a5fe94c9..010518148ef8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c @@ -24,13 +24,6 @@ #include "amdgpu.h" -struct amdgpu_gtt_mgr { - struct ttm_resource_manager manager; - struct drm_mm mm; - spinlock_t lock; - atomic64_t available; -}; - static inline struct amdgpu_gtt_mgr *to_gtt_mgr(struct ttm_resource_manager *man) { return container_of(man, struct amdgpu_gtt_mgr, manager); @@ -93,16 +86,11 @@ static const struct ttm_resource_manager_func amdgpu_gtt_mgr_func; */ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) { - struct ttm_resource_manager *man; - struct amdgpu_gtt_mgr *mgr; + struct amdgpu_gtt_mgr *mgr = &adev->mman.gtt_mgr; + struct ttm_resource_manager *man = &mgr->manager; uint64_t start, size; int ret; - mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); - if (!mgr) - return -ENOMEM; - - man = &mgr->manager; man->use_tt = true; man->func = &amdgpu_gtt_mgr_func; man->available_caching = TTM_PL_MASK_CACHING; @@ -142,8 +130,8 @@ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) */ void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev) { - struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); - struct amdgpu_gtt_mgr *mgr = to_gtt_mgr(man); + struct amdgpu_gtt_mgr *mgr = &adev->mman.gtt_mgr; + struct ttm_resource_manager *man = &mgr->manager; int ret; ttm_resource_manager_set_used(man, false); @@ -161,7 +149,6 @@ void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev) ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_TT, NULL); - kfree(mgr); } /** diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 36b024fd077e..168294be276d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -41,6 +41,22 @@ #define AMDGPU_POISON 0xd0bed0be +struct amdgpu_vram_mgr { + struct ttm_resource_manager manager; + struct drm_mm mm; + spinlock_t lock; + atomic64_t usage; + atomic64_t vis_usage; + struct amdgpu_device *adev; +}; + +struct amdgpu_gtt_mgr { + struct ttm_resource_manager manager; + struct drm_mm mm; + spinlock_t lock; + atomic64_t available; +}; + struct amdgpu_mman { struct ttm_bo_device bdev; bool mem_global_referenced; @@ -59,6 +75,9 @@ struct amdgpu_mman { struct mutex gtt_window_lock; /* Scheduler entity for buffer moves */ struct drm_sched_entity entity; + + struct amdgpu_vram_mgr vram_mgr; + struct amdgpu_gtt_mgr gtt_mgr; }; struct amdgpu_copy_mem { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 895634cbf999..a41a8abc9927 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -28,15 +28,6 @@ #include "amdgpu_atomfirmware.h" #include "atom.h" -struct amdgpu_vram_mgr { - struct ttm_resource_manager manager; - struct drm_mm mm; - spinlock_t lock; - atomic64_t usage; - atomic64_t vis_usage; - struct amdgpu_device *adev; -}; - static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *man) { return container_of(man, struct amdgpu_vram_mgr, manager); @@ -177,16 +168,10 @@ static const struct ttm_resource_manager_func amdgpu_vram_mgr_func; */ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) { - struct ttm_resource_manager *man; - struct amdgpu_vram_mgr *mgr; + struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; + struct ttm_resource_manager *man = &mgr->manager; int ret; - mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); - if (!mgr) - return -ENOMEM; - - man = &mgr->manager; - man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC; man->default_caching = TTM_PL_FLAG_WC; @@ -219,8 +204,8 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) */ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev) { - struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM); - struct amdgpu_vram_mgr *mgr = to_vram_mgr(man); + struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; + struct ttm_resource_manager *man = &mgr->manager; int ret; ttm_resource_manager_set_used(man, false); @@ -237,7 +222,6 @@ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev) ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, NULL); - kfree(mgr); } /** From patchwork Thu Aug 6 23:34:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Dave Airlie X-Patchwork-Id: 11704537 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 9984A1731 for ; Thu, 6 Aug 2020 23:35:19 +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 AF0432173E for ; Thu, 6 Aug 2020 23:35:19 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AF0432173E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com 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 9BC3C6E932; Thu, 6 Aug 2020 23:35:17 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by gabe.freedesktop.org (Postfix) with ESMTPS id 695376E932 for ; Thu, 6 Aug 2020 23:35:16 +0000 (UTC) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-352-sD2CH5w1MrSNxQNChdC8Iw-1; Thu, 06 Aug 2020 19:35:11 -0400 X-MC-Unique: sD2CH5w1MrSNxQNChdC8Iw-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 89A2118C63D7; Thu, 6 Aug 2020 23:35:10 +0000 (UTC) Received: from tyrion-bne-redhat-com.redhat.com (vpn2-54-227.bne.redhat.com [10.64.54.227]) by smtp.corp.redhat.com (Postfix) with ESMTP id C66385F9DC; Thu, 6 Aug 2020 23:35:06 +0000 (UTC) From: Dave Airlie To: dri-devel@lists.freedesktop.org Subject: [PATCH 2/4] drm/amdgpu/ttm: drop the adev link from vram mgr Date: Fri, 7 Aug 2020 09:34:57 +1000 Message-Id: <20200806233459.4057784-3-airlied@gmail.com> In-Reply-To: <20200806233459.4057784-1-airlied@gmail.com> References: <20200806233459.4057784-1-airlied@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: gmail.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: bskeggs@redhat.com, christian.koenig@amd.com Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Dave Airlie There is no need for that now since it's embedded. Signed-off-by: Dave Airlie Reviewed-by: Christian König --- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 - drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 11 +++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 168294be276d..4a6d92f27b6e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -47,7 +47,6 @@ struct amdgpu_vram_mgr { spinlock_t lock; atomic64_t usage; atomic64_t vis_usage; - struct amdgpu_device *adev; }; struct amdgpu_gtt_mgr { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index a41a8abc9927..7882efd275d1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -33,6 +33,11 @@ static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *m return container_of(man, struct amdgpu_vram_mgr, manager); } +static inline struct amdgpu_device *to_amdgpu_device(struct amdgpu_vram_mgr *mgr) +{ + return container_of(mgr, struct amdgpu_device, mman.vram_mgr); +} + /** * DOC: mem_info_vram_total * @@ -182,8 +187,6 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) drm_mm_init(&mgr->mm, 0, man->size); spin_lock_init(&mgr->lock); - mgr->adev = adev; - /* Add the two VRAM-related sysfs files */ ret = sysfs_create_files(&adev->dev->kobj, amdgpu_vram_mgr_attributes); if (ret) @@ -311,7 +314,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, struct ttm_resource *mem) { struct amdgpu_vram_mgr *mgr = to_vram_mgr(man); - struct amdgpu_device *adev = mgr->adev; + struct amdgpu_device *adev = to_amdgpu_device(mgr); struct drm_mm *mm = &mgr->mm; struct drm_mm_node *nodes; enum drm_mm_insert_mode mode; @@ -429,7 +432,7 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man, struct ttm_resource *mem) { struct amdgpu_vram_mgr *mgr = to_vram_mgr(man); - struct amdgpu_device *adev = mgr->adev; + struct amdgpu_device *adev = to_amdgpu_device(mgr); struct drm_mm_node *nodes = mem->mm_node; uint64_t usage = 0, vis_usage = 0; unsigned pages = mem->num_pages; From patchwork Thu Aug 6 23:34:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dave Airlie X-Patchwork-Id: 11704539 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 DC7F0913 for ; Thu, 6 Aug 2020 23:35:23 +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 EEC4021744 for ; Thu, 6 Aug 2020 23:35:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EEC4021744 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com 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 BE2C86E933; Thu, 6 Aug 2020 23:35:22 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) by gabe.freedesktop.org (Postfix) with ESMTPS id D61AB6E933 for ; Thu, 6 Aug 2020 23:35:20 +0000 (UTC) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-416-Oj6OteVsPGSPRikfstgsBA-1; Thu, 06 Aug 2020 19:35:16 -0400 X-MC-Unique: Oj6OteVsPGSPRikfstgsBA-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9331180183C; Thu, 6 Aug 2020 23:35:15 +0000 (UTC) Received: from tyrion-bne-redhat-com.redhat.com (vpn2-54-227.bne.redhat.com [10.64.54.227]) by smtp.corp.redhat.com (Postfix) with ESMTP id E9E435FC36; Thu, 6 Aug 2020 23:35:10 +0000 (UTC) From: Dave Airlie To: dri-devel@lists.freedesktop.org Subject: [PATCH 3/4] drm/ttm: drop size from resource manager base class. Date: Fri, 7 Aug 2020 09:34:58 +1000 Message-Id: <20200806233459.4057784-4-airlied@gmail.com> In-Reply-To: <20200806233459.4057784-1-airlied@gmail.com> References: <20200806233459.4057784-1-airlied@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=airlied@gmail.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: gmail.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: bskeggs@redhat.com, christian.koenig@amd.com Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Dave Airlie This is a bit more involved that it looked, the range manager needs accessors adding and amdgpu needs a bit of a refactor. Reported-by: kernel test robot Reported-by: kernel test robot Reported-by: kernel test robot --- drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 21 ++++++++----------- drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 5 +++-- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 13 ++++++------ drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 12 +++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 16 ++++++-------- drivers/gpu/drm/nouveau/nouveau_ttm.c | 5 ++--- drivers/gpu/drm/radeon/radeon_gem.c | 2 +- drivers/gpu/drm/radeon/radeon_ttm.c | 3 +-- drivers/gpu/drm/ttm/ttm_bo.c | 7 ++----- drivers/gpu/drm/ttm/ttm_range_manager.c | 21 +++++++++++++++++-- drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c | 2 +- drivers/gpu/drm/vmwgfx/vmwgfx_thp.c | 9 ++++---- include/drm/ttm/ttm_bo_api.h | 4 +--- include/drm/ttm/ttm_bo_driver.h | 20 ++++++++++++++++-- 15 files changed, 87 insertions(+), 55 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c index 010518148ef8..b769b43b2fbc 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c @@ -24,11 +24,6 @@ #include "amdgpu.h" -static inline struct amdgpu_gtt_mgr *to_gtt_mgr(struct ttm_resource_manager *man) -{ - return container_of(man, struct amdgpu_gtt_mgr, manager); -} - struct amdgpu_gtt_node { struct drm_mm_node node; struct ttm_buffer_object *tbo; @@ -48,8 +43,9 @@ static ssize_t amdgpu_mem_info_gtt_total_show(struct device *dev, struct drm_device *ddev = dev_get_drvdata(dev); struct amdgpu_device *adev = ddev->dev_private; struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); - return snprintf(buf, PAGE_SIZE, "%llu\n", - man->size * PAGE_SIZE); + struct amdgpu_gtt_mgr *gtt_mgr = to_gtt_mgr(man); + return snprintf(buf, PAGE_SIZE, "%lu\n", + gtt_mgr->size * PAGE_SIZE); } /** @@ -96,13 +92,14 @@ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) man->available_caching = TTM_PL_MASK_CACHING; man->default_caching = TTM_PL_FLAG_CACHED; - ttm_resource_manager_init(man, gtt_size >> PAGE_SHIFT); + mgr->size = gtt_size >> PAGE_SHIFT; + ttm_resource_manager_init(man); start = AMDGPU_GTT_MAX_TRANSFER_SIZE * AMDGPU_GTT_NUM_TRANSFER_WINDOWS; size = (adev->gmc.gart_size >> PAGE_SHIFT) - start; drm_mm_init(&mgr->mm, start, size); spin_lock_init(&mgr->lock); - atomic64_set(&mgr->available, gtt_size >> PAGE_SHIFT); + atomic64_set(&mgr->available, mgr->size); ret = device_create_file(adev->dev, &dev_attr_mem_info_gtt_total); if (ret) { @@ -264,7 +261,7 @@ static void amdgpu_gtt_mgr_del(struct ttm_resource_manager *man, uint64_t amdgpu_gtt_mgr_usage(struct ttm_resource_manager *man) { struct amdgpu_gtt_mgr *mgr = to_gtt_mgr(man); - s64 result = man->size - atomic64_read(&mgr->available); + s64 result = mgr->size - atomic64_read(&mgr->available); return (result > 0 ? result : 0) * PAGE_SIZE; } @@ -305,8 +302,8 @@ static void amdgpu_gtt_mgr_debug(struct ttm_resource_manager *man, drm_mm_print(&mgr->mm, printer); spin_unlock(&mgr->lock); - drm_printf(printer, "man size:%llu pages, gtt available:%lld pages, usage:%lluMB\n", - man->size, (u64)atomic64_read(&mgr->available), + drm_printf(printer, "man size:%lu pages, gtt available:%lld pages, usage:%lluMB\n", + mgr->size, (u64)atomic64_read(&mgr->available), amdgpu_gtt_mgr_usage(man) >> 20); } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index fff9c013f337..732e4004777e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -608,7 +608,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file min(adev->gmc.visible_vram_size - atomic64_read(&adev->visible_pin_size), vram_gtt.vram_size); - vram_gtt.gtt_size = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT)->size; + vram_gtt.gtt_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; vram_gtt.gtt_size *= PAGE_SIZE; vram_gtt.gtt_size -= atomic64_read(&adev->gart_pin_size); return copy_to_user(out, &vram_gtt, @@ -620,6 +620,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM); struct ttm_resource_manager *gtt_man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); + struct amdgpu_gtt_mgr *gtt_mgr = to_gtt_mgr(gtt_man); memset(&mem, 0, sizeof(mem)); mem.vram.total_heap_size = adev->gmc.real_vram_size; mem.vram.usable_heap_size = adev->gmc.real_vram_size - @@ -640,7 +641,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file mem.cpu_accessible_vram.max_allocation = mem.cpu_accessible_vram.usable_heap_size * 3 / 4; - mem.gtt.total_heap_size = gtt_man->size; + mem.gtt.total_heap_size = gtt_mgr->size; mem.gtt.total_heap_size *= PAGE_SIZE; mem.gtt.usable_heap_size = mem.gtt.total_heap_size - atomic64_read(&adev->gart_pin_size); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 43f4966331dd..33957d829197 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -442,25 +442,24 @@ void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr, static bool amdgpu_bo_validate_size(struct amdgpu_device *adev, unsigned long size, u32 domain) { - struct ttm_resource_manager *man = NULL; - + unsigned long mgr_size = 0; /* * If GTT is part of requested domains the check must succeed to * allow fall back to GTT */ if (domain & AMDGPU_GEM_DOMAIN_GTT) { - man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); + mgr_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; - if (size < (man->size << PAGE_SHIFT)) + if (size < (mgr_size << PAGE_SHIFT)) return true; else goto fail; } if (domain & AMDGPU_GEM_DOMAIN_VRAM) { - man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM); + mgr_size = to_vram_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; - if (size < (man->size << PAGE_SHIFT)) + if (size < (mgr_size << PAGE_SHIFT)) return true; else goto fail; @@ -472,7 +471,7 @@ static bool amdgpu_bo_validate_size(struct amdgpu_device *adev, fail: DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size, - man->size << PAGE_SHIFT); + mgr_size << PAGE_SHIFT); return false; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 28557839f132..ca312ef8c2f8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -2045,7 +2045,7 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable) size = adev->gmc.real_vram_size; else size = adev->gmc.visible_vram_size; - man->size = size >> PAGE_SHIFT; + to_vram_mgr(man)->size = size >> PAGE_SHIFT; adev->mman.buffer_funcs_enabled = enable; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 4a6d92f27b6e..5636ef2b1707 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -47,15 +47,27 @@ struct amdgpu_vram_mgr { spinlock_t lock; atomic64_t usage; atomic64_t vis_usage; + unsigned long size; }; +static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *man) +{ + return container_of(man, struct amdgpu_vram_mgr, manager); +} + struct amdgpu_gtt_mgr { struct ttm_resource_manager manager; struct drm_mm mm; spinlock_t lock; atomic64_t available; + unsigned long size; }; +static inline struct amdgpu_gtt_mgr *to_gtt_mgr(struct ttm_resource_manager *man) +{ + return container_of(man, struct amdgpu_gtt_mgr, manager); +} + struct amdgpu_mman { struct ttm_bo_device bdev; bool mem_global_referenced; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 7882efd275d1..d4aa2aa49b4f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -28,11 +28,6 @@ #include "amdgpu_atomfirmware.h" #include "atom.h" -static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *man) -{ - return container_of(man, struct amdgpu_vram_mgr, manager); -} - static inline struct amdgpu_device *to_amdgpu_device(struct amdgpu_vram_mgr *mgr) { return container_of(mgr, struct amdgpu_device, mman.vram_mgr); @@ -180,11 +175,12 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC; man->default_caching = TTM_PL_FLAG_WC; - ttm_resource_manager_init(man, adev->gmc.real_vram_size >> PAGE_SHIFT); + ttm_resource_manager_init(man); man->func = &amdgpu_vram_mgr_func; - drm_mm_init(&mgr->mm, 0, man->size); + mgr->size = adev->gmc.real_vram_size >> PAGE_SHIFT; + drm_mm_init(&mgr->mm, 0, mgr->size); spin_lock_init(&mgr->lock); /* Add the two VRAM-related sysfs files */ @@ -325,7 +321,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, lpfn = place->lpfn; if (!lpfn) - lpfn = man->size; + lpfn = mgr->size; max_bytes = adev->gmc.mc_vram_size; if (tbo->type != ttm_bo_type_kernel) @@ -600,8 +596,8 @@ static void amdgpu_vram_mgr_debug(struct ttm_resource_manager *man, drm_mm_print(&mgr->mm, printer); spin_unlock(&mgr->lock); - drm_printf(printer, "man size:%llu pages, ram usage:%lluMB, vis usage:%lluMB\n", - man->size, amdgpu_vram_mgr_usage(man) >> 20, + drm_printf(printer, "man size:%lu pages, ram usage:%lluMB, vis usage:%lluMB\n", + mgr->size, amdgpu_vram_mgr_usage(man) >> 20, amdgpu_vram_mgr_vis_usage(man) >> 20); } diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c index e6a30865a00b..93685a376a50 100644 --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c @@ -175,8 +175,7 @@ nouveau_ttm_init_vram(struct nouveau_drm *drm) man->func = &nouveau_vram_manager; man->use_io_reserve_lru = true; - ttm_resource_manager_init(man, - drm->gem.vram_available >> PAGE_SHIFT); + ttm_resource_manager_init(man); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_VRAM, man); ttm_resource_manager_set_used(man, true); return 0; @@ -237,7 +236,7 @@ nouveau_ttm_init_gtt(struct nouveau_drm *drm) man->available_caching = available_caching; man->default_caching = default_caching; man->use_tt = true; - ttm_resource_manager_init(man, size_pages); + ttm_resource_manager_init(man); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_TT, man); ttm_resource_manager_set_used(man, true); return 0; diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 7f5dfe04789e..00258d158cfe 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c @@ -228,7 +228,7 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data, man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM); - args->vram_size = (u64)man->size << PAGE_SHIFT; + args->vram_size = (u64)ttm_range_man_size(man) << PAGE_SHIFT; args->vram_visible = rdev->mc.visible_vram_size; args->vram_visible -= rdev->vram_pin_size; args->gart_size = rdev->mc.gtt_size; diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 3355b69b13d1..e41ec62ff944 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c @@ -843,9 +843,8 @@ void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size) if (!rdev->mman.initialized) return; - man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM); /* this just adjusts TTM size idea, which sets lpfn to the correct value */ - man->size = size >> PAGE_SHIFT; + ttm_range_man_adjust_size(man, size >> PAGE_SHIFT); } static vm_fault_t radeon_ttm_fault(struct vm_fault *vmf) diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index ad09329b62d3..cf8176bce4f6 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -82,7 +82,6 @@ void ttm_resource_manager_debug(struct ttm_resource_manager *man, { drm_printf(p, " use_type: %d\n", man->use_type); drm_printf(p, " use_tt: %d\n", man->use_tt); - drm_printf(p, " size: %llu\n", man->size); drm_printf(p, " available_caching: 0x%08X\n", man->available_caching); drm_printf(p, " default_caching: 0x%08X\n", man->default_caching); if (man->func && man->func->debug) @@ -1468,8 +1467,7 @@ int ttm_bo_evict_mm(struct ttm_bo_device *bdev, unsigned mem_type) } EXPORT_SYMBOL(ttm_bo_evict_mm); -void ttm_resource_manager_init(struct ttm_resource_manager *man, - unsigned long p_size) +void ttm_resource_manager_init(struct ttm_resource_manager *man) { unsigned i; @@ -1477,7 +1475,6 @@ void ttm_resource_manager_init(struct ttm_resource_manager *man, mutex_init(&man->io_reserve_mutex); spin_lock_init(&man->move_lock); INIT_LIST_HEAD(&man->io_reserve_lru); - man->size = p_size; for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) INIT_LIST_HEAD(&man->lru[i]); @@ -1590,7 +1587,7 @@ static void ttm_bo_init_sysman(struct ttm_bo_device *bdev) man->available_caching = TTM_PL_MASK_CACHING; man->default_caching = TTM_PL_FLAG_CACHED; - ttm_resource_manager_init(man, 0); + ttm_resource_manager_init(man); ttm_set_driver_manager(bdev, TTM_PL_SYSTEM, man); ttm_resource_manager_set_used(man, true); } diff --git a/drivers/gpu/drm/ttm/ttm_range_manager.c b/drivers/gpu/drm/ttm/ttm_range_manager.c index 274a05ca13d3..0dc4b17cc3dc 100644 --- a/drivers/gpu/drm/ttm/ttm_range_manager.c +++ b/drivers/gpu/drm/ttm/ttm_range_manager.c @@ -47,6 +47,7 @@ struct ttm_range_manager { struct ttm_resource_manager manager; struct drm_mm mm; spinlock_t lock; + uint64_t size; }; static inline struct ttm_range_manager *to_range_manager(struct ttm_resource_manager *man) @@ -68,7 +69,7 @@ static int ttm_range_man_get_node(struct ttm_resource_manager *man, lpfn = place->lpfn; if (!lpfn) - lpfn = man->size; + lpfn = rman->size; node = kzalloc(sizeof(*node), GFP_KERNEL); if (!node) @@ -133,8 +134,9 @@ int ttm_range_man_init(struct ttm_bo_device *bdev, man->func = &ttm_range_manager_func; - ttm_resource_manager_init(man, p_size); + ttm_resource_manager_init(man); + rman->size = p_size; drm_mm_init(&rman->mm, 0, p_size); spin_lock_init(&rman->lock); @@ -185,3 +187,18 @@ static const struct ttm_resource_manager_func ttm_range_manager_func = { .put_node = ttm_range_man_put_node, .debug = ttm_range_man_debug }; + +void ttm_range_man_adjust_size(struct ttm_resource_manager *man, + unsigned long size) +{ + struct ttm_range_manager *rman = to_range_manager(man); + rman->size = size; +} +EXPORT_SYMBOL(ttm_range_man_adjust_size); + +unsigned long ttm_range_man_size(struct ttm_resource_manager *man) +{ + struct ttm_range_manager *rman = to_range_manager(man); + return rman->size; +} +EXPORT_SYMBOL(ttm_range_man_size); diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c index 3fea7a6c7cfa..a7a2deae2277 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c @@ -116,7 +116,7 @@ int vmw_gmrid_man_init(struct vmw_private *dev_priv, int type) man->default_caching = TTM_PL_FLAG_CACHED; /* TODO: This is most likely not correct */ man->use_tt = true; - ttm_resource_manager_init(man, 0); + ttm_resource_manager_init(man); spin_lock_init(&gman->lock); gman->used_gmr_pages = 0; ida_init(&gman->gmr_ida); diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c b/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c index f594e2e6ab7e..74cdee48b191 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c @@ -19,6 +19,7 @@ struct vmw_thp_manager { struct ttm_resource_manager manager; struct drm_mm mm; spinlock_t lock; + uint64_t size; }; static struct vmw_thp_manager *to_thp_manager(struct ttm_resource_manager *man) @@ -63,7 +64,7 @@ static int vmw_thp_get_node(struct ttm_resource_manager *man, lpfn = place->lpfn; if (!lpfn) - lpfn = man->size; + lpfn = rman->size; mode = DRM_MM_INSERT_BEST; if (place->flags & TTM_PL_FLAG_TOPDOWN) @@ -134,10 +135,10 @@ int vmw_thp_init(struct vmw_private *dev_priv) man->available_caching = TTM_PL_FLAG_CACHED; man->default_caching = TTM_PL_FLAG_CACHED; - ttm_resource_manager_init(man, - dev_priv->vram_size >> PAGE_SHIFT); + ttm_resource_manager_init(man); - drm_mm_init(&rman->mm, 0, man->size); + rman->size = dev_priv->vram_size >> PAGE_SHIFT; + drm_mm_init(&rman->mm, 0, rman->size); spin_lock_init(&rman->lock); ttm_set_driver_manager(&dev_priv->bdev, TTM_PL_VRAM, &rman->manager); diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h index 770ad2195875..e4bf93482b59 100644 --- a/include/drm/ttm/ttm_bo_api.h +++ b/include/drm/ttm/ttm_bo_api.h @@ -537,12 +537,10 @@ int ttm_bo_create(struct ttm_bo_device *bdev, unsigned long size, * ttm_resource_manager_init * * @man: memory manager object to init - * @p_size: size managed area in pages. * * Initialise core parts of a manager object. */ -void ttm_resource_manager_init(struct ttm_resource_manager *man, - unsigned long p_size); +void ttm_resource_manager_init(struct ttm_resource_manager *man); /** * ttm_bo_evict_mm diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index eb1c3312e175..c719b4aa3793 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h @@ -116,7 +116,6 @@ struct ttm_resource_manager_func { * managed by this memory type. * @gpu_offset: If used, the GPU offset of the first managed page of * fixed memory or the first managed location in an aperture. - * @size: Size of the managed region. * @available_caching: A mask of available caching types, TTM_PL_FLAG_XX, * as defined in ttm_placement_common.h * @default_caching: The default caching policy used for a buffer object @@ -142,7 +141,6 @@ struct ttm_resource_manager { */ bool use_type; bool use_tt; - uint64_t size; uint32_t available_caching; uint32_t default_caching; const struct ttm_resource_manager_func *func; @@ -883,4 +881,22 @@ int ttm_range_man_fini(struct ttm_bo_device *bdev, void ttm_resource_manager_debug(struct ttm_resource_manager *man, struct drm_printer *p); +/** + * ttm_range_man_adjust_size + * + * @man: manager to adjust size for + * @p_size: new size. + */ +void ttm_range_man_adjust_size(struct ttm_resource_manager *man, + unsigned long p_size); + +/** + * ttm_range_man_size + * + * @man: manager to get size for + * Returns: + * size of range manager. + */ +unsigned long ttm_range_man_size(struct ttm_resource_manager *man); + #endif From patchwork Thu Aug 6 23:34:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dave Airlie X-Patchwork-Id: 11704541 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 A73C1913 for ; Thu, 6 Aug 2020 23:35:26 +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 BD09E2173E for ; Thu, 6 Aug 2020 23:35:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BD09E2173E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com 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 43A316E935; Thu, 6 Aug 2020 23:35:24 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) by gabe.freedesktop.org (Postfix) with ESMTPS id 30AED6E935 for ; Thu, 6 Aug 2020 23:35:23 +0000 (UTC) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-484-yc1dyVk8PhS6Vt4qKOEjkA-1; Thu, 06 Aug 2020 19:35:17 -0400 X-MC-Unique: yc1dyVk8PhS6Vt4qKOEjkA-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0815518C63D7; Thu, 6 Aug 2020 23:35:17 +0000 (UTC) Received: from tyrion-bne-redhat-com.redhat.com (vpn2-54-227.bne.redhat.com [10.64.54.227]) by smtp.corp.redhat.com (Postfix) with ESMTP id F29985FC36; Thu, 6 Aug 2020 23:35:15 +0000 (UTC) From: Dave Airlie To: dri-devel@lists.freedesktop.org Subject: [PATCH 4/4] drm/ttm/nouveau: move io_lru storage into driver. Date: Fri, 7 Aug 2020 09:34:59 +1000 Message-Id: <20200806233459.4057784-5-airlied@gmail.com> In-Reply-To: <20200806233459.4057784-1-airlied@gmail.com> References: <20200806233459.4057784-1-airlied@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: gmail.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: bskeggs@redhat.com, christian.koenig@amd.com Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Dave Airlie This moves the io lru tracking into the driver allocated structure. Probably need to consider if we can move more stuff in there around the nouveau only io_lru functionality. Reported-by: kernel test robot --- drivers/gpu/drm/nouveau/nouveau_ttm.c | 24 +++++++++++++++++++++--- drivers/gpu/drm/ttm/ttm_bo.c | 11 ++++++++--- drivers/gpu/drm/ttm/ttm_bo_util.c | 24 +++++++++++++++--------- include/drm/ttm/ttm_bo_api.h | 3 +++ include/drm/ttm/ttm_bo_driver.h | 19 +++++++++++-------- 5 files changed, 58 insertions(+), 23 deletions(-) diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c index 93685a376a50..86d74e590359 100644 --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c @@ -31,6 +31,16 @@ #include +struct nouveau_resource_manager { + struct ttm_resource_manager manager; + struct ttm_resource_manager_io_lru io_lru; +}; + +static inline struct nouveau_resource_manager *to_mgr(struct ttm_resource_manager *man) +{ + return container_of(man, struct nouveau_resource_manager, manager); +} + static void nouveau_manager_del(struct ttm_resource_manager *man, struct ttm_resource *reg) { @@ -63,9 +73,15 @@ nouveau_vram_manager_new(struct ttm_resource_manager *man, return 0; } +static struct ttm_resource_manager_io_lru *nouveau_resource_io_lru(struct ttm_resource_manager *man) +{ + return &to_mgr(man)->io_lru; +} + const struct ttm_resource_manager_func nouveau_vram_manager = { .get_node = nouveau_vram_manager_new, .put_node = nouveau_manager_del, + .io_lru = nouveau_resource_io_lru, }; static int @@ -160,7 +176,8 @@ nouveau_ttm_init_vram(struct nouveau_drm *drm) if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) { /* Some BARs do not support being ioremapped WC */ const u8 type = mmu->type[drm->ttm.type_vram].type; - struct ttm_resource_manager *man = kzalloc(sizeof(*man), GFP_KERNEL); + struct nouveau_resource_manager *nman = kzalloc(sizeof(*nman), GFP_KERNEL); + struct ttm_resource_manager *man = &nman->manager; if (!man) return -ENOMEM; @@ -173,9 +190,9 @@ nouveau_ttm_init_vram(struct nouveau_drm *drm) } man->func = &nouveau_vram_manager; - man->use_io_reserve_lru = true; ttm_resource_manager_init(man); + ttm_resource_manager_io_lru_init(&nman->io_lru); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_VRAM, man); ttm_resource_manager_set_used(man, true); return 0; @@ -193,11 +210,12 @@ nouveau_ttm_fini_vram(struct nouveau_drm *drm) struct ttm_resource_manager *man = ttm_manager_type(&drm->ttm.bdev, TTM_PL_VRAM); if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) { + struct nouveau_resource_manager *nman = to_mgr(man); ttm_resource_manager_set_used(man, false); ttm_resource_manager_force_list_clean(&drm->ttm.bdev, man); ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_VRAM, NULL); - kfree(man); + kfree(nman); } else ttm_range_man_fini(&drm->ttm.bdev, TTM_PL_VRAM); } diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index cf8176bce4f6..1ed67842370e 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -1467,14 +1467,19 @@ int ttm_bo_evict_mm(struct ttm_bo_device *bdev, unsigned mem_type) } EXPORT_SYMBOL(ttm_bo_evict_mm); +void ttm_resource_manager_io_lru_init(struct ttm_resource_manager_io_lru *io_lru) +{ + mutex_init(&io_lru->io_reserve_mutex); + INIT_LIST_HEAD(&io_lru->io_reserve_lru); +} +EXPORT_SYMBOL(ttm_resource_manager_io_lru_init); + void ttm_resource_manager_init(struct ttm_resource_manager *man) { unsigned i; - man->use_io_reserve_lru = false; - mutex_init(&man->io_reserve_mutex); + spin_lock_init(&man->move_lock); - INIT_LIST_HEAD(&man->io_reserve_lru); for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) INIT_LIST_HEAD(&man->lru[i]); diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 496158acd5b9..137aab6c53ae 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c @@ -93,29 +93,33 @@ EXPORT_SYMBOL(ttm_bo_move_ttm); int ttm_mem_io_lock(struct ttm_resource_manager *man, bool interruptible) { - if (likely(!man->use_io_reserve_lru)) + struct ttm_resource_manager_io_lru *io_lru; + if (!man->func && !man->func->io_lru) return 0; + io_lru = man->func->io_lru(man); if (interruptible) - return mutex_lock_interruptible(&man->io_reserve_mutex); + return mutex_lock_interruptible(&io_lru->io_reserve_mutex); - mutex_lock(&man->io_reserve_mutex); + mutex_lock(&io_lru->io_reserve_mutex); return 0; } void ttm_mem_io_unlock(struct ttm_resource_manager *man) { - if (likely(!man->use_io_reserve_lru)) + struct ttm_resource_manager_io_lru *io_lru; + if (!man->func && !man->func->io_lru) return; - mutex_unlock(&man->io_reserve_mutex); + io_lru = man->func->io_lru(man); + mutex_unlock(&io_lru->io_reserve_mutex); } static int ttm_mem_io_evict(struct ttm_resource_manager *man) { struct ttm_buffer_object *bo; - - bo = list_first_entry_or_null(&man->io_reserve_lru, + struct ttm_resource_manager_io_lru *io_lru = man->func->io_lru(man); + bo = list_first_entry_or_null(&io_lru->io_reserve_lru, struct ttm_buffer_object, io_reserve_lru); if (!bo) @@ -173,9 +177,11 @@ int ttm_mem_io_reserve_vm(struct ttm_buffer_object *bo) if (unlikely(ret != 0)) return ret; mem->bus.io_reserved_vm = true; - if (man->use_io_reserve_lru) + if (man->func && man->func->io_lru) { + struct ttm_resource_manager_io_lru *io_lru = man->func->io_lru(man); list_add_tail(&bo->io_reserve_lru, - &man->io_reserve_lru); + &io_lru->io_reserve_lru); + } return 0; } diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h index e4bf93482b59..fd34ca32ca66 100644 --- a/include/drm/ttm/ttm_bo_api.h +++ b/include/drm/ttm/ttm_bo_api.h @@ -56,6 +56,8 @@ struct ttm_lru_bulk_move; struct ttm_resource_manager; +struct ttm_resource_manager_io_lru; + /** * struct ttm_bus_placement * @@ -542,6 +544,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev, unsigned long size, */ void ttm_resource_manager_init(struct ttm_resource_manager *man); +void ttm_resource_manager_io_lru_init(struct ttm_resource_manager_io_lru *io_lru); /** * ttm_bo_evict_mm * diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index c719b4aa3793..d6e77f1d0183 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h @@ -46,6 +46,7 @@ #define TTM_MAX_BO_PRIORITY 4U struct ttm_resource_manager; +struct ttm_resource_manager_io_lru; struct ttm_resource_manager_func { /** @@ -106,6 +107,8 @@ struct ttm_resource_manager_func { */ void (*debug)(struct ttm_resource_manager *man, struct drm_printer *printer); + + struct ttm_resource_manager_io_lru *(*io_lru)(struct ttm_resource_manager *man); }; /** @@ -133,7 +136,14 @@ struct ttm_resource_manager_func { * This structure is used to identify and manage memory types for a device. */ +struct ttm_resource_manager_io_lru { + /* + * Protected by @io_reserve_mutex: + */ + struct list_head io_reserve_lru; + struct mutex io_reserve_mutex; +}; struct ttm_resource_manager { /* @@ -144,15 +154,8 @@ struct ttm_resource_manager { uint32_t available_caching; uint32_t default_caching; const struct ttm_resource_manager_func *func; - struct mutex io_reserve_mutex; - bool use_io_reserve_lru; - spinlock_t move_lock; - /* - * Protected by @io_reserve_mutex: - */ - - struct list_head io_reserve_lru; + spinlock_t move_lock; /* * Protected by the global->lru_lock.