[PATCH 2/4] drm/amdgpu: workaround for VM fault caused by SDMA set_wptr
Christian König
ckoenig.leichtzumerken at gmail.com
Fri Oct 13 09:17:55 UTC 2017
Am 13.10.2017 um 10:26 schrieb Pixel Ding:
> From: pding <Pixel.Ding at amd.com>
>
> The polling memory was standalone in VRAM before, so the HDP flush
> introduced latency that hides a VM fault issue. Now polling memory
> leverages the WB in system memory and HDP flush is not required, the
> VM fault at same page happens.
>
> Add delay back to workaround until the root cause is found.
>
> Tests: VP1 or launch 40 instances of glxinfo at the same time.
>
> Signed-off-by: pding <Pixel.Ding at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> index b1de44f..5c4bbe1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> @@ -381,6 +381,9 @@ static void sdma_v3_0_ring_set_wptr(struct amdgpu_ring *ring)
> if (ring->use_doorbell) {
> /* XXX check if swapping is necessary on BE */
> adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr) << 2;
> + /* workaround: VM fault always happen at page 2046 */
> + if (amdgpu_sriov_vf(adev))
> + udelay(500);
Have you tried using a memory barrier here?
That looks like it will have massive impact on performance.
Regards,
Christian.
> WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr) << 2);
> } else {
> int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1;
More information about the amd-gfx
mailing list