From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?ISO-8859-1?Q?Christian_K=F6nig?= Subject: Re: [PATCH] drm/radeon: don't leave fence blocked process on failed GPU reset Date: Mon, 17 Dec 2012 16:46:11 +0100 Message-ID: <50CF3E43.6080102@vodafone.de> References: <1355758146-7095-1-git-send-email-j.glisse@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1"; Format="flowed" Content-Transfer-Encoding: quoted-printable Return-path: Received: from outgoing.email.vodafone.de (outgoing.email.vodafone.de [139.7.28.128]) by gabe.freedesktop.org (Postfix) with ESMTP id 86C69E5CB8 for ; Mon, 17 Dec 2012 07:46:15 -0800 (PST) In-Reply-To: <1355758146-7095-1-git-send-email-j.glisse@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org Errors-To: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org To: j.glisse@gmail.com Cc: Jerome Glisse , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org On 17.12.2012 16:29, j.glisse@gmail.com wrote: > From: Jerome Glisse > > Force all fence to signal if GPU reset failed so no process get stuck > on waiting fence. > > Signed-off-by: Jerome Glisse Seems to make sense. Reviewed-by: Christian K=F6nig > --- > drivers/gpu/drm/radeon/radeon.h | 1 + > drivers/gpu/drm/radeon/radeon_device.c | 1 + > drivers/gpu/drm/radeon/radeon_fence.c | 19 +++++++++++++++++++ > 3 files changed, 21 insertions(+) > > diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/rad= eon.h > index 5d68346..9c7625c 100644 > --- a/drivers/gpu/drm/radeon/radeon.h > +++ b/drivers/gpu/drm/radeon/radeon.h > @@ -225,6 +225,7 @@ struct radeon_fence { > int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring= ); > int radeon_fence_driver_init(struct radeon_device *rdev); > void radeon_fence_driver_fini(struct radeon_device *rdev); > +void radeon_fence_driver_force_completion(struct radeon_device *rdev); > int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *= *fence, int ring); > void radeon_fence_process(struct radeon_device *rdev, int ring); > bool radeon_fence_signaled(struct radeon_fence *fence); > diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/rad= eon/radeon_device.c > index e2f5f88..774fae7 100644 > --- a/drivers/gpu/drm/radeon/radeon_device.c > +++ b/drivers/gpu/drm/radeon/radeon_device.c > @@ -1357,6 +1357,7 @@ retry: > } > } > } else { > + radeon_fence_driver_force_completion(rdev); > for (i =3D 0; i < RADEON_NUM_RINGS; ++i) { > kfree(ring_data[i]); > } > diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/rade= on/radeon_fence.c > index 22bd6c2..bf7b20e 100644 > --- a/drivers/gpu/drm/radeon/radeon_fence.c > +++ b/drivers/gpu/drm/radeon/radeon_fence.c > @@ -868,6 +868,25 @@ void radeon_fence_driver_fini(struct radeon_device *= rdev) > mutex_unlock(&rdev->ring_lock); > } > = > +/** > + * radeon_fence_driver_force_completion - force all fence waiter to comp= lete > + * > + * @rdev: radeon device pointer > + * > + * In case of GPU reset failure make sure no process keep waiting on fen= ce > + * that will never complete. > + */ > +void radeon_fence_driver_force_completion(struct radeon_device *rdev) > +{ > + int ring; > + > + for (ring =3D 0; ring < RADEON_NUM_RINGS; ring++) { > + if (!rdev->fence_drv[ring].initialized) > + continue; > + radeon_fence_write(rdev, rdev->fence_drv[ring].sync_seq[ring], ring); > + } > +} > + > = > /* > * Fence debugfs