AMD-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
To: "Christian König" <christian.koenig@amd.com>,
	"Li, Yunxiang (Teddy)" <Yunxiang.Li@amd.com>,
	"Christian König" <ckoenig.leichtzumerken@gmail.com>,
	"amd-gfx@lists.freedesktop.org" <amd-gfx@lists.freedesktop.org>
Cc: "Deucher, Alexander" <Alexander.Deucher@amd.com>
Subject: Re: [PATCH v7 4/4] drm/amdgpu: track bo memory stats at runtime
Date: Wed, 13 Nov 2024 10:25:01 +0000	[thread overview]
Message-ID: <cc63f0ef-e152-49fc-90d9-ca695a8918f3@igalia.com> (raw)
In-Reply-To: <92be210e-b552-45ee-9322-1944a4bfd325@amd.com>


On 13/11/2024 08:49, Christian König wrote:
> Am 12.11.24 um 19:16 schrieb Li, Yunxiang (Teddy):
>> [Public]
>>
>>> From: Christian König <ckoenig.leichtzumerken@gmail.com>
>>> Sent: Tuesday, November 12, 2024 5:54
>>> Am 10.11.24 um 16:41 schrieb Yunxiang Li:
>>>> @@ -310,6 +311,92 @@ static void 
>>>> amdgpu_vm_bo_reset_state_machine(struct
>>> amdgpu_vm *vm)
>>>>      spin_unlock(&vm->status_lock);
>>>>    }
>>>>
>>>> +/**
>>>> + * amdgpu_vm_update_shared - helper to update shared memory stat
>>>> + * @base: base structure for tracking BO usage in a VM
>>>> + * @sign: if we should add (+1) or subtract (-1) from the shared stat
>>>> + *
>>>> + * Takes the vm status_lock and updates the shared memory stat. If
>>>> +the basic
>>>> + * stat changed (e.g. buffer was moved) amdgpu_vm_update_stats need
>>>> +to be called
>>>> + * as well.
>>>> + */
>>>> +static void amdgpu_vm_update_shared(struct amdgpu_vm_bo_base *base,
>>>> +int sign) {
>>>> +   struct amdgpu_vm *vm = base->vm;
>>>> +   struct amdgpu_bo *bo = base->bo;
>>>> +   struct ttm_resource *res;
>>>> +   int64_t size;
>>>> +   uint32_t type;
>>>> +
>>>> +   if (!vm || !bo)
>>>> +           return;
>>>> +
>>>> +   size = sign * amdgpu_bo_size(bo);
>>>> +   res = bo->tbo.resource;
>>>> +   type = res ? res->mem_type : amdgpu_bo_get_preferred_placement(bo);
>>> Again, it's a clear NAK from my side to do stuff like that.
>>>
>>> When there isn't any backing store the BO should *not* be accounted 
>>> to anything.
>> I don't have a preference either way, but I think it should be a 
>> separate discussion to properly define what drm-total- means.

Total must show the total size of all BOs which exist even if they don't 
currently have a backing store. That's how drm-usage-stats.rst defines 
the field and that is how all the other drivers work.

>>>> +   type = res ? res->mem_type : amdgpu_bo_get_preferred_placement(bo);
>>>> +   shared = drm_gem_object_is_shared_for_memory_stats(&bo->tbo.base);
>>>> +
>>>> +   if (type >= __AMDGPU_PL_LAST)
>>>> +           return;
>>>> +
>>>> +   spin_lock(&vm->status_lock);
>>>> +
>>>> +   if (shared)
>>>> +           vm->stats[type].drm.shared += size;
>>>> +   else
>>>> +           vm->stats[type].drm.private += size;
>>>> +   if (res)
>>>> +           vm->stats[type].drm.resident += size;
>>>> +   if (bo->flags & AMDGPU_GEM_CREATE_DISCARDABLE)
>>>> +           vm->stats[type].drm.purgeable += size;
>>>> +
>>>> +   if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) {
>>>> +           vm->stats[TTM_PL_VRAM].requested += size;
>>>> +           if (type != TTM_PL_VRAM)
>>>> +                   vm->stats[TTM_PL_VRAM].evicted += size;
>>> Again that is incorrect. BOs can be created with VRAM|GTT as their 
>>> placement.
>>>
>>> If such a BO is placed into GTT that doesn't mean it is evicted.
>> In that case, do we count BO with VRAM|GTT in both VRAM and GTT's 
>> .requested field? and if they are not in either, they go in both 
>> .evicted field?
> 
> Oh, good question depends on the definition of the requested field.
> 
> Accounting it to VRAM.evicted while GTT placement is desirable as well 
> is certainly not correct.
> 
>  From my understanding they should go into the VRAM request, but not 
> account to evicted. But Tvrtko might see that differently.

Semantics of requested and evicted are kind of amdgpu 'legacy' thing. So 
the question is whether or not they should keep matching. Originally 
they were like this (I will edit out parts which deal with CPU visible 
for ease of comparison, and which have since been removed anyway):

        if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) {
                stats->requested_vram += size;
                if (res->mem_type != TTM_PL_VRAM)
                         stats->evicted_vram += size;
         } else if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_GTT) {
                stats->requested_gtt += size;
         }

So the part about accounting as evicted with dual preferred placement 
was there from the start.

Then after my changes:

         if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) {
                 stats[TTM_PL_VRAM].requested += size;
                 if (type != TTM_PL_VRAM) {
                         stats[TTM_PL_VRAM].evicted += size;
                 }
         } else if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_GTT) {
                 stats[TTM_PL_TT].requested += size;
         }

I mostly kept the same semantics.

Teddy's version keeps it the same:

	if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) {
		vm->stats[TTM_PL_VRAM].requested += size;
		if (type != TTM_PL_VRAM)
			vm->stats[TTM_PL_VRAM].evicted += size;
	} else if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_GTT) {
		vm->stats[TTM_PL_TT].requested += size;
	}

If no AMD tools depend on the legacy semantics for evicted/requested we 
can change them. There is some overlap with the standard keys anyway and 
the fact preferred mask is unordered made the original behaviour a bit 
presumptuous to begin with. In summary I think it depends on whether we 
need to keep the legacy semantics, or even the keys themselves.

Regards,

Tvrtko

>>>> @@ -2612,7 +2707,6 @@ void amdgpu_vm_fini(struct amdgpu_device *adev,
>>>> struct amdgpu_vm *vm)
>>>>
>>>>      root = amdgpu_bo_ref(vm->root.bo);
>>>>      amdgpu_bo_reserve(root, true);
>>>> -   amdgpu_vm_put_task_info(vm->task_info);
>>>>      amdgpu_vm_set_pasid(adev, vm, 0);
>>>>      dma_fence_wait(vm->last_unlocked, false);
>>>>      dma_fence_put(vm->last_unlocked);
>>>> @@ -2660,6 +2754,15 @@ void amdgpu_vm_fini(struct amdgpu_device *adev,
>>> struct amdgpu_vm *vm)
>>>>              }
>>>>      }
>>>>
>>>> +   if (!amdgpu_vm_stats_is_zero(vm)) {
>>>> +           struct amdgpu_task_info *ti = vm->task_info;
>>>> +
>>>> +           dev_warn(adev->dev,
>>>> +                    "VM memory stats for proc %s(%d) task %s(%d) is 
>>>> non-zero
>>> when fini\n",
>>>> +                    ti->process_name, ti->pid, ti->task_name, 
>>>> ti->tgid);
>>>> +   }
>>>> +
>>>> +   amdgpu_vm_put_task_info(vm->task_info);
>>> Please don't move the call to amdgpu_vm_put_task_info().
>> Is keeping the task_info alive a hazard here? I could copy out the 
>> info, it just seemed a bit wasteful.
> 
> Ah, now I see why you have moved that.
> 
> IIRC we need to free up the task info before releasing the PASID, but 
> that info might be outdated. Need to check the code.
> 
> Does it work if you move the message further up or does the root PD then 
> break your neck because it isn't released yet?
> 
> Thanks,
> Christian.
> 
>>
>> Regards,
>> Teddy
> 

  reply	other threads:[~2024-11-13 14:04 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-10 15:41 [PATCH v7 0/4] rework bo mem stats tracking Yunxiang Li
2024-11-10 15:41 ` [PATCH v7 1/4] drm: add drm_memory_stats_is_zero Yunxiang Li
2024-11-10 15:41 ` [PATCH v7 2/4] drm: make drm-active- stats optional Yunxiang Li
2024-11-11  9:14   ` Jani Nikula
2024-11-11 14:28     ` [PATCH v8 " Yunxiang Li
2024-11-11 10:29   ` [PATCH v7 " Tvrtko Ursulin
2024-11-18 15:17     ` Li, Yunxiang (Teddy)
2024-11-18 15:42       ` Tvrtko Ursulin
2024-11-10 15:41 ` [PATCH v7 3/4] drm/amdgpu: remove unused function parameter Yunxiang Li
2024-11-10 15:41 ` [PATCH v7 4/4] drm/amdgpu: track bo memory stats at runtime Yunxiang Li
2024-11-12 10:54   ` Christian König
2024-11-12 18:16     ` Li, Yunxiang (Teddy)
2024-11-13  8:49       ` Christian König
2024-11-13 10:25         ` Tvrtko Ursulin [this message]
2024-11-13 11:38           ` Christian König
2024-11-13 13:53             ` Li, Yunxiang (Teddy)
2024-11-13 14:22               ` Christian König
2024-11-13 17:01                 ` Li, Yunxiang (Teddy)
2024-11-13 17:30                   ` Tvrtko Ursulin
2024-11-14  9:06                     ` Matthew Auld
2024-11-14 15:52                     ` Li, Yunxiang (Teddy)
2024-11-13 14:09         ` Li, Yunxiang (Teddy)
2024-11-13 14:19           ` Christian König

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cc63f0ef-e152-49fc-90d9-ca695a8918f3@igalia.com \
    --to=tvrtko.ursulin@igalia.com \
    --cc=Alexander.Deucher@amd.com \
    --cc=Yunxiang.Li@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=christian.koenig@amd.com \
    --cc=ckoenig.leichtzumerken@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox