All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] drm/amdgpu: pin_size fixes
@ 2018-06-15 14:42 Michel Dänzer
       [not found] ` <20180615144230.18480-1-michel-otUistvHUpPR7s880joybQ@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Michel Dänzer @ 2018-06-15 14:42 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

From: Michel Dänzer <michel.daenzer@amd.com>

I came up with the fixes in patches 1 & 3 while looking into
https://bugs.freedesktop.org/106872 . It's not clear that these will be
enough to fix that, but they are moving in the right direction anyway.

Patch 2 is refactoring in preparation for patch 3.

Patch 4 is separate so that patches 1-3 can be backported to older
kernels which don't have amdgpu_gmc_vram_full_visible.

Michel Dänzer (4):
  drm/amdgpu: Update pin_size values before unpinning BO
  drm/amdgpu: Refactor amdgpu_vram_mgr_bo_invisible_size helper
  drm/amdgpu: Make amdgpu_vram_mgr_bo_invisible_size always accurate
  drm/amdgpu: Use gmc_vram_full_visible in vram_mgr_bo_invisible_size

 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c   | 24 ++++++-------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h      |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 38 ++++++++++++++++++++
 3 files changed, 49 insertions(+), 14 deletions(-)

-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/4] drm/amdgpu: Update pin_size values before unpinning BO
       [not found] ` <20180615144230.18480-1-michel-otUistvHUpPR7s880joybQ@public.gmane.org>
@ 2018-06-15 14:42   ` Michel Dänzer
  2018-06-15 14:42   ` [PATCH 2/4] drm/amdgpu: Refactor amdgpu_vram_mgr_bo_invisible_size helper Michel Dänzer
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 12+ messages in thread
From: Michel Dänzer @ 2018-06-15 14:42 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

From: Michel Dänzer <michel.daenzer@amd.com>

At least in theory, ttm_bo_validate may move the BO, in which case the
pin_size accounting would be inconsistent with when the BO was pinned.

Cc: stable@vger.kernel.org
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index f5b0b180a6cc..210e7631f4b7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -969,15 +969,6 @@ int amdgpu_bo_unpin(struct amdgpu_bo *bo)
 	bo->pin_count--;
 	if (bo->pin_count)
 		return 0;
-	for (i = 0; i < bo->placement.num_placement; i++) {
-		bo->placements[i].lpfn = 0;
-		bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
-	}
-	r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
-	if (unlikely(r)) {
-		dev_err(adev->dev, "%p validate failed for unpin\n", bo);
-		goto error;
-	}
 
 	if (bo->tbo.mem.mem_type == TTM_PL_VRAM) {
 		adev->vram_pin_size -= amdgpu_bo_size(bo);
@@ -987,7 +978,14 @@ int amdgpu_bo_unpin(struct amdgpu_bo *bo)
 		adev->gart_pin_size -= amdgpu_bo_size(bo);
 	}
 
-error:
+	for (i = 0; i < bo->placement.num_placement; i++) {
+		bo->placements[i].lpfn = 0;
+		bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
+	}
+	r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
+	if (unlikely(r))
+		dev_err(adev->dev, "%p validate failed for unpin\n", bo);
+
 	return r;
 }
 
-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/4] drm/amdgpu: Refactor amdgpu_vram_mgr_bo_invisible_size helper
       [not found] ` <20180615144230.18480-1-michel-otUistvHUpPR7s880joybQ@public.gmane.org>
  2018-06-15 14:42   ` [PATCH 1/4] drm/amdgpu: Update pin_size values before unpinning BO Michel Dänzer
@ 2018-06-15 14:42   ` Michel Dänzer
  2018-06-15 14:42   ` [PATCH 3/4] drm/amdgpu: Make amdgpu_vram_mgr_bo_invisible_size always accurate Michel Dänzer
  2018-06-15 14:42   ` [PATCH 4/4] drm/amdgpu: Use gmc_vram_full_visible in vram_mgr_bo_invisible_size Michel Dänzer
  3 siblings, 0 replies; 12+ messages in thread
From: Michel Dänzer @ 2018-06-15 14:42 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

From: Michel Dänzer <michel.daenzer@amd.com>

Preparation for the following fix, no functional change intended.

Cc: stable@vger.kernel.org
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c   |  6 ++----
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h      |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 16 ++++++++++++++++
 3 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 210e7631f4b7..512f59836436 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -918,8 +918,7 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
 	domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);
 	if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
 		adev->vram_pin_size += amdgpu_bo_size(bo);
-		if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
-			adev->invisible_pin_size += amdgpu_bo_size(bo);
+		adev->invisible_pin_size += amdgpu_vram_mgr_bo_invisible_size(bo);
 	} else if (domain == AMDGPU_GEM_DOMAIN_GTT) {
 		adev->gart_pin_size += amdgpu_bo_size(bo);
 	}
@@ -972,8 +971,7 @@ int amdgpu_bo_unpin(struct amdgpu_bo *bo)
 
 	if (bo->tbo.mem.mem_type == TTM_PL_VRAM) {
 		adev->vram_pin_size -= amdgpu_bo_size(bo);
-		if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
-			adev->invisible_pin_size -= amdgpu_bo_size(bo);
+		adev->invisible_pin_size -= amdgpu_vram_mgr_bo_invisible_size(bo);
 	} else if (bo->tbo.mem.mem_type == TTM_PL_TT) {
 		adev->gart_pin_size -= amdgpu_bo_size(bo);
 	}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
index e969c879d87e..e5da4654b630 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
@@ -73,6 +73,7 @@ bool amdgpu_gtt_mgr_has_gart_addr(struct ttm_mem_reg *mem);
 uint64_t amdgpu_gtt_mgr_usage(struct ttm_mem_type_manager *man);
 int amdgpu_gtt_mgr_recover(struct ttm_mem_type_manager *man);
 
+u64 amdgpu_vram_mgr_bo_invisible_size(struct amdgpu_bo *bo);
 uint64_t amdgpu_vram_mgr_usage(struct ttm_mem_type_manager *man);
 uint64_t amdgpu_vram_mgr_vis_usage(struct ttm_mem_type_manager *man);
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
index 9c47e860e5e6..491fd0a789f7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
@@ -96,6 +96,22 @@ static u64 amdgpu_vram_mgr_vis_size(struct amdgpu_device *adev,
 		adev->gmc.visible_vram_size : end) - start;
 }
 
+/**
+ * amdgpu_vram_mgr_bo_invisible_size - CPU invisible BO size
+ *
+ * @bo: &amdgpu_bo buffer object
+ *
+ * Returns:
+ * How much of the given &amdgpu_bo buffer object lies in CPU invisible VRAM.
+ */
+u64 amdgpu_vram_mgr_bo_invisible_size(struct amdgpu_bo *bo)
+{
+	if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
+		return amdgpu_bo_size(bo);
+
+	return 0;
+}
+
 /**
  * amdgpu_vram_mgr_new - allocate new ranges
  *
-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/4] drm/amdgpu: Make amdgpu_vram_mgr_bo_invisible_size always accurate
       [not found] ` <20180615144230.18480-1-michel-otUistvHUpPR7s880joybQ@public.gmane.org>
  2018-06-15 14:42   ` [PATCH 1/4] drm/amdgpu: Update pin_size values before unpinning BO Michel Dänzer
  2018-06-15 14:42   ` [PATCH 2/4] drm/amdgpu: Refactor amdgpu_vram_mgr_bo_invisible_size helper Michel Dänzer
@ 2018-06-15 14:42   ` Michel Dänzer
       [not found]     ` <20180615144230.18480-4-michel-otUistvHUpPR7s880joybQ@public.gmane.org>
  2018-06-15 14:42   ` [PATCH 4/4] drm/amdgpu: Use gmc_vram_full_visible in vram_mgr_bo_invisible_size Michel Dänzer
  3 siblings, 1 reply; 12+ messages in thread
From: Michel Dänzer @ 2018-06-15 14:42 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

From: Michel Dänzer <michel.daenzer@amd.com>

Even BOs with AMDGPU_GEM_CREATE_NO_CPU_ACCESS may end up at least
partially in CPU visible VRAM, in particular when all VRAM is visible.

Cc: stable@vger.kernel.org
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 26 ++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
index 491fd0a789f7..9b34df7017f0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
@@ -106,10 +106,32 @@ static u64 amdgpu_vram_mgr_vis_size(struct amdgpu_device *adev,
  */
 u64 amdgpu_vram_mgr_bo_invisible_size(struct amdgpu_bo *bo)
 {
-	if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
+	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
+	struct amdgpu_vram_mgr *mgr = adev->mman.bdev.man[TTM_PL_VRAM].priv;
+	struct ttm_mem_reg *mem = &bo->tbo.mem;
+	struct drm_mm_node *nodes = mem->mm_node;
+	unsigned pages = mem->num_pages;
+	u64 usage = 0;
+
+	if (adev->gmc.visible_vram_size == adev->gmc.real_vram_size)
+		return 0;
+
+	if (mem->start >= adev->gmc.visible_vram_size >> PAGE_SHIFT)
 		return amdgpu_bo_size(bo);
 
-	return 0;
+	if (!nodes)
+		return 0;
+
+	spin_lock(&mgr->lock);
+	while (pages) {
+		pages -= nodes->size;
+		usage += nodes->size << PAGE_SHIFT;
+		usage -= amdgpu_vram_mgr_vis_size(adev, nodes);
+		++nodes;
+	}
+	spin_unlock(&mgr->lock);
+
+	return usage;
 }
 
 /**
-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/4] drm/amdgpu: Use gmc_vram_full_visible in vram_mgr_bo_invisible_size
       [not found] ` <20180615144230.18480-1-michel-otUistvHUpPR7s880joybQ@public.gmane.org>
                     ` (2 preceding siblings ...)
  2018-06-15 14:42   ` [PATCH 3/4] drm/amdgpu: Make amdgpu_vram_mgr_bo_invisible_size always accurate Michel Dänzer
@ 2018-06-15 14:42   ` Michel Dänzer
  3 siblings, 0 replies; 12+ messages in thread
From: Michel Dänzer @ 2018-06-15 14:42 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

From: Michel Dänzer <michel.daenzer@amd.com>

Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
index 9b34df7017f0..9814e9aab317 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
@@ -113,7 +113,7 @@ u64 amdgpu_vram_mgr_bo_invisible_size(struct amdgpu_bo *bo)
 	unsigned pages = mem->num_pages;
 	u64 usage = 0;
 
-	if (adev->gmc.visible_vram_size == adev->gmc.real_vram_size)
+	if (amdgpu_gmc_vram_full_visible(&adev->gmc))
 		return 0;
 
 	if (mem->start >= adev->gmc.visible_vram_size >> PAGE_SHIFT)
-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] drm/amdgpu: Make amdgpu_vram_mgr_bo_invisible_size always accurate
       [not found]     ` <20180615144230.18480-4-michel-otUistvHUpPR7s880joybQ@public.gmane.org>
@ 2018-06-15 15:11       ` Christian König
       [not found]         ` <093bbd7a-02cd-068f-a53a-2d4f1c5b3084-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2018-06-18 16:52       ` [PATCH v2 " Michel Dänzer
  1 sibling, 1 reply; 12+ messages in thread
From: Christian König @ 2018-06-15 15:11 UTC (permalink / raw)
  To: Michel Dänzer, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Am 15.06.2018 um 16:42 schrieb Michel Dänzer:
> From: Michel Dänzer <michel.daenzer@amd.com>
>
> Even BOs with AMDGPU_GEM_CREATE_NO_CPU_ACCESS may end up at least
> partially in CPU visible VRAM, in particular when all VRAM is visible.
>
> Cc: stable@vger.kernel.org
> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 26 ++++++++++++++++++--
>   1 file changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> index 491fd0a789f7..9b34df7017f0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> @@ -106,10 +106,32 @@ static u64 amdgpu_vram_mgr_vis_size(struct amdgpu_device *adev,
>    */
>   u64 amdgpu_vram_mgr_bo_invisible_size(struct amdgpu_bo *bo)
>   {
> -	if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
> +	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
> +	struct amdgpu_vram_mgr *mgr = adev->mman.bdev.man[TTM_PL_VRAM].priv;
> +	struct ttm_mem_reg *mem = &bo->tbo.mem;
> +	struct drm_mm_node *nodes = mem->mm_node;
> +	unsigned pages = mem->num_pages;
> +	u64 usage = 0;
> +
> +	if (adev->gmc.visible_vram_size == adev->gmc.real_vram_size)
> +		return 0;

Andrey just added a helper for that into amdgpu_gmc.h.

> +
> +	if (mem->start >= adev->gmc.visible_vram_size >> PAGE_SHIFT)
>   		return amdgpu_bo_size(bo);
>   
> -	return 0;
> +	if (!nodes)
> +		return 0;
> +
> +	spin_lock(&mgr->lock);

I actually don't see any need to grab the lock here.

Apart from that looks like a good cleanup to me,
Christian.

> +	while (pages) {
> +		pages -= nodes->size;
> +		usage += nodes->size << PAGE_SHIFT;
> +		usage -= amdgpu_vram_mgr_vis_size(adev, nodes);
> +		++nodes;
> +	}
> +	spin_unlock(&mgr->lock);
> +
> +	return usage;
>   }
>   
>   /**

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] drm/amdgpu: Make amdgpu_vram_mgr_bo_invisible_size always accurate
       [not found]         ` <093bbd7a-02cd-068f-a53a-2d4f1c5b3084-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2018-06-15 15:14           ` Michel Dänzer
       [not found]             ` <098df480-3db3-485f-8e39-4ebf8201b3a0-otUistvHUpPR7s880joybQ@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Michel Dänzer @ 2018-06-15 15:14 UTC (permalink / raw)
  To: christian.koenig-5C7GfCeVMHo; +Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

On 2018-06-15 05:11 PM, Christian König wrote:
> Am 15.06.2018 um 16:42 schrieb Michel Dänzer:
>> From: Michel Dänzer <michel.daenzer@amd.com>
>>
>> Even BOs with AMDGPU_GEM_CREATE_NO_CPU_ACCESS may end up at least
>> partially in CPU visible VRAM, in particular when all VRAM is visible.
>>
>> Cc: stable@vger.kernel.org
>> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 26 ++++++++++++++++++--
>>   1 file changed, 24 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
>> index 491fd0a789f7..9b34df7017f0 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
>> @@ -106,10 +106,32 @@ static u64 amdgpu_vram_mgr_vis_size(struct
>> amdgpu_device *adev,
>>    */
>>   u64 amdgpu_vram_mgr_bo_invisible_size(struct amdgpu_bo *bo)
>>   {
>> -    if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
>> +    struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
>> +    struct amdgpu_vram_mgr *mgr = adev->mman.bdev.man[TTM_PL_VRAM].priv;
>> +    struct ttm_mem_reg *mem = &bo->tbo.mem;
>> +    struct drm_mm_node *nodes = mem->mm_node;
>> +    unsigned pages = mem->num_pages;
>> +    u64 usage = 0;
>> +
>> +    if (adev->gmc.visible_vram_size == adev->gmc.real_vram_size)
>> +        return 0;
> 
> Andrey just added a helper for that into amdgpu_gmc.h.

Yep, see patch 4 and the cover letter. :)


>> +
>> +    if (mem->start >= adev->gmc.visible_vram_size >> PAGE_SHIFT)
>>           return amdgpu_bo_size(bo);
>>   -    return 0;
>> +    if (!nodes)
>> +        return 0;
>> +
>> +    spin_lock(&mgr->lock);
> 
> I actually don't see any need to grab the lock here.

Ah, so amdgpu_vram_mgr_del only grabs it for drm_mm_remove_node?


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] drm/amdgpu: Make amdgpu_vram_mgr_bo_invisible_size always accurate
       [not found]             ` <098df480-3db3-485f-8e39-4ebf8201b3a0-otUistvHUpPR7s880joybQ@public.gmane.org>
@ 2018-06-15 15:18               ` Christian König
       [not found]                 ` <b94d92e5-908d-534a-907a-ad97124b22ec-5C7GfCeVMHo@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Christian König @ 2018-06-15 15:18 UTC (permalink / raw)
  To: Michel Dänzer; +Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Am 15.06.2018 um 17:14 schrieb Michel Dänzer:
> On 2018-06-15 05:11 PM, Christian König wrote:
>> Am 15.06.2018 um 16:42 schrieb Michel Dänzer:
>>> From: Michel Dänzer <michel.daenzer@amd.com>
>>>
>>> Even BOs with AMDGPU_GEM_CREATE_NO_CPU_ACCESS may end up at least
>>> partially in CPU visible VRAM, in particular when all VRAM is visible.
>>>
>>> Cc: stable@vger.kernel.org
>>> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
>>> ---
>>>    drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 26 ++++++++++++++++++--
>>>    1 file changed, 24 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
>>> index 491fd0a789f7..9b34df7017f0 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
>>> @@ -106,10 +106,32 @@ static u64 amdgpu_vram_mgr_vis_size(struct
>>> amdgpu_device *adev,
>>>     */
>>>    u64 amdgpu_vram_mgr_bo_invisible_size(struct amdgpu_bo *bo)
>>>    {
>>> -    if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
>>> +    struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
>>> +    struct amdgpu_vram_mgr *mgr = adev->mman.bdev.man[TTM_PL_VRAM].priv;
>>> +    struct ttm_mem_reg *mem = &bo->tbo.mem;
>>> +    struct drm_mm_node *nodes = mem->mm_node;
>>> +    unsigned pages = mem->num_pages;
>>> +    u64 usage = 0;
>>> +
>>> +    if (adev->gmc.visible_vram_size == adev->gmc.real_vram_size)
>>> +        return 0;
>> Andrey just added a helper for that into amdgpu_gmc.h.
> Yep, see patch 4 and the cover letter. :)

Yeah, seen that after hitting send :)

>>> +
>>> +    if (mem->start >= adev->gmc.visible_vram_size >> PAGE_SHIFT)
>>>            return amdgpu_bo_size(bo);
>>>    -    return 0;
>>> +    if (!nodes)
>>> +        return 0;
>>> +
>>> +    spin_lock(&mgr->lock);
>> I actually don't see any need to grab the lock here.
> Ah, so amdgpu_vram_mgr_del only grabs it for drm_mm_remove_node?

Yes, exactly.

Christian.
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] drm/amdgpu: Make amdgpu_vram_mgr_bo_invisible_size always accurate
       [not found]                 ` <b94d92e5-908d-534a-907a-ad97124b22ec-5C7GfCeVMHo@public.gmane.org>
@ 2018-06-15 15:19                   ` Michel Dänzer
       [not found]                     ` <3140ef24-f8c9-5863-ff44-4c83192eabb1-otUistvHUpPR7s880joybQ@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Michel Dänzer @ 2018-06-15 15:19 UTC (permalink / raw)
  To: Christian König; +Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

On 2018-06-15 05:18 PM, Christian König wrote:
> Am 15.06.2018 um 17:14 schrieb Michel Dänzer:
>> On 2018-06-15 05:11 PM, Christian König wrote:
>>> Am 15.06.2018 um 16:42 schrieb Michel Dänzer:
> 
>>>> +
>>>> +    if (mem->start >= adev->gmc.visible_vram_size >> PAGE_SHIFT)
>>>>            return amdgpu_bo_size(bo);
>>>>    -    return 0;
>>>> +    if (!nodes)
>>>> +        return 0;
>>>> +
>>>> +    spin_lock(&mgr->lock);
>>> I actually don't see any need to grab the lock here.
>> Ah, so amdgpu_vram_mgr_del only grabs it for drm_mm_remove_node?
> 
> Yes, exactly.

Will drop it in v2, thanks!


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/4] drm/amdgpu: Make amdgpu_vram_mgr_bo_invisible_size always accurate
       [not found]                     ` <3140ef24-f8c9-5863-ff44-4c83192eabb1-otUistvHUpPR7s880joybQ@public.gmane.org>
@ 2018-06-18 11:30                       ` Christian König
  0 siblings, 0 replies; 12+ messages in thread
From: Christian König @ 2018-06-18 11:30 UTC (permalink / raw)
  To: Michel Dänzer, Christian König
  Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Am 15.06.2018 um 17:19 schrieb Michel Dänzer:
> On 2018-06-15 05:18 PM, Christian König wrote:
>> Am 15.06.2018 um 17:14 schrieb Michel Dänzer:
>>> On 2018-06-15 05:11 PM, Christian König wrote:
>>>> Am 15.06.2018 um 16:42 schrieb Michel Dänzer:
>>>>> +
>>>>> +    if (mem->start >= adev->gmc.visible_vram_size >> PAGE_SHIFT)
>>>>>             return amdgpu_bo_size(bo);
>>>>>     -    return 0;
>>>>> +    if (!nodes)
>>>>> +        return 0;
>>>>> +
>>>>> +    spin_lock(&mgr->lock);
>>>> I actually don't see any need to grab the lock here.
>>> Ah, so amdgpu_vram_mgr_del only grabs it for drm_mm_remove_node?
>> Yes, exactly.
> Will drop it in v2, thanks!

Haven't seeen v2 yet, but with that lock removed the whole series is 
Reviewed-by: Christian König <christian.koenig@amd.com>.

Regards,
Christian.
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 3/4] drm/amdgpu: Make amdgpu_vram_mgr_bo_invisible_size always accurate
       [not found]     ` <20180615144230.18480-4-michel-otUistvHUpPR7s880joybQ@public.gmane.org>
  2018-06-15 15:11       ` Christian König
@ 2018-06-18 16:52       ` Michel Dänzer
       [not found]         ` <20180618165233.5718-1-michel-otUistvHUpPR7s880joybQ@public.gmane.org>
  1 sibling, 1 reply; 12+ messages in thread
From: Michel Dänzer @ 2018-06-18 16:52 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Christian König

From: Michel Dänzer <michel.daenzer@amd.com>

Even BOs with AMDGPU_GEM_CREATE_NO_CPU_ACCESS may end up at least
partially in CPU visible VRAM, in particular when all VRAM is visible.

v2:
* Don't take VRAM mgr spinlock, not needed (Christian König)
* Make loop logic simpler and clearer.

Cc: stable@vger.kernel.org
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
index ae0049c6c52c..b6333f92ba45 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
@@ -106,10 +106,26 @@ static u64 amdgpu_vram_mgr_vis_size(struct amdgpu_device *adev,
  */
 u64 amdgpu_vram_mgr_bo_invisible_size(struct amdgpu_bo *bo)
 {
-	if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
+	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
+	struct ttm_mem_reg *mem = &bo->tbo.mem;
+	struct drm_mm_node *nodes = mem->mm_node;
+	unsigned pages = mem->num_pages;
+	u64 usage = 0;
+
+	if (adev->gmc.visible_vram_size == adev->gmc.real_vram_size)
+		return 0;
+
+	if (mem->start >= adev->gmc.visible_vram_size >> PAGE_SHIFT)
 		return amdgpu_bo_size(bo);
 
-	return 0;
+	while (nodes && pages) {
+		usage += nodes->size << PAGE_SHIFT;
+		usage -= amdgpu_vram_mgr_vis_size(adev, nodes);
+		pages -= nodes->size;
+		++nodes;
+	}
+
+	return usage;
 }
 
 /**
-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 3/4] drm/amdgpu: Make amdgpu_vram_mgr_bo_invisible_size always accurate
       [not found]         ` <20180618165233.5718-1-michel-otUistvHUpPR7s880joybQ@public.gmane.org>
@ 2018-06-18 17:04           ` Christian König
  0 siblings, 0 replies; 12+ messages in thread
From: Christian König @ 2018-06-18 17:04 UTC (permalink / raw)
  To: Michel Dänzer, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Am 18.06.2018 um 18:52 schrieb Michel Dänzer:
> From: Michel Dänzer <michel.daenzer@amd.com>
>
> Even BOs with AMDGPU_GEM_CREATE_NO_CPU_ACCESS may end up at least
> partially in CPU visible VRAM, in particular when all VRAM is visible.
>
> v2:
> * Don't take VRAM mgr spinlock, not needed (Christian König)
> * Make loop logic simpler and clearer.
>
> Cc: stable@vger.kernel.org
> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>

Reviewed-by: Christian König <christian.koenig@amd.com>

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 20 ++++++++++++++++++--
>   1 file changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> index ae0049c6c52c..b6333f92ba45 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> @@ -106,10 +106,26 @@ static u64 amdgpu_vram_mgr_vis_size(struct amdgpu_device *adev,
>    */
>   u64 amdgpu_vram_mgr_bo_invisible_size(struct amdgpu_bo *bo)
>   {
> -	if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
> +	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
> +	struct ttm_mem_reg *mem = &bo->tbo.mem;
> +	struct drm_mm_node *nodes = mem->mm_node;
> +	unsigned pages = mem->num_pages;
> +	u64 usage = 0;
> +
> +	if (adev->gmc.visible_vram_size == adev->gmc.real_vram_size)
> +		return 0;
> +
> +	if (mem->start >= adev->gmc.visible_vram_size >> PAGE_SHIFT)
>   		return amdgpu_bo_size(bo);
>   
> -	return 0;
> +	while (nodes && pages) {
> +		usage += nodes->size << PAGE_SHIFT;
> +		usage -= amdgpu_vram_mgr_vis_size(adev, nodes);
> +		pages -= nodes->size;
> +		++nodes;
> +	}
> +
> +	return usage;
>   }
>   
>   /**

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2018-06-18 17:04 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-15 14:42 [PATCH 0/4] drm/amdgpu: pin_size fixes Michel Dänzer
     [not found] ` <20180615144230.18480-1-michel-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-06-15 14:42   ` [PATCH 1/4] drm/amdgpu: Update pin_size values before unpinning BO Michel Dänzer
2018-06-15 14:42   ` [PATCH 2/4] drm/amdgpu: Refactor amdgpu_vram_mgr_bo_invisible_size helper Michel Dänzer
2018-06-15 14:42   ` [PATCH 3/4] drm/amdgpu: Make amdgpu_vram_mgr_bo_invisible_size always accurate Michel Dänzer
     [not found]     ` <20180615144230.18480-4-michel-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-06-15 15:11       ` Christian König
     [not found]         ` <093bbd7a-02cd-068f-a53a-2d4f1c5b3084-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-06-15 15:14           ` Michel Dänzer
     [not found]             ` <098df480-3db3-485f-8e39-4ebf8201b3a0-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-06-15 15:18               ` Christian König
     [not found]                 ` <b94d92e5-908d-534a-907a-ad97124b22ec-5C7GfCeVMHo@public.gmane.org>
2018-06-15 15:19                   ` Michel Dänzer
     [not found]                     ` <3140ef24-f8c9-5863-ff44-4c83192eabb1-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-06-18 11:30                       ` Christian König
2018-06-18 16:52       ` [PATCH v2 " Michel Dänzer
     [not found]         ` <20180618165233.5718-1-michel-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-06-18 17:04           ` Christian König
2018-06-15 14:42   ` [PATCH 4/4] drm/amdgpu: Use gmc_vram_full_visible in vram_mgr_bo_invisible_size Michel Dänzer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.