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

Christian König deathsimple at vodafone.de
Tue Aug 8 12:01:32 UTC 2017


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