summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYonit Halperin <yhalperi@redhat.com>2013-10-16 10:30:34 -0400
committerYonit Halperin <yhalperi@redhat.com>2013-10-23 15:44:12 -0400
commitadb399a0773b7ce4059999a901164865f98abae3 (patch)
tree14eeaa54e7b35c73f85146e4f7297921662af9ef
parent1a498be147c93f80a16a361c01831591c08d2e16 (diff)
red_worker: trigger release of drawables when the estimated memory usage exceeds a threshold
-rw-r--r--server/red_worker.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/server/red_worker.c b/server/red_worker.c
index fbd4f8b..6cecfef 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -1114,6 +1114,7 @@ static void display_channel_push_release(DisplayChannelClient *dcc, uint8_t type
static void red_display_release_stream_clip(RedWorker *worker, StreamClipItem *item);
static void free_one_drawable(RedWorker *worker, int force_glz_free);
static void red_display_free_glz_drawable(DisplayChannelClient *dcc, RedGlzDrawable *drawable);
+static void red_free_qxl_resources(RedWorker *worker, uint32_t target_release_size);
static ImageItem *red_add_surface_area_image(DisplayChannelClient *dcc, int surface_id,
SpiceRect *area, PipeItem *pos, int can_lossy);
static BitmapGradualType _get_bitmap_graduality_level(RedWorker *worker, SpiceBitmap *bitmap,
@@ -1796,6 +1797,9 @@ static RedDrawable *ref_red_drawable(RedDrawable *drawable)
return drawable;
}
+#define FREE_QXL_RESOURCES_THRESHOLD(qxl_ram_size, resolution) \
+ (qxl_ram_size - MAX(0.1*qxl_ram_size, resolution))
+#define OOM_FREE_MEM_TARGET(qxl_ram_size, resolution) MAX(2*resolution, 0.2*qxl_ram_size)
static void red_qxl_res_size_add(RedWorker *worker, RedQXLResources *qxl_res)
{
int i;
@@ -1835,6 +1839,17 @@ static void red_qxl_res_size_add(RedWorker *worker, RedQXLResources *qxl_res)
worker->qxl_resources.held_size += qxl_res->images_size[i];
}
}
+
+ if (worker->qxl_resources.held_size >=
+ FREE_QXL_RESOURCES_THRESHOLD(worker->qxl_ram_size, worker->last_primary_surface_size)) {
+ uint32_t mem_to_free = OOM_FREE_MEM_TARGET(worker->qxl_ram_size,
+ worker->last_primary_surface_size);
+
+ spice_assert(mem_to_free >= worker->qxl_ram_size - worker->qxl_resources.held_size);
+ mem_to_free -= worker->qxl_ram_size - worker->qxl_resources.held_size;
+ spice_debug("try to release %u bytes", mem_to_free);
+ red_free_qxl_resources(worker, mem_to_free);
+ }
}
static uint32_t red_flush_released_qxl_resources(RedWorker *worker)
@@ -11870,7 +11885,6 @@ void handle_dev_wakeup(void *opaque, void *payload)
stat_inc_counter(worker->wakeup_counter, 1);
}
-#define OOM_FREE_MEM_TARGET(qxl_ram_size, resolution) MAX(2*resolution, 0.2*qxl_ram_size)
void handle_dev_oom(void *opaque, void *payload)
{
RedWorker *worker = opaque;