Skip to content

Commit

Permalink
exec: Set cpu_index only if it's not been explictly set
Browse files Browse the repository at this point in the history
It keeps the legacy behavior for all users that doesn't care
about stable cpu_index value, but would allow boards that
would support device_add/device_del to set stable cpu_index
that won't depend on order in which cpus are created/destroyed.

While at that simplify cpu_get_free_index() as cpu_index
generated by USER_ONLY and softmmu variants is the same
since none of the users support cpu-remove so far, except
of not yet released spapr/x86 device_add/delr, which
will be altered by follow up patches to set stable
cpu_index manually.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
  • Loading branch information
Igor Mammedov authored and ehabkost committed Jul 26, 2016
1 parent 8b1b835 commit a07f953
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 39 deletions.
44 changes: 6 additions & 38 deletions exec.c
Expand Up @@ -598,30 +598,7 @@ AddressSpace *cpu_get_address_space(CPUState *cpu, int asidx)
}
#endif

#ifndef CONFIG_USER_ONLY
static DECLARE_BITMAP(cpu_index_map, MAX_CPUMASK_BITS);

static int cpu_get_free_index(Error **errp)
{
int cpu = find_first_zero_bit(cpu_index_map, MAX_CPUMASK_BITS);

if (cpu >= MAX_CPUMASK_BITS) {
error_setg(errp, "Trying to use more CPUs than max of %d",
MAX_CPUMASK_BITS);
return -1;
}

bitmap_set(cpu_index_map, cpu, 1);
return cpu;
}

static void cpu_release_index(CPUState *cpu)
{
bitmap_clear(cpu_index_map, cpu->cpu_index, 1);
}
#else

static int cpu_get_free_index(Error **errp)
static int cpu_get_free_index(void)
{
CPUState *some_cpu;
int cpu_index = 0;
Expand All @@ -632,12 +609,6 @@ static int cpu_get_free_index(Error **errp)
return cpu_index;
}

static void cpu_release_index(CPUState *cpu)
{
return;
}
#endif

void cpu_exec_exit(CPUState *cpu)
{
CPUClass *cc = CPU_GET_CLASS(cpu);
Expand All @@ -651,8 +622,7 @@ void cpu_exec_exit(CPUState *cpu)

QTAILQ_REMOVE(&cpus, cpu, node);
cpu->node.tqe_prev = NULL;
cpu_release_index(cpu);
cpu->cpu_index = -1;
cpu->cpu_index = UNASSIGNED_CPU_INDEX;
cpu_list_unlock();

if (cc->vmsd != NULL) {
Expand All @@ -666,7 +636,7 @@ void cpu_exec_exit(CPUState *cpu)
void cpu_exec_init(CPUState *cpu, Error **errp)
{
CPUClass *cc ATTRIBUTE_UNUSED = CPU_GET_CLASS(cpu);
Error *local_err = NULL;
Error *local_err ATTRIBUTE_UNUSED = NULL;

cpu->as = NULL;
cpu->num_ases = 0;
Expand All @@ -690,11 +660,9 @@ void cpu_exec_init(CPUState *cpu, Error **errp)
#endif

cpu_list_lock();
cpu->cpu_index = cpu_get_free_index(&local_err);
if (local_err) {
error_propagate(errp, local_err);
cpu_list_unlock();
return;
if (cpu->cpu_index == UNASSIGNED_CPU_INDEX) {
cpu->cpu_index = cpu_get_free_index();
assert(cpu->cpu_index != UNASSIGNED_CPU_INDEX);
}
QTAILQ_INSERT_TAIL(&cpus, cpu, node);
cpu_list_unlock();
Expand Down
2 changes: 2 additions & 0 deletions include/qom/cpu.h
Expand Up @@ -883,4 +883,6 @@ extern const struct VMStateDescription vmstate_cpu_common;
.offset = 0, \
}

#define UNASSIGNED_CPU_INDEX -1

#endif
2 changes: 1 addition & 1 deletion qom/cpu.c
Expand Up @@ -340,7 +340,7 @@ static void cpu_common_initfn(Object *obj)
CPUState *cpu = CPU(obj);
CPUClass *cc = CPU_GET_CLASS(obj);

cpu->cpu_index = -1;
cpu->cpu_index = UNASSIGNED_CPU_INDEX;
cpu->gdb_num_regs = cpu->gdb_num_g_regs = cc->gdb_num_core_regs;
qemu_mutex_init(&cpu->work_mutex);
QTAILQ_INIT(&cpu->breakpoints);
Expand Down

0 comments on commit a07f953

Please sign in to comment.