[PATCH 1/2] drm/radeon: Make sure CS mutex is held across GPU reset.
Konrad Rzeszutek Wilk
konrad.wilk at oracle.com
Fri Sep 16 01:59:10 PDT 2011
On Fri, Sep 16, 2011 at 10:40:23AM +0200, Michel Dänzer wrote:
> On Fre, 2011-09-16 at 04:31 -0400, Konrad Rzeszutek Wilk wrote:
> > On Thu, Sep 15, 2011 at 08:21:00PM +0200, Michel Dänzer wrote:
> > > From: Michel Dänzer <michel.daenzer at amd.com>
> > >
> > > This was only the case if the GPU reset was triggered from the CS ioctl,
> > > otherwise other processes could happily enter the CS ioctl and wreak havoc
> > > during the GPU reset.
> > >
> > > This is a little complicated because the GPU reset can be triggered from the
> > > CS ioctl, in which case we're already holding the mutex, or from other call
> > > paths, in which case we need to lock the mutex. AFAICT the mutex API doesn't
> > > allow nested locking or finding out the mutex owner, so we need to handle this
> > > with some helper functions.
> > >
> > > Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> > > ---
> > > drivers/gpu/drm/radeon/radeon.h | 60 ++++++++++++++++++++++++++++++++
> > > drivers/gpu/drm/radeon/radeon_cs.c | 14 ++++----
> > > drivers/gpu/drm/radeon/radeon_device.c | 16 ++++++++
> > > 3 files changed, 83 insertions(+), 7 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> > > index ef0e0e0..89304d9 100644
> > > --- a/drivers/gpu/drm/radeon/radeon.h
> > > +++ b/drivers/gpu/drm/radeon/radeon.h
> > > @@ -1203,6 +1203,8 @@ struct radeon_device {
> > > struct radeon_pm pm;
> > > uint32_t bios_scratch[RADEON_BIOS_NUM_SCRATCH];
> > > struct mutex cs_mutex;
> > > + struct task_struct *cs_mutex_owner;
> > > + struct mutex cs_mutex_owner_mutex;
> >
> > That is a bit of 'mutex.. mutex'. What about just having the same
> > name as before?
>
> What do you mean? This adds a second mutex protecting the owner field.
Oh, somehow I thought it was replacing the 'cs_mutex'.. but now that I look
again that is not the case.
>
> Though now you got me thinking... Maybe the second mutex isn't necessary
> at all. Let me try that.
Ok.
>
>
> > > +/*
> > > + * Check if this process locked the CS mutex already; if it didn't, lock it.
> > > + *
> > > + * Returns:
> > > + * true: This function locked the mutex.
> > > + * false: This function didn't lock the mutex (this process already locked it
> > > + * before), so the caller probably shouldn't unlock it.
> > > + */
> > > +static inline int cs_mutex_ensure_locked(struct radeon_device *rdev)
> > > +{
> > > + int took_mutex;
> > > + int have_mutex;
> >
> > I think you meant 'bool'?
> >
> > > +
> > > + mutex_lock(&rdev->cs_mutex_owner_mutex);
> > > + took_mutex = mutex_trylock(&rdev->cs_mutex);
> > > + if (took_mutex) {
> > > + /* The mutex was unlocked before, so it's ours now */
> > > + rdev->cs_mutex_owner = current;
> > > + have_mutex = true;
> >
> > consider you set that here..
> > > + } else {
> > > + /* Somebody already locked the mutex. Was it this process? */
> > > + have_mutex = (rdev->cs_mutex_owner == current);
> > > + }
> > > + mutex_unlock(&rdev->cs_mutex_owner_mutex);
> > > +
> > > + if (!have_mutex) {
> > > + /* Another process locked the mutex, take it */
> > > + cs_mutex_lock(rdev);
> > > + took_mutex = true;
> > > + }
> > > +
> > > + return took_mutex;
> >
> > and if it is really going to be bool, you might as well change the
> > return signature and make it the function decleration return bool
> > instead of int.
>
> Yeah, I can change that. I'll send a v2 patch.
Excellent.
More information about the dri-devel
mailing list