On Thu, Oct 27, 2011 at 1:07 PM, Daniel Vetter <daniel.vetter@xxxxxxxx> wrote: > The reclaim_buffers function of the savage driver actually wants to run > with the hw_lock held - at least there are printks in the call-chain > to that effect. But the drm core only calls reclaim_buffers as used > by savage _after_ forcefully dropping the hwlock (in case it's still > hold by the closing fd). > > So do the same idlelock dance as for the other dma drivers and hope > that papers over any issues. > > Signed-off-by: Daniel Vetter <daniel.vetter@xxxxxxxx> > --- > drivers/gpu/drm/savage/savage_bci.c | 7 +++++-- > drivers/gpu/drm/savage/savage_drv.c | 2 +- > 2 files changed, 6 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/savage/savage_bci.c b/drivers/gpu/drm/savage/savage_bci.c > index cb1ee4e..1c00dbd 100644 > --- a/drivers/gpu/drm/savage/savage_bci.c > +++ b/drivers/gpu/drm/savage/savage_bci.c > @@ -1050,6 +1050,7 @@ void savage_reclaim_buffers(struct drm_device *dev, struct drm_file *file_priv) > { > struct drm_device_dma *dma = dev->dma; > drm_savage_private_t *dev_priv = dev->dev_private; > + int release_idlelock = 0; > int i; > > if (!dma) > @@ -1059,7 +1060,8 @@ void savage_reclaim_buffers(struct drm_device *dev, struct drm_file *file_priv) > if (!dma->buflist) > return; > > - /*i830_flush_queue(dev); */ > + if (file_priv->master && file_priv->master->lock.hw_lock) > + drm_idlelock_take(&file_priv->master->lock); > > for (i = 0; i < dma->buf_count; i++) { > struct drm_buf *buf = dma->buflist[i]; > @@ -1075,7 +1077,8 @@ void savage_reclaim_buffers(struct drm_device *dev, struct drm_file *file_priv) > } > } > > - drm_core_reclaim_buffers(dev, file_priv); > + if (release_idlelock) > + drm_idlelock_release(&file_priv->master->lock); > } > > struct drm_ioctl_desc savage_ioctls[] = { > diff --git a/drivers/gpu/drm/savage/savage_drv.c b/drivers/gpu/drm/savage/savage_drv.c > index 6464490..0ed88b1 100644 > --- a/drivers/gpu/drm/savage/savage_drv.c > +++ b/drivers/gpu/drm/savage/savage_drv.c > @@ -39,9 +39,9 @@ static struct drm_driver driver = { > .dev_priv_size = sizeof(drm_savage_buf_priv_t), > .load = savage_driver_load, > .firstopen = savage_driver_firstopen, > + .preclose = savage_reclaim_buffers, > .lastclose = savage_driver_lastclose, > .unload = savage_driver_unload, > - .reclaim_buffers = savage_reclaim_buffers, > .ioctls = savage_ioctls, > .dma_ioctl = savage_bci_buffers, > .fops = { > -- > 1.7.7.1 Hi Daniel, This works fine on my savage Twister card (laptop). Tested-by: Tormod Volden <debian.tormod@xxxxxxxxx> Cheers, Tormod _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel