Allocate only the required CPUs
This commit is contained in:
parent
8153742c1f
commit
a663f2c11b
41
emu.c
41
emu.c
@ -540,11 +540,15 @@ add_new_cpu(struct ovni_emu *emu, struct ovni_loom *loom, int i, int phyid)
|
|||||||
{
|
{
|
||||||
struct ovni_cpu *cpu;
|
struct ovni_cpu *cpu;
|
||||||
|
|
||||||
/* The logical id must match our index */
|
|
||||||
assert((size_t) i == loom->ncpus);
|
|
||||||
|
|
||||||
cpu = &loom->cpu[i];
|
cpu = &loom->cpu[i];
|
||||||
|
|
||||||
|
if(i < 0 || i >= (int) loom->ncpus)
|
||||||
|
{
|
||||||
|
err("CPU with index %d in loom %s is out of bounds\n", i,
|
||||||
|
loom->hostname);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
assert(cpu->state == CPU_ST_UNKNOWN);
|
assert(cpu->state == CPU_ST_UNKNOWN);
|
||||||
|
|
||||||
cpu->state = CPU_ST_READY;
|
cpu->state = CPU_ST_READY;
|
||||||
@ -554,8 +558,6 @@ add_new_cpu(struct ovni_emu *emu, struct ovni_loom *loom, int i, int phyid)
|
|||||||
cpu->loom = loom;
|
cpu->loom = loom;
|
||||||
|
|
||||||
dbg("new cpu %d at phyid=%d\n", cpu->gindex, phyid);
|
dbg("new cpu %d at phyid=%d\n", cpu->gindex, phyid);
|
||||||
|
|
||||||
loom->ncpus++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -579,16 +581,41 @@ proc_load_cpus(struct ovni_emu *emu, struct ovni_loom *loom, struct ovni_eproc *
|
|||||||
|
|
||||||
assert(loom->ncpus == 0);
|
assert(loom->ncpus == 0);
|
||||||
|
|
||||||
for(i = 0; i < json_array_get_count(cpuarray); i++)
|
loom->ncpus = json_array_get_count(cpuarray);
|
||||||
|
|
||||||
|
if(loom->ncpus <= 0)
|
||||||
|
{
|
||||||
|
err("loom %s proc %d has read %ld cpus, but required > 0\n",
|
||||||
|
loom->hostname, proc->pid, loom->ncpus);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
loom->cpu = calloc(loom->ncpus, sizeof(struct ovni_cpu));
|
||||||
|
|
||||||
|
if(loom->cpu == NULL)
|
||||||
|
{
|
||||||
|
perror("calloc failed");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < loom->ncpus; i++)
|
||||||
{
|
{
|
||||||
cpu = json_array_get_object(cpuarray, i);
|
cpu = json_array_get_object(cpuarray, i);
|
||||||
|
|
||||||
|
if(cpu == NULL)
|
||||||
|
{
|
||||||
|
err("json_array_get_object returned NULL\n");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
index = (int) json_object_get_number(cpu, "index");
|
index = (int) json_object_get_number(cpu, "index");
|
||||||
phyid = (int) json_object_get_number(cpu, "phyid");
|
phyid = (int) json_object_get_number(cpu, "phyid");
|
||||||
|
|
||||||
add_new_cpu(emu, loom, index, phyid);
|
add_new_cpu(emu, loom, index, phyid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we reach this point, all CPUs are in the ready state */
|
||||||
|
|
||||||
/* Init the vcpu as well */
|
/* Init the vcpu as well */
|
||||||
vcpu = &loom->vcpu;
|
vcpu = &loom->vcpu;
|
||||||
assert(vcpu->state == CPU_ST_UNKNOWN);
|
assert(vcpu->state == CPU_ST_UNKNOWN);
|
||||||
@ -651,6 +678,8 @@ destroy_metadata(struct ovni_emu *emu)
|
|||||||
assert(proc->meta);
|
assert(proc->meta);
|
||||||
json_value_free(proc->meta);
|
json_value_free(proc->meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(loom->cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
2
emu.h
2
emu.h
@ -381,7 +381,7 @@ struct ovni_loom {
|
|||||||
size_t max_phyid;
|
size_t max_phyid;
|
||||||
size_t ncpus;
|
size_t ncpus;
|
||||||
size_t offset_ncpus;
|
size_t offset_ncpus;
|
||||||
struct ovni_cpu cpu[OVNI_MAX_CPU];
|
struct ovni_cpu *cpu;
|
||||||
|
|
||||||
int64_t clock_offset;
|
int64_t clock_offset;
|
||||||
|
|
||||||
|
@ -187,7 +187,7 @@ update_cpu(struct ovni_cpu *cpu)
|
|||||||
struct ovni_cpu *
|
struct ovni_cpu *
|
||||||
emu_get_cpu(struct ovni_loom *loom, int cpuid)
|
emu_get_cpu(struct ovni_loom *loom, int cpuid)
|
||||||
{
|
{
|
||||||
assert(cpuid < OVNI_MAX_CPU);
|
assert(cpuid < (int) loom->ncpus);
|
||||||
|
|
||||||
if(cpuid < 0)
|
if(cpuid < 0)
|
||||||
{
|
{
|
||||||
|
1
ovni.h
1
ovni.h
@ -40,7 +40,6 @@ extern "C" {
|
|||||||
/* Hardcode the JSON_Value to avoid a dependency with janson */
|
/* Hardcode the JSON_Value to avoid a dependency with janson */
|
||||||
typedef struct json_value_t JSON_Value;
|
typedef struct json_value_t JSON_Value;
|
||||||
|
|
||||||
#define OVNI_MAX_CPU 256
|
|
||||||
#define OVNI_TRACEDIR "ovni"
|
#define OVNI_TRACEDIR "ovni"
|
||||||
#define OVNI_MAX_HOSTNAME 512
|
#define OVNI_MAX_HOSTNAME 512
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user