[BUG] gpu: drm: amdgpu: Possible sleep-in-atomic-context bugs in amdgpu_uvd_ring_begin_use()
Jia-Ju Bai
baijiaju1990 at gmail.com
Sat Sep 15 09:33:01 UTC 2018
On 2018/9/15 17:23, Koenig, Christian wrote:
> No, the problem is the function pointer analysis.
>
> In other words the KIQ ring is sometimes used in atomic and even
> interrupt context.
>
> But the UVD ring is never used in atomic context.
>
> But I don't see a way a static analysis could ever figure that out.
>
Okay, thanks for your explanation :)
Besides, I find that amdgpu_virt_kiq_rreg() calls msleep(), so mdelay()
should be used instead.
Best wishes,
Jia-Ju Bai
>
> Am 15.09.2018 11:18 schrieb Jia-Ju Bai <baijiaju1990 at gmail.com>:
> Sorry, I am still not clear why the call chain I proposed is incorrect...
>
> I find a conditional in amdgpu_mm_wreg():
>
> if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev))
> return amdgpu_virt_kiq_wreg(adev, reg, v);
>
> Is amdgpu_virt_kiq_wreg() never called from WREG32() or RREG32()?
>
>
> Best wishes,
> Jia-Ju Bai
>
>
> On 2018/9/15 17:10, Koenig, Christian wrote:
>> amdgpu_ring_alloc() does call amdgpu_uvd_begin_use(), but never in
>> the call chain you proposed.
>>
>> Thinking about it I actually don't see a way a statically analysis
>> could ever figure that out.
>>
>> Christian.
>>
>> Am 15.09.2018 11:05 schrieb Jia-Ju Bai <baijiaju1990 at gmail.com>:
>>
>> Thanks for your reply.
>>
>> On 2018/9/15 17:01, Koenig, Christian wrote:
>>
>> Sorry to say that but your analysis tool is buggy.
>>
>> The proposed call paths will never trigger.
>>
>>
>> Could you please explain which piece of the call path is incorrect?
>> I am not very sure of my function pointer analysis.
>> Does amdgpu_ring_alloc() never calls amdgpu_uvd_ring_begin_use()?
>>
>> Thanks in advance.
>>
>>
>> Best wishes,
>> Jia-Ju Bai
>>
>>
>> Regards,
>> Christian.
>>
>> Am 15.09.2018 10:59 schrieb Jia-Ju Bai
>> <baijiaju1990 at gmail.com> <mailto:baijiaju1990 at gmail.com>:
>> The driver may sleep with holding a spinlock.
>> The function call paths (from bottom to top) in Linux-4.17 are:
>>
>> [FUNC] mutex_lock_nested
>> drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c, 1477:
>> mutex_lock_nested in amdgpu_dpm_enable_uvd
>> drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c, 1154:
>> amdgpu_dpm_enable_uvd in amdgpu_uvd_ring_begin_use
>> drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c, 80:
>> [FUNC_PTR]amdgpu_uvd_ring_begin_use in amdgpu_ring_alloc
>> drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c, 199:
>> amdgpu_ring_alloc in amdgpu_virt_kiq_wreg
>> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c, 207:
>> amdgpu_virt_kiq_wreg in amdgpu_mm_wreg
>> drivers/gpu/drm/amd/amdgpu/vi.c, 207:
>> amdgpu_mm_wreg in vi_gc_cac_rreg
>> drivers/gpu/drm/amd/amdgpu/vi.c, 206:
>> _raw_spin_lock_irqsave in vi_gc_cac_rreg
>>
>> [FUNC] mutex_lock_nested
>> drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c, 1477:
>> mutex_lock_nested in amdgpu_dpm_enable_uvd
>> drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c, 1154:
>> amdgpu_dpm_enable_uvd in amdgpu_uvd_ring_begin_use
>> drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c, 80:
>> [FUNC_PTR]amdgpu_uvd_ring_begin_use in amdgpu_ring_alloc
>> drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c, 199:
>> amdgpu_ring_alloc in amdgpu_virt_kiq_wreg
>> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c, 207:
>> amdgpu_virt_kiq_wreg in amdgpu_mm_wreg
>> drivers/gpu/drm/amd/amdgpu/soc15.c, 106:
>> amdgpu_mm_wreg in soc15_pcie_rreg
>> drivers/gpu/drm/amd/amdgpu/soc15.c, 105:
>> _raw_spin_lock_irqsave in soc15_pcie_rreg
>>
>> [FUNC] mutex_lock_nested
>> drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c, 1477:
>> mutex_lock_nested in amdgpu_dpm_enable_uvd
>> drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c, 1154:
>> amdgpu_dpm_enable_uvd in amdgpu_uvd_ring_begin_use
>> drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c, 80:
>> [FUNC_PTR]amdgpu_uvd_ring_begin_use in amdgpu_ring_alloc
>> drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c, 199:
>> amdgpu_ring_alloc in amdgpu_virt_kiq_wreg
>> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c, 207:
>> amdgpu_virt_kiq_wreg in amdgpu_mm_wreg
>> drivers/gpu/drm/amd/amdgpu/cik.c, 139:
>> amdgpu_mm_wreg in cik_uvd_ctx_wreg
>> drivers/gpu/drm/amd/amdgpu/cik.c, 138:
>> _raw_spin_lock_irqsave in cik_uvd_ctx_wreg
>>
>> [FUNC] mutex_lock_nested
>> drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c, 1477:
>> mutex_lock_nested in amdgpu_dpm_enable_uvd
>> drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c, 1154:
>> amdgpu_dpm_enable_uvd in amdgpu_uvd_ring_begin_use
>> drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c, 80:
>> [FUNC_PTR]amdgpu_uvd_ring_begin_use in amdgpu_ring_alloc
>> drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c, 199:
>> amdgpu_ring_alloc in amdgpu_virt_kiq_wreg
>> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c, 207:
>> amdgpu_virt_kiq_wreg in amdgpu_mm_wreg
>> drivers/gpu/drm/amd/amdgpu/dce_v6_0.c, 126:
>> amdgpu_mm_wreg in dce_v6_0_audio_endpt_rreg
>> drivers/gpu/drm/amd/amdgpu/dce_v6_0.c, 125:
>> _raw_spin_lock_irqsave in dce_v6_0_audio_endpt_rreg
>>
>> Note that [FUNC_PTR] means a function pointer call is used.
>>
>> These bugs are found by my static analysis tool DSAC.
>>
>>
>> Best wishes,
>> Jia-Ju Bai
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20180915/4a506d53/attachment.html>
More information about the amd-gfx
mailing list