Store cpus in each loom
This commit is contained in:
parent
c8470fd2ea
commit
763bcf7c33
76
emu.h
76
emu.h
@ -99,36 +99,6 @@ struct ovni_eproc {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ----------------------- trace ------------------------ */
|
|
||||||
|
|
||||||
/* State of each loom on post-process */
|
|
||||||
struct ovni_loom {
|
|
||||||
size_t nprocs;
|
|
||||||
char name[HOST_NAME_MAX];
|
|
||||||
struct ovni_eproc proc[OVNI_MAX_PROC];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ovni_stream {
|
|
||||||
uint8_t *buf;
|
|
||||||
size_t size;
|
|
||||||
size_t offset;
|
|
||||||
|
|
||||||
int tid;
|
|
||||||
int thread;
|
|
||||||
int proc;
|
|
||||||
int loom;
|
|
||||||
int loaded;
|
|
||||||
int active;
|
|
||||||
struct ovni_ev *cur_ev;
|
|
||||||
uint64_t lastclock;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ovni_trace {
|
|
||||||
int nlooms;
|
|
||||||
struct ovni_loom loom[OVNI_MAX_LOOM];
|
|
||||||
int nstreams;
|
|
||||||
struct ovni_stream *stream;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ------------------ emulation ---------------- */
|
/* ------------------ emulation ---------------- */
|
||||||
|
|
||||||
@ -149,6 +119,9 @@ struct ovni_cpu {
|
|||||||
/* Physical id: as reported by lscpu(1) */
|
/* Physical id: as reported by lscpu(1) */
|
||||||
int phyid;
|
int phyid;
|
||||||
|
|
||||||
|
/* Global index for all CPUs */
|
||||||
|
int gindex;
|
||||||
|
|
||||||
enum ovni_cpu_state state;
|
enum ovni_cpu_state state;
|
||||||
|
|
||||||
size_t last_nthreads;
|
size_t last_nthreads;
|
||||||
@ -158,8 +131,12 @@ struct ovni_cpu {
|
|||||||
struct ovni_ethread *thread[OVNI_MAX_THR];
|
struct ovni_ethread *thread[OVNI_MAX_THR];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ovni_emu {
|
/* ----------------------- trace ------------------------ */
|
||||||
struct ovni_trace trace;
|
|
||||||
|
/* State of each loom on post-process */
|
||||||
|
struct ovni_loom {
|
||||||
|
size_t nprocs;
|
||||||
|
char name[HOST_NAME_MAX];
|
||||||
|
|
||||||
int max_ncpus;
|
int max_ncpus;
|
||||||
int max_phyid;
|
int max_phyid;
|
||||||
@ -169,6 +146,34 @@ struct ovni_emu {
|
|||||||
/* Virtual CPU */
|
/* Virtual CPU */
|
||||||
struct ovni_cpu vcpu;
|
struct ovni_cpu vcpu;
|
||||||
|
|
||||||
|
struct ovni_eproc proc[OVNI_MAX_PROC];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ovni_trace {
|
||||||
|
int nlooms;
|
||||||
|
struct ovni_loom loom[OVNI_MAX_LOOM];
|
||||||
|
int nstreams;
|
||||||
|
struct ovni_stream *stream;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ovni_stream {
|
||||||
|
uint8_t *buf;
|
||||||
|
size_t size;
|
||||||
|
size_t offset;
|
||||||
|
|
||||||
|
int tid;
|
||||||
|
int thread;
|
||||||
|
int proc;
|
||||||
|
int loom;
|
||||||
|
int loaded;
|
||||||
|
int active;
|
||||||
|
struct ovni_ev *cur_ev;
|
||||||
|
uint64_t lastclock;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ovni_emu {
|
||||||
|
struct ovni_trace trace;
|
||||||
|
|
||||||
struct ovni_stream *cur_stream;
|
struct ovni_stream *cur_stream;
|
||||||
struct ovni_ev *cur_ev;
|
struct ovni_ev *cur_ev;
|
||||||
|
|
||||||
@ -176,14 +181,15 @@ struct ovni_emu {
|
|||||||
struct ovni_eproc *cur_proc;
|
struct ovni_eproc *cur_proc;
|
||||||
struct ovni_ethread *cur_thread;
|
struct ovni_ethread *cur_thread;
|
||||||
|
|
||||||
|
struct nosv_task *cur_task;
|
||||||
|
|
||||||
uint64_t lastclock;
|
uint64_t lastclock;
|
||||||
int64_t delta_time;
|
int64_t delta_time;
|
||||||
|
|
||||||
/* Total counters */
|
/* Total counters */
|
||||||
int total_thread;
|
int total_thread;
|
||||||
int total_proc;
|
int total_proc;
|
||||||
|
int total_cpu;
|
||||||
struct nosv_task *cur_task;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Emulator function declaration */
|
/* Emulator function declaration */
|
||||||
@ -198,7 +204,7 @@ void hook_pre_nosv(struct ovni_emu *emu);
|
|||||||
void hook_emit_nosv(struct ovni_emu *emu);
|
void hook_emit_nosv(struct ovni_emu *emu);
|
||||||
void hook_post_nosv(struct ovni_emu *emu);
|
void hook_post_nosv(struct ovni_emu *emu);
|
||||||
|
|
||||||
struct ovni_cpu *emu_get_cpu(struct ovni_emu *emu, int cpuid);
|
struct ovni_cpu *emu_get_cpu(struct ovni_loom *loom, int cpuid);
|
||||||
|
|
||||||
struct ovni_ethread *emu_get_thread(struct ovni_emu *emu, int tid);
|
struct ovni_ethread *emu_get_thread(struct ovni_emu *emu, int tid);
|
||||||
|
|
||||||
|
90
emu_ovni.c
90
emu_ovni.c
@ -5,16 +5,16 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
struct ovni_cpu *
|
struct ovni_cpu *
|
||||||
emu_get_cpu(struct ovni_emu *emu, int cpuid)
|
emu_get_cpu(struct ovni_loom *loom, int cpuid)
|
||||||
{
|
{
|
||||||
assert(cpuid < OVNI_MAX_CPU);
|
assert(cpuid < OVNI_MAX_CPU);
|
||||||
|
|
||||||
if(cpuid < 0)
|
if(cpuid < 0)
|
||||||
{
|
{
|
||||||
return &emu->vcpu;
|
return &loom->vcpu;
|
||||||
}
|
}
|
||||||
|
|
||||||
return &emu->cpu[cpuid];
|
return &loom->cpu[cpuid];
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -66,14 +66,14 @@ emu_cpu_remove_thread(struct ovni_cpu *cpu, struct ovni_ethread *thread)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_threads_state(struct ovni_emu *emu)
|
print_threads_state(struct ovni_loom *loom)
|
||||||
{
|
{
|
||||||
struct ovni_cpu *cpu;
|
struct ovni_cpu *cpu;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
for(i=0; i<emu->ncpus; i++)
|
for(i=0; i<loom->ncpus; i++)
|
||||||
{
|
{
|
||||||
cpu = &emu->cpu[i];
|
cpu = &loom->cpu[i];
|
||||||
|
|
||||||
dbg("-- cpu %d runs %d threads:", i, cpu->nthreads);
|
dbg("-- cpu %d runs %d threads:", i, cpu->nthreads);
|
||||||
for(j=0; j<cpu->nthreads; j++)
|
for(j=0; j<cpu->nthreads; j++)
|
||||||
@ -83,10 +83,10 @@ print_threads_state(struct ovni_emu *emu)
|
|||||||
dbg("\n");
|
dbg("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
dbg("-- vcpu runs %d threads:", emu->vcpu.nthreads);
|
dbg("-- vcpu runs %d threads:", loom->vcpu.nthreads);
|
||||||
for(j=0; j<emu->vcpu.nthreads; j++)
|
for(j=0; j<loom->vcpu.nthreads; j++)
|
||||||
{
|
{
|
||||||
dbg(" %d", emu->vcpu.thread[j]->tid);
|
dbg(" %d", loom->vcpu.thread[j]->tid);
|
||||||
}
|
}
|
||||||
dbg("\n");
|
dbg("\n");
|
||||||
}
|
}
|
||||||
@ -103,7 +103,7 @@ ev_thread_execute(struct ovni_emu *emu)
|
|||||||
cpuid = emu->cur_ev->payload.i32[0];
|
cpuid = emu->cur_ev->payload.i32[0];
|
||||||
//dbg("thread %d runs in cpuid %d\n", emu->cur_thread->tid,
|
//dbg("thread %d runs in cpuid %d\n", emu->cur_thread->tid,
|
||||||
// cpuid);
|
// cpuid);
|
||||||
cpu = emu_get_cpu(emu, cpuid);
|
cpu = emu_get_cpu(emu->cur_loom, cpuid);
|
||||||
|
|
||||||
emu->cur_thread->state = TH_ST_RUNNING;
|
emu->cur_thread->state = TH_ST_RUNNING;
|
||||||
emu->cur_thread->cpu = cpu;
|
emu->cur_thread->cpu = cpu;
|
||||||
@ -190,7 +190,7 @@ ev_affinity_set(struct ovni_emu *emu)
|
|||||||
assert(emu->cur_thread->cpu);
|
assert(emu->cur_thread->cpu);
|
||||||
|
|
||||||
/* Migrate current cpu to the one at cpuid */
|
/* Migrate current cpu to the one at cpuid */
|
||||||
newcpu = emu_get_cpu(emu, cpuid);
|
newcpu = emu_get_cpu(emu->cur_loom, cpuid);
|
||||||
|
|
||||||
emu_cpu_remove_thread(emu->cur_thread->cpu, emu->cur_thread);
|
emu_cpu_remove_thread(emu->cur_thread->cpu, emu->cur_thread);
|
||||||
emu_cpu_add_thread(newcpu, emu->cur_thread);
|
emu_cpu_add_thread(newcpu, emu->cur_thread);
|
||||||
@ -216,7 +216,7 @@ ev_affinity_remote(struct ovni_emu *emu)
|
|||||||
assert(thread->state == TH_ST_PAUSED);
|
assert(thread->state == TH_ST_PAUSED);
|
||||||
assert(thread->cpu);
|
assert(thread->cpu);
|
||||||
|
|
||||||
newcpu = emu_get_cpu(emu, cpuid);
|
newcpu = emu_get_cpu(emu->cur_loom, cpuid);
|
||||||
|
|
||||||
/* It must not be running in any of the cpus */
|
/* It must not be running in any of the cpus */
|
||||||
assert(emu_cpu_find_thread(thread->cpu, thread) == -1);
|
assert(emu_cpu_find_thread(thread->cpu, thread) == -1);
|
||||||
@ -247,7 +247,9 @@ static void
|
|||||||
ev_cpu_count(struct ovni_emu *emu)
|
ev_cpu_count(struct ovni_emu *emu)
|
||||||
{
|
{
|
||||||
int i, max_ncpus, max_phyid;
|
int i, max_ncpus, max_phyid;
|
||||||
|
struct ovni_loom *loom;
|
||||||
|
|
||||||
|
loom = emu->cur_loom;
|
||||||
max_ncpus = emu->cur_ev->payload.i32[0];
|
max_ncpus = emu->cur_ev->payload.i32[0];
|
||||||
max_phyid = emu->cur_ev->payload.i32[1];
|
max_phyid = emu->cur_ev->payload.i32[1];
|
||||||
|
|
||||||
@ -256,38 +258,42 @@ ev_cpu_count(struct ovni_emu *emu)
|
|||||||
|
|
||||||
for(i=0; i<OVNI_MAX_CPU; i++)
|
for(i=0; i<OVNI_MAX_CPU; i++)
|
||||||
{
|
{
|
||||||
emu->cpu[i].state = CPU_ST_UNKNOWN;
|
loom->cpu[i].state = CPU_ST_UNKNOWN;
|
||||||
emu->cpu[i].i = -1;
|
loom->cpu[i].i = -1;
|
||||||
emu->cpu[i].phyid = -1;
|
loom->cpu[i].phyid = -1;
|
||||||
|
loom->cpu[i].gindex = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
emu->ncpus = 0;
|
loom->ncpus = 0;
|
||||||
emu->max_ncpus = max_ncpus;
|
loom->max_ncpus = max_ncpus;
|
||||||
emu->max_phyid = max_phyid;
|
loom->max_phyid = max_phyid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ev_cpu_id(struct ovni_emu *emu)
|
ev_cpu_id(struct ovni_emu *emu)
|
||||||
{
|
{
|
||||||
int i, phyid;
|
int i, phyid;
|
||||||
|
struct ovni_loom *loom;
|
||||||
|
|
||||||
|
loom = emu->cur_loom;
|
||||||
i = emu->cur_ev->payload.i32[0];
|
i = emu->cur_ev->payload.i32[0];
|
||||||
phyid = emu->cur_ev->payload.i32[1];
|
phyid = emu->cur_ev->payload.i32[1];
|
||||||
|
|
||||||
/* The logical id must match our index */
|
/* The logical id must match our index */
|
||||||
assert(i == emu->ncpus);
|
assert(i == loom->ncpus);
|
||||||
|
|
||||||
assert(0 <= phyid && phyid <= emu->max_phyid);
|
assert(0 <= phyid && phyid <= loom->max_phyid);
|
||||||
|
|
||||||
assert(emu->cpu[i].state == CPU_ST_UNKNOWN);
|
assert(loom->cpu[i].state == CPU_ST_UNKNOWN);
|
||||||
|
|
||||||
emu->cpu[emu->ncpus].state = CPU_ST_READY;
|
loom->cpu[loom->ncpus].state = CPU_ST_READY;
|
||||||
emu->cpu[emu->ncpus].i = i;
|
loom->cpu[loom->ncpus].i = i;
|
||||||
emu->cpu[emu->ncpus].phyid = phyid;
|
loom->cpu[loom->ncpus].phyid = phyid;
|
||||||
|
loom->cpu[loom->ncpus].gindex = emu->total_cpu++;
|
||||||
|
|
||||||
dbg("new cpu %d at phyid=%d\n", i, phyid);
|
dbg("new cpu %d at phyid=%d\n", i, phyid);
|
||||||
|
|
||||||
emu->ncpus++;
|
loom->ncpus++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -346,37 +352,42 @@ static void
|
|||||||
emit_thread_count(struct ovni_emu *emu)
|
emit_thread_count(struct ovni_emu *emu)
|
||||||
{
|
{
|
||||||
int i, n, row, pid, tid;
|
int i, n, row, pid, tid;
|
||||||
|
struct ovni_loom *loom;
|
||||||
|
|
||||||
|
loom = emu->cur_loom;
|
||||||
|
|
||||||
|
/* TODO: Use a table to quickly access the updated elements */
|
||||||
|
|
||||||
/* Check every CPU looking for a change in nthreads */
|
/* Check every CPU looking for a change in nthreads */
|
||||||
for(i=0; i<emu->ncpus; i++)
|
for(i=0; i<loom->ncpus; i++)
|
||||||
{
|
{
|
||||||
if(emu->cpu[i].last_nthreads != emu->cpu[i].nthreads)
|
if(loom->cpu[i].last_nthreads != loom->cpu[i].nthreads)
|
||||||
{
|
{
|
||||||
/* Start at 1 */
|
/* Start at 1 */
|
||||||
row = i + 1;
|
row = i + 1;
|
||||||
n = emu->cpu[i].nthreads;
|
n = loom->cpu[i].nthreads;
|
||||||
prv_ev_row(emu, row, PTC_NTHREADS, n);
|
prv_ev_row(emu, row, PTC_NTHREADS, n);
|
||||||
|
|
||||||
pid = n == 1 ? emu->cpu[i].thread[0]->proc->pid : 1;
|
pid = n == 1 ? loom->cpu[i].thread[0]->proc->pid : 1;
|
||||||
prv_ev_row(emu, row, PTC_PROC_PID, pid);
|
prv_ev_row(emu, row, PTC_PROC_PID, pid);
|
||||||
|
|
||||||
tid = n == 1 ? emu->cpu[i].thread[0]->tid : 1;
|
tid = n == 1 ? loom->cpu[i].thread[0]->tid : 1;
|
||||||
prv_ev_row(emu, row, PTC_THREAD_TID, tid);
|
prv_ev_row(emu, row, PTC_THREAD_TID, tid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Same with the virtual CPU */
|
/* Same with the virtual CPU */
|
||||||
if(emu->vcpu.last_nthreads != emu->vcpu.nthreads)
|
if(loom->vcpu.last_nthreads != loom->vcpu.nthreads)
|
||||||
{
|
{
|
||||||
/* Place the virtual CPU after the physical CPUs */
|
/* Place the virtual CPU after the physical CPUs */
|
||||||
row = emu->ncpus + 1;
|
row = loom->ncpus + 1;
|
||||||
n = emu->vcpu.nthreads;
|
n = loom->vcpu.nthreads;
|
||||||
prv_ev_row(emu, row, PTC_NTHREADS, n);
|
prv_ev_row(emu, row, PTC_NTHREADS, n);
|
||||||
|
|
||||||
pid = n == 1 ? emu->vcpu.thread[0]->proc->pid : 1;
|
pid = n == 1 ? loom->vcpu.thread[0]->proc->pid : 1;
|
||||||
prv_ev_row(emu, row, PTC_PROC_PID, pid);
|
prv_ev_row(emu, row, PTC_PROC_PID, pid);
|
||||||
|
|
||||||
tid = n == 1 ? emu->vcpu.thread[0]->tid : 1;
|
tid = n == 1 ? loom->vcpu.thread[0]->tid : 1;
|
||||||
prv_ev_row(emu, row, PTC_THREAD_TID, tid);
|
prv_ev_row(emu, row, PTC_THREAD_TID, tid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -412,11 +423,14 @@ void
|
|||||||
hook_post_ovni(struct ovni_emu *emu)
|
hook_post_ovni(struct ovni_emu *emu)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
struct ovni_loom *loom;
|
||||||
|
|
||||||
|
loom = emu->cur_loom;
|
||||||
|
|
||||||
/* Update last_nthreads in the CPUs */
|
/* Update last_nthreads in the CPUs */
|
||||||
|
|
||||||
for(i=0; i<emu->ncpus; i++)
|
for(i=0; i<loom->ncpus; i++)
|
||||||
emu->cpu[i].last_nthreads = emu->cpu[i].nthreads;
|
loom->cpu[i].last_nthreads = loom->cpu[i].nthreads;
|
||||||
|
|
||||||
emu->vcpu.last_nthreads = emu->vcpu.nthreads;
|
loom->vcpu.last_nthreads = loom->vcpu.nthreads;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user