Skip to content

Commit

Permalink
cpu: Add a sync version of cpu_remove()
Browse files Browse the repository at this point in the history
This sync API will be used by the CPU hotplug code to wait for the CPU to
completely get removed before flagging the failure to the device_add
command.

Sync version of this call is needed to correctly recover from CPU
realization failures when ->plug() handler fails.

Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
  • Loading branch information
Bharata B Rao authored and dgibson committed May 30, 2016
1 parent 4c055ab commit 2c57904
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 0 deletions.
12 changes: 12 additions & 0 deletions cpus.c
Original file line number Diff line number Diff line change
Expand Up @@ -1084,6 +1084,8 @@ static void *qemu_kvm_cpu_thread_fn(void *arg)
} while (!cpu->unplug || cpu_can_run(cpu));

qemu_kvm_destroy_vcpu(cpu);
cpu->created = false;
qemu_cond_signal(&qemu_cpu_cond);
qemu_mutex_unlock_iothread();
return NULL;
}
Expand Down Expand Up @@ -1184,6 +1186,8 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
}
if (remove_cpu) {
qemu_tcg_destroy_vcpu(remove_cpu);
cpu->created = false;
qemu_cond_signal(&qemu_cpu_cond);
remove_cpu = NULL;
}
}
Expand Down Expand Up @@ -1349,6 +1353,14 @@ void cpu_remove(CPUState *cpu)
qemu_cpu_kick(cpu);
}

void cpu_remove_sync(CPUState *cpu)
{
cpu_remove(cpu);
while (cpu->created) {
qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
}
}

/* For temporary buffers for forming a name */
#define VCPU_THREAD_NAME_SIZE 16

Expand Down
8 changes: 8 additions & 0 deletions include/qom/cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -772,6 +772,14 @@ void cpu_resume(CPUState *cpu);
*/
void cpu_remove(CPUState *cpu);

/**
* cpu_remove_sync:
* @cpu: The CPU to remove.
*
* Requests the CPU to be removed and waits till it is removed.
*/
void cpu_remove_sync(CPUState *cpu);

/**
* qemu_init_vcpu:
* @cpu: The vCPU to initialize.
Expand Down

0 comments on commit 2c57904

Please sign in to comment.