From 6bb644a69dde49ffc8c3fb484a6a3bf81d21181c Mon Sep 17 00:00:00 2001 From: Jeremy Erickson Date: Mon, 28 Jan 2013 22:28:29 -0500 Subject: Add support for measurement code from bbbdiss --- bin/fmlp_test_task.c | 2 +- bin/rtspin.c | 2 +- include/litmus.h | 12 ++++++++---- src/kernel_iface.c | 15 +++++++++++++++ src/litmus.c | 42 +++++++++++++++++++++++++++++++++++++++--- 5 files changed, 64 insertions(+), 9 deletions(-) diff --git a/bin/fmlp_test_task.c b/bin/fmlp_test_task.c index 0ecd5cc..3500326 100644 --- a/bin/fmlp_test_task.c +++ b/bin/fmlp_test_task.c @@ -186,7 +186,7 @@ void* rt_thread(void *tcontext) CALL( init_rt_thread() ); ctx->semaphore = open_fmlp_sem(ctx->fd, 0); - CALL( sporadic_task_ns(ctx->exec, ctx->period, 0, ctx->split, 1, + CALL( sporadic_task_ns(ctx->exec, ctx->period, 0, ctx->split, 1, 0, RT_CLASS_HARD, PRECISE_ENFORCEMENT, 1)); diff --git a/bin/rtspin.c b/bin/rtspin.c index 1d60524..4acde37 100644 --- a/bin/rtspin.c +++ b/bin/rtspin.c @@ -280,7 +280,7 @@ int main(int argc, char** argv) bail_out("could not migrate to target partition"); } - ret = sporadic_task_ns(wcet, period, 0, split, cpu, class, + ret = sporadic_task_ns(wcet, period, 0, split, cpu, 0, class, want_enforcement ? PRECISE_ENFORCEMENT : NO_ENFORCEMENT, migrate); diff --git a/include/litmus.h b/include/litmus.h index 78fb4f4..a95287c 100644 --- a/include/litmus.h +++ b/include/litmus.h @@ -32,20 +32,20 @@ int get_rt_task_param(pid_t pid, struct rt_task* param); /* times are given in ms */ int sporadic_task( lt_t e, lt_t p, lt_t phase, int split, - int partition, task_class_t cls, + int partition, unsigned int priority, task_class_t cls, budget_policy_t budget_policy, int set_cpu_set); /* times are given in ns */ int sporadic_task_ns( lt_t e, lt_t p, lt_t phase, int split, - int cpu, task_class_t cls, + int cpu, unsigned int priority, task_class_t cls, budget_policy_t budget_policy, int set_cpu_set); /* budget enforcement off by default in these macros */ #define sporadic_global(e, p) \ - sporadic_task(e, p, 0, 1, 0, RT_CLASS_SOFT, NO_ENFORCEMENT, 0) + sporadic_task(e, p, 0, 1, 0, 0, RT_CLASS_SOFT, NO_ENFORCEMENT, 0) #define sporadic_partitioned(e, p, cpu) \ - sporadic_task(e, p, 0, 1, cpu, RT_CLASS_SOFT, NO_ENFORCEMENT, 1) + sporadic_task(e, p, 0, 1, cpu, 0, RT_CLASS_SOFT, NO_ENFORCEMENT, 1) /* file descriptor attached shared objects support */ typedef enum { @@ -53,6 +53,9 @@ typedef enum { SRP_SEM = 1, } obj_type_t; +int lock_protocol_for_name(const char* name); +const char* name_for_lock_protocol(int id); + int od_openx(int fd, obj_type_t type, int obj_id, void* config); int od_close(int od); @@ -97,6 +100,7 @@ task_class_t str2class(const char* str); /* non-preemptive section support */ void enter_np(void); void exit_np(void); +int exit_np_trace(void); int requested_to_preempt(void); /* task system support */ diff --git a/src/kernel_iface.c b/src/kernel_iface.c index 33d56df..4ded334 100644 --- a/src/kernel_iface.c +++ b/src/kernel_iface.c @@ -75,6 +75,21 @@ void exit_np(void) } } +int exit_np_trace(void) +{ + if (likely(ctrl_page != NULL) && + ctrl_page->sched.np.flag && + !(--ctrl_page->sched.np.flag)) { + __sync_synchronize(); + if (ctrl_page->sched.np.preempt) { + ctrl_page->ts_syscall_start = (uint64_t) get_cycles(); + sched_yield(); + return 1; + } + } + return 0; +} + int requested_to_preempt(void) { return (likely(ctrl_page != NULL) && ctrl_page->sched.np.preempt); diff --git a/src/litmus.c b/src/litmus.c index bb08e87..96ecebc 100644 --- a/src/litmus.c +++ b/src/litmus.c @@ -10,6 +10,40 @@ #include "litmus.h" #include "internal.h" +#define LP(name) {name ## _SEM, #name} + +static struct { + int id; + const char* name; +} protocol[] = { + LP(FMLP), + LP(SRP) +}; + +#define NUM_PROTOS (sizeof(protocol)/sizeof(protocol[0])) + +int lock_protocol_for_name(const char* name) +{ + int i; + + for (i = 0; i < NUM_PROTOS; i++) + if (strcmp(name, protocol[i].name) == 0) + return protocol[i].id; + + return -1; +} + +const char* name_for_lock_protocol(int id) +{ + int i; + + for (i = 0; i < NUM_PROTOS; i++) + if (protocol[i].id == id) + return protocol[i].name; + + return ""; +} + void show_rt_param(struct rt_task* tp) { printf("rt params:\n\t" @@ -42,15 +76,16 @@ int be_migrate_to(int target_cpu) } int sporadic_task(lt_t e, lt_t p, lt_t phase, int split, - int cpu, task_class_t cls, + int cpu, unsigned int priority, task_class_t cls, budget_policy_t budget_policy, int set_cpu_set) { return sporadic_task_ns(e * NS_PER_MS, p * NS_PER_MS, phase * NS_PER_MS, - split, cpu, cls, budget_policy, set_cpu_set); + split, cpu, priority, cls, budget_policy, + set_cpu_set); } int sporadic_task_ns(lt_t e, lt_t p, lt_t phase, int split, - int cpu, task_class_t cls, + int cpu, unsigned int priority, task_class_t cls, budget_policy_t budget_policy, int set_cpu_set) { struct rt_task param; @@ -65,6 +100,7 @@ int sporadic_task_ns(lt_t e, lt_t p, lt_t phase, int split, param.period = p; param.split = split; param.cpu = cpu; + param.priority = priority; param.cls = cls; param.phase = phase; param.budget_policy = budget_policy; -- cgit v1.2.2