On 01/19/2017 09:04 AM, Alex Bennée wrote:
> +/* flush_all_helper: run fn across all cpus
> + *
> + * If the wait flag is set then the src cpu's helper will be queued as
> + * "safe" work and the loop exited creating a synchronisation point
> + * where all queued work will be finished before execution starts
> + * again.
> + */
> +static void flush_all_helper(CPUState *src, bool wait,
> +                             run_on_cpu_func fn, run_on_cpu_data d)
> +{
> +    CPUState *cpu;
> +
> +    if (!wait) {
> +        CPU_FOREACH(cpu) {
> +            if (cpu != src) {
> +                async_run_on_cpu(cpu, fn, d);
> +            } else {
> +                g_assert(qemu_cpu_is_self(src));
> +                fn(src, d);
> +            }
> +        }
> +    } else {
> +        CPU_FOREACH(cpu) {
> +            if (cpu != src) {
> +                async_run_on_cpu(cpu, fn, d);
> +            } else {
> +                async_safe_run_on_cpu(cpu, fn, d);
> +            }
> +
> +        }
> +        cpu_loop_exit(src);
> +    }
> +}

What's the rationale for not having the target do the exit itself?  Surely it
can tell, and simple end the TB after the insn.


r~

Reply via email to