[PATCH] drm/amd/amdgpu: Add tracepoint for DMA page mapping (v3)

Tom St Denis tom.stdenis at amd.com
Tue Aug 8 13:56:34 UTC 2017


Thanks, I pushed v4 which moved the tracepoints into functions.

Cheers,
Tom

On 08/08/17 08:01 AM, Christian König wrote:
> Am 08.08.2017 um 13:54 schrieb Tom St Denis:
>> ping?
> 
> Ups sorry, thought that I already send that out. One comment below.
> 
>>
>> Tom
>>
>> On 02/08/17 07:52 AM, Tom St Denis wrote:
>>> This helps map DMA addresses back to physical addresses.
>>>
>>> Signed-off-by: Tom St Denis <tom.stdenis at amd.com>
>>>
>>> (v2):  Added tracepoints for USERPTR, SG mappings, and
>>>       SWIOTBL mappings.  Reformatted trace call perform
>>>       PCI decoding internal to the trace.
>>>
>>> (v3):  Add unmap tracepoints as well
>>> ---
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | 56 
>>> +++++++++++++++++++++++++++++++
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c   | 55 
>>> ++++++++++++++++++++++++++----
>>>   2 files changed, 104 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h 
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
>>> index 509f7a63d40c..0d708e8fb391 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
>>> @@ -14,6 +14,62 @@
>>>   #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(struct amdgpu_device *adev, uint64_t dma_address, 
>>> uint64_t phys_address),
>>> +        TP_ARGS(adev, 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)
>>> +                ),
>>> +        TP_fast_assign(
>>> +               __entry->domain = pci_domain_nr(adev->pdev->bus);
>>> +               __entry->bus = adev->pdev->bus->number;
>>> +               __entry->slot = PCI_SLOT(adev->pdev->devfn);
>>> +               __entry->func = PCI_FUNC(adev->pdev->devfn);
>>> +               __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_ttm_tt_unpopulate,
>>> +        TP_PROTO(struct amdgpu_device *adev, uint64_t dma_address, 
>>> uint64_t phys_address),
>>> +        TP_ARGS(adev, 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)
>>> +                ),
>>> +        TP_fast_assign(
>>> +               __entry->domain = pci_domain_nr(adev->pdev->bus);
>>> +               __entry->bus = adev->pdev->bus->number;
>>> +               __entry->slot = PCI_SLOT(adev->pdev->devfn);
>>> +               __entry->func = PCI_FUNC(adev->pdev->devfn);
>>> +               __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..d5f1b99b0ab2 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)
>>> @@ -667,7 +668,7 @@ static int amdgpu_ttm_tt_pin_userptr(struct 
>>> ttm_tt *ttm)
>>>   {
>>>       struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
>>>       struct amdgpu_ttm_tt *gtt = (void *)ttm;
>>> -    unsigned nents;
>>> +    unsigned i, nents;
>>>       int r;
>>>         int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY);
>>> @@ -688,6 +689,15 @@ static int amdgpu_ttm_tt_pin_userptr(struct 
>>> ttm_tt *ttm)
>>>       drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
>>>                        gtt->ttm.dma_address, ttm->num_pages);
>>>   +    if (unlikely(trace_amdgpu_ttm_tt_populate_enabled())) {
>>> +        for (i = 0; i < ttm->num_pages; i++) {
>>> +            trace_amdgpu_ttm_tt_populate(
>>> +                adev,
>>> +                gtt->ttm.dma_address[i],
>>> +                page_to_phys(ttm->pages[i]));
>>> +        }
>>> +    }
>>> +
> 
> It would still be nice to have that chunk in a separate function since 
> it is used multiple times, but that's not a must have.
> 
> Anyway patch is Reviewed-by: Christian König <christian.koenig at amd.com>
> 
> Christian.
> 
>>>       return 0;
>>>     release_sg:
>>> @@ -700,6 +710,7 @@ static void amdgpu_ttm_tt_unpin_userptr(struct 
>>> ttm_tt *ttm)
>>>       struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
>>>       struct amdgpu_ttm_tt *gtt = (void *)ttm;
>>>       struct sg_page_iter sg_iter;
>>> +    unsigned i;
>>>         int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY);
>>>       enum dma_data_direction direction = write ?
>>> @@ -721,6 +732,16 @@ static void amdgpu_ttm_tt_unpin_userptr(struct 
>>> ttm_tt *ttm)
>>>           put_page(page);
>>>       }
>>>   +    if (unlikely(trace_amdgpu_ttm_tt_unpopulate_enabled())) {
>>> +        for (i = 0; i < ttm->num_pages; i++) {
>>> +            trace_amdgpu_ttm_tt_unpopulate(
>>> +                adev,
>>> +                gtt->ttm.dma_address[i],
>>> +                page_to_phys(ttm->pages[i]));
>>> +        }
>>> +    }
>>> +
>>> +
>>>       sg_free_table(ttm->sg);
>>>   }
>>>   @@ -892,7 +913,7 @@ static struct ttm_tt 
>>> *amdgpu_ttm_tt_create(struct ttm_bo_device *bdev,
>>>     static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm)
>>>   {
>>> -    struct amdgpu_device *adev;
>>> +    struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
>>>       struct amdgpu_ttm_tt *gtt = (void *)ttm;
>>>       unsigned i;
>>>       int r;
>>> @@ -915,14 +936,14 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt 
>>> *ttm)
>>>           drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
>>>                            gtt->ttm.dma_address, ttm->num_pages);
>>>           ttm->state = tt_unbound;
>>> -        return 0;
>>> +        r = 0;
>>> +        goto trace_mappings;
>>>       }
>>>   -    adev = amdgpu_ttm_adev(ttm->bdev);
>>> -
>>>   #ifdef CONFIG_SWIOTLB
>>>       if (swiotlb_nr_tbl()) {
>>> -        return ttm_dma_populate(&gtt->ttm, adev->dev);
>>> +        r = ttm_dma_populate(&gtt->ttm, adev->dev);
>>> +        goto trace_mappings;
>>>       }
>>>   #endif
>>>   @@ -945,7 +966,18 @@ static int amdgpu_ttm_tt_populate(struct 
>>> ttm_tt *ttm)
>>>               return -EFAULT;
>>>           }
>>>       }
>>> -    return 0;
>>> +
>>> +    r = 0;
>>> +trace_mappings:
>>> +    if (!r && unlikely(trace_amdgpu_ttm_tt_populate_enabled())) {
>>> +        for (i = 0; i < ttm->num_pages; i++) {
>>> +            trace_amdgpu_ttm_tt_populate(
>>> +                adev,
>>> +                gtt->ttm.dma_address[i],
>>> +                page_to_phys(ttm->pages[i]));
>>> +        }
>>> +    }
>>> +    return r;
>>>   }
>>>     static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm)
>>> @@ -966,6 +998,15 @@ static void amdgpu_ttm_tt_unpopulate(struct 
>>> ttm_tt *ttm)
>>>         adev = amdgpu_ttm_adev(ttm->bdev);
>>>   +    if (unlikely(trace_amdgpu_ttm_tt_unpopulate_enabled())) {
>>> +        for (i = 0; i < ttm->num_pages; i++) {
>>> +            trace_amdgpu_ttm_tt_unpopulate(
>>> +                adev,
>>> +                gtt->ttm.dma_address[i],
>>> +                page_to_phys(ttm->pages[i]));
>>> +        }
>>> +    }
>>> +
>>>   #ifdef CONFIG_SWIOTLB
>>>       if (swiotlb_nr_tbl()) {
>>>           ttm_dma_unpopulate(&gtt->ttm, adev->dev);
>>>
>>
>> _______________________________________________
>> 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