[PATCH 16/23] drm/savage: clean up reclaim_buffers

Tormod Volden lists.tormod at gmail.com
Sun Nov 6 02:18:13 PST 2011


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


More information about the dri-devel mailing list