[PATCH] drm/amd/amdgpu: Add tracepoint for DMA page mapping
Christian König
deathsimple at vodafone.de
Tue Aug 1 14:10:02 UTC 2017
Am 01.08.2017 um 14:29 schrieb Tom St Denis:
> On 01/08/17 07:55 AM, Christian König wrote:
>> Am 01.08.2017 um 13:51 schrieb Tom St Denis:
>>> This helps map DMA addresses back to physical addresses.
>>>
>>> Signed-off-by: Tom St Denis <tom.stdenis at amd.com>
>>> ---
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | 28
>>> ++++++++++++++++++++++++++++
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 8 ++++++++
>>> 2 files changed, 36 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
>>> index 509f7a63d40c..5b2bb28da504 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
>>> @@ -14,6 +14,34 @@
>>> #define AMDGPU_JOB_GET_TIMELINE_NAME(job) \
>>> job->base.s_fence->finished.ops->get_timeline_name(&job->base.s_fence->finished)
>>>
>>> +TRACE_EVENT(amdgpu_ttm_tt_populate,
>>> + TP_PROTO(uint16_t domain, uint8_t bus, uint8_t slot,
>>> uint8_t func, uint64_t dma_address, uint64_t phys_address),
>>> + TP_ARGS(domain, bus, slot, func, dma_address, phys_address),
>>> + TP_STRUCT__entry(
>>> + __field(uint16_t, domain)
>>> + __field(uint8_t, bus)
>>> + __field(uint8_t, slot)
>>> + __field(uint8_t, func)
>>> + __field(uint64_t, dma)
>>> + __field(uint64_t, phys)
>>> + ),
>>
>> Better just give adev here and extract the values during the fast
>> assign.
>
> Easy enough, I've done this now.
>
>>
>>> + TP_fast_assign(
>>> + __entry->domain = domain;
>>> + __entry->bus = bus;
>>> + __entry->slot = slot;
>>> + __entry->func = func;
>>> + __entry->dma = dma_address;
>>> + __entry->phys = phys_address;
>>> + ),
>>> + TP_printk("%04x:%02x:%02x.%x: 0x%llx => 0x%llx",
>>> + (unsigned)__entry->domain,
>>> + (unsigned)__entry->bus,
>>> + (unsigned)__entry->slot,
>>> + (unsigned)__entry->func,
>>> + (unsigned long long)__entry->dma,
>>> + (unsigned long long)__entry->phys)
>>> +);
>>> +
>>> TRACE_EVENT(amdgpu_mm_rreg,
>>> TP_PROTO(unsigned did, uint32_t reg, uint32_t value),
>>> TP_ARGS(did, reg, value),
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>> index 8da59d212b3b..1cf274603476 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>> @@ -43,6 +43,7 @@
>>> #include <linux/pagemap.h>
>>> #include <linux/debugfs.h>
>>> #include "amdgpu.h"
>>> +#include "amdgpu_trace.h"
>>> #include "bif/bif_4_1_d.h"
>>> #define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT)
>>> @@ -944,6 +945,13 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt
>>> *ttm)
>>> ttm_pool_unpopulate(ttm);
>>> return -EFAULT;
>>> }
>>> + trace_amdgpu_ttm_tt_populate(
>>> + pci_domain_nr(adev->pdev->bus),
>>> + adev->pdev->bus->number,
>>> + PCI_SLOT(adev->pdev->devfn),
>>> + PCI_FUNC(adev->pdev->devfn),
>>> + gtt->ttm.dma_address[i],
>>> + page_to_phys(ttm->pages[i]));
>>
>> Please add that tracing for the dma pool path as well.
>>
>> With that fixed the change looks good to me,
>> Christian.
>
> Unsure what you mean here. The ttm_pool_populate() seems to be
> preparing the page list to back the request.
You need to cover multiple code path here:
1. The one you currently implemented which uses ttm_dma_populate() and
pci_map_page().
2. The one using ttm_dma_populate().
3. The one using drm_prime_sg_to_page_addr_arrays() a bit above for
imported BOs.
4. The in amdgpu_ttm_tt_pin_userptr() which uses dma_map_sg() for userptrs.
Basically all just take gtt->ttm.ttm.pages and fill gtt->ttm.dma_address.
I suggest to add a helper you can call to trace all pages->dma_address
mappings inside a ttm.
Regards,
Christian.
>
> Tom
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list