From 2113f7f440dd2f10e80f0bb3bd5cd155f7e19098 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 15 Jan 2013 09:33:03 +0000 Subject: [PATCH] sna: Free the SHM pixmaps after b266ae6f6f Since b266ae6f6f protected the static allocations from being reaped in the normal course of events, we need to penetrate those defenses in order to finally free the SHM mappings. Signed-off-by: Chris Wilson --- src/sna/sna_accel.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 595d1402..fc2ef071 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -468,14 +468,8 @@ done: return priv->ptr != NULL; } -static void sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv) +static void __sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv) { - assert(priv->cpu_damage == NULL); - assert(list_is_empty(&priv->list)); - - if (IS_STATIC_PTR(priv->ptr)) - return; - if (priv->cpu_bo) { DBG(("%s: discarding CPU buffer, handle=%d, size=%d\n", __FUNCTION__, priv->cpu_bo->handle, kgem_bo_size(priv->cpu_bo))); @@ -489,9 +483,21 @@ static void sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv) sna_accel_watch_flush(sna, -1); } kgem_bo_destroy(&sna->kgem, priv->cpu_bo); - priv->cpu_bo = NULL; - } else + } else if (!IS_STATIC_PTR(priv->ptr)) free(priv->ptr); +} + +static void sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv) +{ + assert(priv->cpu_damage == NULL); + assert(list_is_empty(&priv->list)); + + if (IS_STATIC_PTR(priv->ptr)) + return; + + __sna_pixmap_free_cpu(sna, priv); + + priv->cpu_bo = NULL; priv->ptr = NULL; if (!priv->mapped) @@ -1275,7 +1281,7 @@ static void __sna_free_pixmap(struct sna *sna, sna_damage_destroy(&priv->gpu_damage); sna_damage_destroy(&priv->cpu_damage); - sna_pixmap_free_cpu(sna, priv); + __sna_pixmap_free_cpu(sna, priv); if (priv->header) { assert(!priv->shm); @@ -13585,8 +13591,10 @@ sna_accel_flush_callback(CallbackListPtr *list, list_del(&priv->list); if (priv->shm) { - DBG(("%s: syncing SHM pixmap=%ld\n", __FUNCTION__, - priv->pixmap->drawable.serialNumber)); + DBG(("%s: syncing SHM pixmap=%ld (refcnt=%d)\n", + __FUNCTION__, + priv->pixmap->drawable.serialNumber, + priv->pixmap->refcnt)); ret = sna_pixmap_move_to_cpu(priv->pixmap, MOVE_READ | MOVE_WRITE); assert(!ret || priv->gpu_bo == NULL);