Add Nanos6 support for memory allocation
This commit is contained in:
parent
306a64999a
commit
8e690f0e44
6
emu.h
6
emu.h
@ -117,6 +117,12 @@ enum nanos6_ss_state {
|
|||||||
ST_NANOS6_BLK_UNBLOCKING,
|
ST_NANOS6_BLK_UNBLOCKING,
|
||||||
ST_NANOS6_HANDLING_TASK,
|
ST_NANOS6_HANDLING_TASK,
|
||||||
ST_NANOS6_WORKER_LOOP,
|
ST_NANOS6_WORKER_LOOP,
|
||||||
|
ST_NANOS6_SWITCH_TO,
|
||||||
|
ST_NANOS6_MIGRATE,
|
||||||
|
ST_NANOS6_SUSPEND,
|
||||||
|
ST_NANOS6_RESUME,
|
||||||
|
ST_NANOS6_ALLOCATING,
|
||||||
|
ST_NANOS6_FREEING,
|
||||||
|
|
||||||
/* Value 51 is broken in old Paraver */
|
/* Value 51 is broken in old Paraver */
|
||||||
EV_NANOS6_SCHED_RECV = 60,
|
EV_NANOS6_SCHED_RECV = 60,
|
||||||
|
77
emu_nanos6.c
77
emu_nanos6.c
@ -160,7 +160,7 @@ static void
|
|||||||
update_task_state(struct ovni_emu *emu)
|
update_task_state(struct ovni_emu *emu)
|
||||||
{
|
{
|
||||||
if(ovni_payload_size(emu->cur_ev) < 4)
|
if(ovni_payload_size(emu->cur_ev) < 4)
|
||||||
die("missing task id in payload\n");
|
edie(emu, "missing task id in payload\n");
|
||||||
|
|
||||||
uint32_t task_id = emu->cur_ev->payload.u32[0];
|
uint32_t task_id = emu->cur_ev->payload.u32[0];
|
||||||
|
|
||||||
@ -173,7 +173,7 @@ update_task_state(struct ovni_emu *emu)
|
|||||||
struct task *task = task_find(info->tasks, task_id);
|
struct task *task = task_find(info->tasks, task_id);
|
||||||
|
|
||||||
if(task == NULL)
|
if(task == NULL)
|
||||||
die("cannot find task with id %u\n", task_id);
|
edie(emu, "cannot find task with id %u\n", task_id);
|
||||||
|
|
||||||
switch(emu->cur_ev->header.value)
|
switch(emu->cur_ev->header.value)
|
||||||
{
|
{
|
||||||
@ -182,8 +182,7 @@ update_task_state(struct ovni_emu *emu)
|
|||||||
case 'p': task_pause(stack, task); break;
|
case 'p': task_pause(stack, task); break;
|
||||||
case 'r': task_resume(stack, task); break;
|
case 'r': task_resume(stack, task); break;
|
||||||
default:
|
default:
|
||||||
die("unexpected Nanos6 task event value %c\n",
|
edie(emu, "unexpected Nanos6 task event\n");
|
||||||
emu->cur_ev->header.value);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,7 +224,7 @@ update_task_channels(struct ovni_emu *emu,
|
|||||||
chan_task_switch(emu, prev, next);
|
chan_task_switch(emu, prev, next);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
die("unexpected transition value %c\n", tr);
|
edie(emu, "unexpected transition value %c\n", tr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,8 +291,7 @@ pre_task(struct ovni_emu *emu)
|
|||||||
update_task(emu);
|
update_task(emu);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
die("unexpected Nanos6 task event value %c\n",
|
edie(emu, "unexpected Nanos6 task event value\n");
|
||||||
emu->cur_ev->header.value);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -333,7 +331,8 @@ pre_deps(struct ovni_emu *emu)
|
|||||||
case 'R': chan_pop (chan_th, ST_NANOS6_DEP_REG); break;
|
case 'R': chan_pop (chan_th, ST_NANOS6_DEP_REG); break;
|
||||||
case 'u': chan_push(chan_th, ST_NANOS6_DEP_UNREG); break;
|
case 'u': chan_push(chan_th, ST_NANOS6_DEP_UNREG); break;
|
||||||
case 'U': chan_pop (chan_th, ST_NANOS6_DEP_UNREG); break;
|
case 'U': chan_pop (chan_th, ST_NANOS6_DEP_UNREG); break;
|
||||||
default: break;
|
default:
|
||||||
|
edie(emu, "unknown Nanos6 dependency event\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -356,7 +355,8 @@ pre_blocking(struct ovni_emu *emu)
|
|||||||
case 'W': chan_pop (chan_th, ST_NANOS6_BLK_TASKWAIT); break;
|
case 'W': chan_pop (chan_th, ST_NANOS6_BLK_TASKWAIT); break;
|
||||||
case 'f': chan_push(chan_th, ST_NANOS6_BLK_WAITFOR); break;
|
case 'f': chan_push(chan_th, ST_NANOS6_BLK_WAITFOR); break;
|
||||||
case 'F': chan_pop (chan_th, ST_NANOS6_BLK_WAITFOR); break;
|
case 'F': chan_pop (chan_th, ST_NANOS6_BLK_WAITFOR); break;
|
||||||
default: break;
|
default:
|
||||||
|
edie(emu, "unknown Nanos6 blocking event\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -375,7 +375,36 @@ pre_worker(struct ovni_emu *emu)
|
|||||||
case ']': chan_pop (chan_th, ST_NANOS6_WORKER_LOOP); break;
|
case ']': chan_pop (chan_th, ST_NANOS6_WORKER_LOOP); break;
|
||||||
case 't': chan_push(chan_th, ST_NANOS6_HANDLING_TASK); break;
|
case 't': chan_push(chan_th, ST_NANOS6_HANDLING_TASK); break;
|
||||||
case 'T': chan_pop (chan_th, ST_NANOS6_HANDLING_TASK); break;
|
case 'T': chan_pop (chan_th, ST_NANOS6_HANDLING_TASK); break;
|
||||||
default: break;
|
case 'w': chan_push(chan_th, ST_NANOS6_SWITCH_TO); break;
|
||||||
|
case 'W': chan_pop (chan_th, ST_NANOS6_SWITCH_TO); break;
|
||||||
|
case 'm': chan_push(chan_th, ST_NANOS6_MIGRATE); break;
|
||||||
|
case 'M': chan_pop (chan_th, ST_NANOS6_MIGRATE); break;
|
||||||
|
case 's': chan_push(chan_th, ST_NANOS6_SUSPEND); break;
|
||||||
|
case 'S': chan_pop (chan_th, ST_NANOS6_SUSPEND); break;
|
||||||
|
case 'r': chan_push(chan_th, ST_NANOS6_RESUME); break;
|
||||||
|
case 'R': chan_pop (chan_th, ST_NANOS6_RESUME); break;
|
||||||
|
default:
|
||||||
|
edie(emu, "unknown Nanos6 worker event\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pre_memory(struct ovni_emu *emu)
|
||||||
|
{
|
||||||
|
struct ovni_ethread *th;
|
||||||
|
struct ovni_chan *chan_th;
|
||||||
|
|
||||||
|
th = emu->cur_thread;
|
||||||
|
chan_th = &th->chan[CHAN_NANOS6_SUBSYSTEM];
|
||||||
|
|
||||||
|
switch(emu->cur_ev->header.value)
|
||||||
|
{
|
||||||
|
case 'a': chan_push(chan_th, ST_NANOS6_ALLOCATING); break;
|
||||||
|
case 'A': chan_pop (chan_th, ST_NANOS6_ALLOCATING); break;
|
||||||
|
case 'f': chan_push(chan_th, ST_NANOS6_FREEING); break;
|
||||||
|
case 'F': chan_pop (chan_th, ST_NANOS6_FREEING); break;
|
||||||
|
default:
|
||||||
|
edie(emu, "unknown Nanos6 memory event\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -398,8 +427,7 @@ pre_sched(struct ovni_emu *emu)
|
|||||||
case 'r': chan_ev (chan_th, EV_NANOS6_SCHED_RECV); break;
|
case 'r': chan_ev (chan_th, EV_NANOS6_SCHED_RECV); break;
|
||||||
case 's': chan_ev (chan_th, EV_NANOS6_SCHED_SEND); break;
|
case 's': chan_ev (chan_th, EV_NANOS6_SCHED_SEND); break;
|
||||||
default:
|
default:
|
||||||
die("unknown Nanos6 scheduler event %c\n",
|
edie(emu, "unknown Nanos6 scheduler event\n");
|
||||||
emu->cur_ev->header.value);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -445,6 +473,20 @@ pre_cpu(struct ovni_emu *emu)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pre_shutdown(struct ovni_emu *emu)
|
||||||
|
{
|
||||||
|
struct ovni_ethread *th;
|
||||||
|
struct ovni_chan *chan_th;
|
||||||
|
|
||||||
|
th = emu->cur_thread;
|
||||||
|
chan_th = &th->chan[CHAN_NANOS6_SUBSYSTEM];
|
||||||
|
|
||||||
|
uint8_t value = emu->cur_ev->header.value;
|
||||||
|
|
||||||
|
chan_ev(chan_th, 100 + value - '0');
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pre_ss(struct ovni_emu *emu, int st)
|
pre_ss(struct ovni_emu *emu, int st)
|
||||||
{
|
{
|
||||||
@ -490,9 +532,11 @@ hook_pre_nanos6(struct ovni_emu *emu)
|
|||||||
die("hook_pre_nanos6: unexpected event with model %c\n",
|
die("hook_pre_nanos6: unexpected event with model %c\n",
|
||||||
emu->cur_ev->header.model);
|
emu->cur_ev->header.model);
|
||||||
|
|
||||||
if(!emu->cur_thread->is_active)
|
if(!emu->cur_thread->is_active) {
|
||||||
die("hook_pre_nanos6: current thread %d not active\n",
|
eerr(emu, "hook_pre_nanos6: current thread %d not active\n",
|
||||||
emu->cur_thread->tid);
|
emu->cur_thread->tid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch(emu->cur_ev->header.category)
|
switch(emu->cur_ev->header.category)
|
||||||
{
|
{
|
||||||
@ -506,9 +550,10 @@ hook_pre_nanos6(struct ovni_emu *emu)
|
|||||||
case 'B': pre_blocking(emu); break;
|
case 'B': pre_blocking(emu); break;
|
||||||
case 'W': pre_worker(emu); break;
|
case 'W': pre_worker(emu); break;
|
||||||
case 'C': pre_cpu(emu); break;
|
case 'C': pre_cpu(emu); break;
|
||||||
|
case 's': pre_shutdown(emu); break;
|
||||||
|
case 'M': pre_memory(emu); break;
|
||||||
default:
|
default:
|
||||||
die("unknown Nanos6 event category %c\n",
|
edie(emu, "unknown Nanos6 event category\n");
|
||||||
emu->cur_ev->header.category);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
check_affinity(emu);
|
check_affinity(emu);
|
||||||
|
8
pcf.c
8
pcf.c
@ -189,9 +189,17 @@ struct pcf_value_label nanos6_ss_values[] = {
|
|||||||
{ ST_NANOS6_BLK_WAITFOR, "Blocking: Wait For" },
|
{ ST_NANOS6_BLK_WAITFOR, "Blocking: Wait For" },
|
||||||
{ ST_NANOS6_HANDLING_TASK, "Worker: Handling task" },
|
{ ST_NANOS6_HANDLING_TASK, "Worker: Handling task" },
|
||||||
{ ST_NANOS6_WORKER_LOOP, "Worker: Looking for work" },
|
{ ST_NANOS6_WORKER_LOOP, "Worker: Looking for work" },
|
||||||
|
{ ST_NANOS6_SWITCH_TO, "Worker: Switching to another thread" },
|
||||||
|
{ ST_NANOS6_MIGRATE, "Worker: Migrating CPU" },
|
||||||
|
{ ST_NANOS6_SUSPEND, "Worker: Suspending thread" },
|
||||||
|
{ ST_NANOS6_RESUME, "Worker: Resuming another thread" },
|
||||||
|
{ ST_NANOS6_ALLOCATING, "Memory: Allocating" },
|
||||||
|
{ ST_NANOS6_FREEING, "Memory: Freeing" },
|
||||||
{ EV_NANOS6_SCHED_SEND, "EV Scheduler: Send task" },
|
{ EV_NANOS6_SCHED_SEND, "EV Scheduler: Send task" },
|
||||||
{ EV_NANOS6_SCHED_RECV, "EV Scheduler: Recv task" },
|
{ EV_NANOS6_SCHED_RECV, "EV Scheduler: Recv task" },
|
||||||
{ EV_NANOS6_SCHED_SELF, "EV Scheduler: Self-assign task" },
|
{ EV_NANOS6_SCHED_SELF, "EV Scheduler: Self-assign task" },
|
||||||
|
{ EV_NANOS6_CPU_IDLE, "EV CPU: Becomes idle" },
|
||||||
|
{ EV_NANOS6_CPU_ACTIVE, "EV CPU: Becomes active" },
|
||||||
{ -1, NULL },
|
{ -1, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user