From 58b63ee5ccc1427a6835ef5112fe556faa9e1be3 Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom Date: Mon, 19 Jun 2006 09:12:50 +0000 Subject: Fix buffer cleanup on close. Move memory manager reset from final_context to lastclose. --- linux-core/sis_drv.c | 4 +++- linux-core/sis_mm.c | 23 +++++++++++------------ shared-core/sis_drv.h | 7 ++++--- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/linux-core/sis_drv.c b/linux-core/sis_drv.c index 5d55357c..4119bc3c 100644 --- a/linux-core/sis_drv.c +++ b/linux-core/sis_drv.c @@ -72,8 +72,10 @@ static struct drm_driver driver = { .driver_features = DRIVER_USE_AGP | DRIVER_USE_MTRR, .load = sis_driver_load, .unload = sis_driver_unload, - .context_dtor = sis_final_context, + .context_dtor = NULL, .reclaim_buffers = NULL, + .reclaim_buffers_locked = sis_reclaim_buffers_locked, + .lastclose = sis_lastclose, .get_map_ofs = drm_core_get_map_ofs, .get_reg_ofs = drm_core_get_reg_ofs, .ioctls = sis_ioctls, diff --git a/linux-core/sis_mm.c b/linux-core/sis_mm.c index ee924535..a89ed64b 100644 --- a/linux-core/sis_mm.c +++ b/linux-core/sis_mm.c @@ -232,19 +232,18 @@ static int sis_ioctl_agp_alloc(DRM_IOCTL_ARGS) return sis_drm_alloc(dev, priv, data, AGP_TYPE); } -int sis_final_context(struct drm_device *dev, int context) +void sis_lastclose(struct drm_device *dev) { - if (dev->ctx_count == 1 && dev->dev_private) { - drm_sis_private_t *dev_priv = dev->dev_private; - - DRM_DEBUG("Last Context\n"); - down(&dev->struct_sem); - drm_sman_cleanup(&dev_priv->sman); - dev_priv->vram_initialized = FALSE; - dev_priv->agp_initialized = FALSE; - up(&dev->struct_sem); - } - return 1; + drm_sis_private_t *dev_priv = dev->dev_private; + + if (!dev_priv) + return; + + down(&dev->struct_sem); + drm_sman_cleanup(&dev_priv->sman); + dev_priv->vram_initialized = FALSE; + dev_priv->agp_initialized = FALSE; + up(&dev->struct_sem); } void sis_reclaim_buffers_locked(drm_device_t * dev, struct file *filp) diff --git a/shared-core/sis_drv.h b/shared-core/sis_drv.h index 037bc49d..636e5327 100644 --- a/shared-core/sis_drv.h +++ b/shared-core/sis_drv.h @@ -34,10 +34,10 @@ #define DRIVER_AUTHOR "SIS" #define DRIVER_NAME "sis" #define DRIVER_DESC "SIS 300/630/540" -#define DRIVER_DATE "20060529" +#define DRIVER_DATE "20060619" #define DRIVER_MAJOR 1 #define DRIVER_MINOR 2 -#define DRIVER_PATCHLEVEL 0 +#define DRIVER_PATCHLEVEL 1 #if defined(__linux__) #define SIS_HAVE_CORE_MM @@ -58,6 +58,7 @@ typedef struct drm_sis_private { } drm_sis_private_t; extern void sis_reclaim_buffers_locked(drm_device_t *dev, struct file *filp); +extern void sis_lastclose(drm_device_t *dev); #else #include "sis_ds.h" @@ -68,11 +69,11 @@ typedef struct drm_sis_private { } drm_sis_private_t; extern int sis_init_context(drm_device_t * dev, int context); +extern int sis_final_context(drm_device_t * dev, int context); #endif -extern int sis_final_context(drm_device_t * dev, int context); extern drm_ioctl_desc_t sis_ioctls[]; extern int sis_max_ioctl; -- cgit v1.2.3