I suspect the issue is that amdgpu_dm_do_flip is holding the BO reserved
and then stack waiting for fences to signal in
reservation_object_wait_timeout_rcu (which won't signal because there
was a VM_FAULT). Then when we try to shutdown display block during reset
recovery from drm_atomic_helper_suspend we also try to reserve the BO,
probably from dm_plane_helper_cleanup_fb ending in deadlock.
To confirm i am attaching some printks around the BO reservation -
please apply and rerun.
Also, probably a good idea to open FDO ticket on this instead of using
amd-gfx.
Andrey
On 2/12/19 10:49 AM, Mikhail Gavrilov wrote:
> On Tue, 12 Feb 2019 at 20:23, Grodzovsky, Andrey
> <[email protected]> wrote:
>> It should recover you - so this looks like a bug. I noticed in one of
>> the call traces this - drm_atomic_helper_suspend which points to system
>> going into sleep mode, is it what happened, did it hang when system
>> tried to sleep ?
>>
> It's weird because the computer was not enter in sleep mode. I am sure.
> Steps for reproduce:
> 1. Launch Shadow of The tomb Rider on Proton2. Wait some time until mouse
> stop respond
> 3. Dump gfx, waves and all other dumps including dmesg
>
> And of course the power button (button which enter in sleep mode) was
> not pressed.
>
> So the new dumps has any new useful info? Or they are pointless?
> --
> Best Regards,
> Mike Gavrilov.
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index d59bafc..e15cd3c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -2353,6 +2353,8 @@ static int get_fb_info(const struct amdgpu_framebuffer *amdgpu_fb,
uint64_t *tiling_flags)
{
struct amdgpu_bo *rbo = gem_to_amdgpu_bo(amdgpu_fb->base.obj[0]);
+
+ DRM_ERROR("Before %p\n",rbo);
int r = amdgpu_bo_reserve(rbo, false);
if (unlikely(r)) {
@@ -2362,6 +2364,8 @@ static int get_fb_info(const struct amdgpu_framebuffer *amdgpu_fb,
return r;
}
+ DRM_ERROR("After %p\n",rbo);
+
if (tiling_flags)
amdgpu_bo_get_tiling_flags(rbo, tiling_flags);
@@ -3715,9 +3719,11 @@ static int dm_plane_helper_prepare_fb(struct drm_plane *plane,
obj = new_state->fb->obj[0];
rbo = gem_to_amdgpu_bo(obj);
adev = amdgpu_ttm_adev(rbo->tbo.bdev);
+ DRM_ERROR("Before %p\n",rbo);
r = amdgpu_bo_reserve(rbo, false);
if (unlikely(r != 0))
return r;
+ DRM_ERROR("After %p\n",rbo);
if (plane->type != DRM_PLANE_TYPE_CURSOR)
domain = amdgpu_display_supported_domains(adev);
@@ -3790,11 +3796,13 @@ static void dm_plane_helper_cleanup_fb(struct drm_plane *plane,
return;
rbo = gem_to_amdgpu_bo(old_state->fb->obj[0]);
+ DRM_ERROR("Before %p\n",__LINE__);
r = amdgpu_bo_reserve(rbo, false);
if (unlikely(r)) {
DRM_ERROR("failed to reserve rbo before unpin\n");
return;
}
+ DRM_ERROR("After %d\n",__LINE__);
amdgpu_bo_unpin(rbo);
amdgpu_bo_unreserve(rbo);
@@ -4801,15 +4809,17 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
* blocking commit to as per framework helpers
*/
abo = gem_to_amdgpu_bo(fb->obj[0]);
+ DRM_ERROR("Before %p\n",abo);
r = amdgpu_bo_reserve(abo, true);
if (unlikely(r != 0)) {
DRM_ERROR("failed to reserve buffer before flip\n");
WARN_ON(1);
}
-
+ DRM_ERROR("After %p\n",abo);
/* Wait for all fences on this FB */
WARN_ON(reservation_object_wait_timeout_rcu(abo->tbo.resv, true, false,
- MAX_SCHEDULE_TIMEOUT) < 0);
+ msecs_to_jiffies(5000)) < 0);
+ DRM_ERROR("After reservation_object_wait_timeout_rcu %p\n",abo);
amdgpu_bo_get_tiling_flags(abo, &tiling_flags);
_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx