On 07/16/2017 10:04 AM, Emilio G. Cota wrote:
+
+    /* claim the first free pointer in tcg_ctxs and increment n_tcg_ctxs */
+    for (i = 0; i < smp_cpus; i++) {
+        if (atomic_cmpxchg(&tcg_ctxs[i], NULL, s) == NULL) {
+            unsigned int n;
+
+            n = atomic_fetch_inc(&n_tcg_ctxs);

Surely this is too much effort. The increment on n_tcg_ctxs is sufficient to produce an index for assignment. We never free the contexts...

Which also suggests that it might be better to avoid an indirection in tcg_ctxs and allocate all of the structures in one big block? I.e.

TCGContext *tcg_ctxs;

// At the end of tcg_context_init.
#ifdef CONFIG_USER_ONLY
    tcg_ctxs = s;
#else
    // No need to zero; we'll completely overwrite each structure
    // during tcg_register_thread.
    tcg_ctxs = g_new(TCGContext, smp_cpus);
#endif


r~

Reply via email to