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

Reply via email to