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

Tom St Denis tom.stdenis at amd.com
Tue Aug 8 11:54:51 UTC 2017


ping?

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]));
> +		}
> +	}
> +
>   	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);
> 



More information about the amd-gfx mailing list