[PATCH] drm/amd/amdgpu: add tracing of kernel DMA mappings and enable on init (v2)

Tom St Denis tom.stdenis at amd.com
Tue Aug 15 12:16:13 UTC 2017


On 15/08/17 08:11 AM, Christian König wrote:
> Am 15.08.2017 um 13:33 schrieb Tom St Denis:
>> On 15/08/17 07:22 AM, Christian König wrote:
>>> Am 14.08.2017 um 13:37 schrieb Tom St Denis:
>>>> This patch adds trace points to the amdgpu bo_kmap/bo/kunmap functions
>>>> which capture internal allocations.
>>>>
>>>> (v2): Simply add a sleep to the init.  Users can use this script to
>>>> load with map debugging enabled:
>>>>
>>>>     #!/bin/bash
>>>>     modprobe amdgpu map_debug=1 &
>>>>     sleep 1
>>>>     echo 1 > 
>>>> /sys/kernel/debug/tracing/events/amdgpu/amdgpu_ttm_tt_unpopulate/enable
>>>>     echo 1 > 
>>>> /sys/kernel/debug/tracing/events/amdgpu/amdgpu_ttm_tt_populate/enable
>>>
>>> I've just realized that there is a far simpler method than that or 
>>> enabling trace points using the module command line.
>>>
>>> Assuming your GPU is PCI device 01:00.0 connected through bridge 
>>> 00:02.1 (use lspci -t to figure the connection out):
>>>
>>> # Temporary remove the PCIe device from the bus
>>> echo 1 > /sys/bus/pci/devices/0000\:01\:00.0/remove
>>> # Load amdgpu, this allows you to enable the trace points you want 
>>> and also sets probes etc..
>>> modprobe amdpgu
>>> # Rescan the bus, the device subsystem will automatically probe 
>>> amdgpu with this device
>>> echo 1 > /sys/bus/pci/devices/0000\:00\:02.1/rescan
>>
>> That would definitely be a bunch trickier to script up.  Nobody will 
>> run this by hand.  So we'd need to remove all devices that are AMD 
>> vendor ID but GPU only (e.g. not other controllers) which means we 
>> need to parse the lspci output for VGA controller related text.
>>
>> Definitely doable and probably "cleaner" from a race point of view.
>>
>>> Apart from that I would really like to see those trace points in TTM 
>>> instead. I also don't mind adding a dev or pdev pointer to the 
>>> ttm_bo_device structure for this.
>>
>> Not against this in principle.  There's a bit of confusion... our ttm 
>> amdgpu functions are passed
>>
>> struct ttm_tt *ttm
>>
>> which we cast to
>>
>> struct amdgpu_ttm_tt {
>>     struct ttm_dma_tt    ttm;
>>     struct amdgpu_device    *adev;
> 
> BTW: Isn't this adev pointer here superflous? I mean the ttm_tt has a 
> bdev pointer to use, don't they?

Honestly without cscoping it I wouldn't know :-)

> 
>>     u64 offset;
>> ... <snip>
>>
>> Then we use the "->ttm" of that to get dma_address[] but pages[] from 
>> the original ttm_tt structure ... from what I recall (when I looked 
>> into this last week) ttm_dma_tt and ttm_tt aren't the same structure 
>> right? (and looking at it right now ttm_dma_tt begins with ttm_tt....).
>>
>> So wherever I put the trace in ttm I need access to dma_address[] 
>> which doesn't seem so clear cut.  Can I just cast a ttm_tt pointer to 
>> ttm_dma_tt?
> 
> Ah, ok now I understand your problem. Well, printing the dma addresses 
> in this situation is probably not a good idea to start with.
> 
> When a buffer object is mapped to kernel space there is no guarantee 
> that it already has it's DMA mapping. For amdgpu we probably never run 
> into this situation, but for other drivers that might now be the case.

At the points I'm putting the traces a "map" has already happened per 
page like in ttm_populate and our kmap functions.

> Do we really need that info?

To reverse the IOMMU translation I need the bus/dma address, physical 
address, and PCI device information (because the dma <=> phys 
translation is only valid per PCI device).

Tom


More information about the amd-gfx mailing list