- clear_bit(vcpu_id, vcpu->trace_dstate_delayed);
- (*ev->dstate)--;
- }
- if (vcpu->created) {
- /*
- * Delay changes until next TB; we want all TBs to be built from a
- * single set of dstate values to ensure consistency of generated
- * tracing code.
- */
- async_run_on_cpu(vcpu, trace_event_synchronize_vcpu_state_dynamic,
- RUN_ON_CPU_NULL);
- } else {
- trace_event_synchronize_vcpu_state_dynamic(vcpu, RUN_ON_CPU_NULL);
- }
- }
-}
-
-static bool adding_first_cpu1(void)
-{
- CPUState *cpu;
- size_t count = 0;
- CPU_FOREACH(cpu) {
- count++;
- if (count > 1) {
- return false;
- }
- }
- return true;
-}
-
-static bool adding_first_cpu(void)
-{
- QEMU_LOCK_GUARD(&qemu_cpu_list_lock);
-
- return adding_first_cpu1();
-}
-
-void trace_init_vcpu(CPUState *vcpu)
-{
- TraceEventIter iter;
- TraceEvent *ev;
- trace_event_iter_init_all(&iter);
- while ((ev = trace_event_iter_next(&iter)) != NULL) {
- if (trace_event_is_vcpu(ev) &&
- trace_event_get_state_static(ev) &&
- trace_event_get_state_dynamic(ev)) {
- if (adding_first_cpu()) {
- /* check preconditions */
- assert(*ev->dstate == 1);
- /* disable early-init state ... */
- *ev->dstate = 0;
- trace_events_enabled_count--;
- /* ... and properly re-enable */
- trace_event_set_vcpu_state_dynamic(vcpu, ev, true);
- } else {
- trace_event_set_vcpu_state_dynamic(vcpu, ev, true);
- }