render_thread: Attempt to set affinity to a random fast core
authorDerek Foreman <derekf@osg.samsung.com>
Mon, 19 Sep 2016 14:39:35 +0000 (09:39 -0500)
committerDerek Foreman <derekf@osg.samsung.com>
Mon, 19 Sep 2016 14:40:43 +0000 (09:40 -0500)
We've been pinning the render thread for every EFL process to core 0.
This is a bit silly in the first place, but some big.LITTLE arm systems,
such as exynos 5422, have the LITTLE cores first.

On those systems we put all the render threads on a slow core.

This attempts to fix that by using a random core from the pool of fast
cores.

If we can't determine which cores are fast (ie: we're not on a
linux kernel with cpufreq enabled) then we'll continue doing what we've
always done - pin to core 0.

src/lib/evas/common/evas_thread_render.c

index 623e40e..3489c5a 100644 (file)
@@ -1,4 +1,5 @@
 #include "evas_common_private.h"
+#include "eina_cpu_private.h"
 
 #include <assert.h>
 
@@ -125,6 +126,7 @@ out:
 void
 evas_thread_init(void)
 {
+    int core;
     if (init_count++) return;
 
     eina_threads_init();
@@ -135,7 +137,13 @@ evas_thread_init(void)
       CRI("Could not create draw thread lock");
     if (!eina_condition_new(&evas_thread_queue_condition, &evas_thread_queue_lock))
       CRI("Could not create draw thread condition");
-    if (!eina_thread_create(&evas_thread_worker, EINA_THREAD_NORMAL, 0,
+
+    core = _eina_cpu_fast_core_get();
+    /* Keep previous behaviour of pinning to core 0 if finding a fast
+     * core fails.
+     */
+    if (core < 0) core = 0;
+    if (!eina_thread_create(&evas_thread_worker, EINA_THREAD_NORMAL, core,
           evas_thread_worker_func, NULL))
       if (!eina_thread_create(&evas_thread_worker, EINA_THREAD_NORMAL, -1,
             evas_thread_worker_func, NULL))