diff options
author | Yonit Halperin <yhalperi@redhat.com> | 2013-10-16 10:30:34 -0400 |
---|---|---|
committer | Yonit Halperin <yhalperi@redhat.com> | 2013-10-23 15:44:12 -0400 |
commit | adb399a0773b7ce4059999a901164865f98abae3 (patch) | |
tree | 14eeaa54e7b35c73f85146e4f7297921662af9ef | |
parent | 1a498be147c93f80a16a361c01831591c08d2e16 (diff) |
red_worker: trigger release of drawables when the estimated memory usage exceeds a threshold
-rw-r--r-- | server/red_worker.c | 16 |
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; |