On Thu, Oct 27, 2011 at 1:07 PM, Daniel Vetter <daniel.vetter at ffwll.ch> 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 at ffwll.ch> > --- > ?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 at gmail.com> Cheers, Tormod