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~