diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2007-10-08 20:44:26 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2007-10-08 20:44:26 -0400 |
commit | e7869361400ef89ae169c1acf17296b7ada47cc8 (patch) | |
tree | 7beb6e7071dcfdb3b4c00425653bf350ff66b517 /src | |
parent | 52037de5606d863f00c3ccb9d872fd3bc7815453 (diff) |
adaptive: kick out weight-transfer function
weight-transfer function is redundant with per service level weights
Diffstat (limited to 'src')
-rw-r--r-- | src/adaptive.c | 16 | ||||
-rw-r--r-- | src/rt_launch.c | 57 |
2 files changed, 14 insertions, 59 deletions
diff --git a/src/adaptive.c b/src/adaptive.c index 8dfb27b..ebf662d 100644 --- a/src/adaptive.c +++ b/src/adaptive.c | |||
@@ -11,11 +11,9 @@ | |||
11 | 11 | ||
12 | int set_service_levels(pid_t pid, | 12 | int set_service_levels(pid_t pid, |
13 | unsigned int nr_levels, | 13 | unsigned int nr_levels, |
14 | service_level_t* levels, | 14 | service_level_t* levels) |
15 | fp_t *wt_y, | ||
16 | fp_t *wt_slope) | ||
17 | { | 15 | { |
18 | return syscall(__NR_set_service_levels, pid, nr_levels, levels, wt_y, wt_slope); | 16 | return syscall(__NR_set_service_levels, pid, nr_levels, levels); |
19 | } | 17 | } |
20 | 18 | ||
21 | 19 | ||
@@ -28,25 +26,19 @@ int get_cur_service_level(void) | |||
28 | struct adaptive_param { | 26 | struct adaptive_param { |
29 | unsigned int no_levels; | 27 | unsigned int no_levels; |
30 | service_level_t* levels; | 28 | service_level_t* levels; |
31 | fp_t wt_y; | ||
32 | fp_t wt_slope; | ||
33 | }; | 29 | }; |
34 | 30 | ||
35 | int setup_adaptive(int pid, struct adaptive_param* arg) | 31 | int setup_adaptive(int pid, struct adaptive_param* arg) |
36 | { | 32 | { |
37 | return set_service_levels(pid, arg->no_levels, arg->levels, | 33 | return set_service_levels(pid, arg->no_levels, arg->levels); |
38 | &arg->wt_y, &arg->wt_slope); | ||
39 | } | 34 | } |
40 | 35 | ||
41 | int create_adaptive_rt_task(rt_fn_t rt_prog, void *arg, | 36 | int create_adaptive_rt_task(rt_fn_t rt_prog, void *arg, |
42 | unsigned int no_levels, service_level_t* levels, | 37 | unsigned int no_levels, service_level_t* levels) |
43 | fp_t wt_y, fp_t wt_slope) | ||
44 | { | 38 | { |
45 | struct adaptive_param p; | 39 | struct adaptive_param p; |
46 | p.no_levels = no_levels; | 40 | p.no_levels = no_levels; |
47 | p.levels = levels; | 41 | p.levels = levels; |
48 | p.wt_y = wt_y; | ||
49 | p.wt_slope = wt_slope; | ||
50 | return __launch_rt_task(rt_prog, arg, | 42 | return __launch_rt_task(rt_prog, arg, |
51 | (rt_setup_fn_t) setup_adaptive, &p); | 43 | (rt_setup_fn_t) setup_adaptive, &p); |
52 | } | 44 | } |
diff --git a/src/rt_launch.c b/src/rt_launch.c index b76cb8c..7098e73 100644 --- a/src/rt_launch.c +++ b/src/rt_launch.c | |||
@@ -23,20 +23,19 @@ int launch(void *task_info_p) { | |||
23 | 23 | ||
24 | void usage(char *error) { | 24 | void usage(char *error) { |
25 | fprintf(stderr, "%s\nUsage: \nlaunch_rt supports one of two modes:\n" | 25 | fprintf(stderr, "%s\nUsage: \nlaunch_rt supports one of two modes:\n" |
26 | "\n\tlaunch_rt <SPORADIC OPTIONS> program arg1 arg2 ...\n" | 26 | "\n\tlaunch_rt <SPORADIC OPTIONS> <wcet> <period> program arg1 arg2 ...\n" |
27 | "\n\tlaunch_rt <ADAPTIVE OPTIONS> program arg1 arg2 ...\n" | 27 | "\n\tlaunch_rt <ADAPTIVE OPTIONS> program arg1 arg2 ...\n" |
28 | "\nwhere:" | 28 | "\nwhere:" |
29 | "\n\t <SPORADIC OPTIONS> = " | 29 | "\n\t <SPORADIC OPTIONS> = " |
30 | "[-c {hrt|srt|be}] [-p <cpu>] <wcet> <period>\n" | 30 | "[-c {hrt|srt|be}] [-p <cpu>]\n" |
31 | "\n\t <ADAPTIVE OPTIONS> = " | 31 | "\n\t <ADAPTIVE OPTIONS> = " |
32 | "(-a weight/period/utility)+ [-w <y intercept>+<slope>v]\n" | 32 | "(-a weight/period/utility)+\n" |
33 | "\nExamples:" | 33 | "\nExamples:" |
34 | "\n\trt_launch -p 2 10 100 cpu_job" | 34 | "\n\trt_launch -p 2 10 100 cpu_job" |
35 | "\n\t => Launch cpu_job a hard real-time task with period 100 and weight 0.1" | 35 | "\n\t => Launch cpu_job a hard real-time task with " |
36 | "\n\t on CPU 2.\n" | 36 | "\n\t period 100 and weight 0.1 on CPU 2.\n" |
37 | "\n\trt_launch -a 0.1/100/0.4 -a 0.2/75/0.5 -w 0.2+0.3v adaptive_job" | 37 | "\n\trt_launch -a 0.1/100/0.4 -a 0.2/75/0.5 adaptive_job" |
38 | "\n\t => Launch adaptive_job with two service levels and a custom " | 38 | "\n\t => Launch adaptive_job with two service levels" |
39 | "\n\t weight-transfer function." | ||
40 | "\n\n", | 39 | "\n\n", |
41 | error); | 40 | error); |
42 | exit(1); | 41 | exit(1); |
@@ -67,33 +66,8 @@ static int parse_service_level(service_level_t* level, char* str) | |||
67 | return 1; | 66 | return 1; |
68 | } | 67 | } |
69 | 68 | ||
70 | /* argument format should be <y intercept>+<slope>v */ | ||
71 | static int parse_wt(fp_t *_y, fp_t *_slope, char* str) | ||
72 | { | ||
73 | char *y, *slope; | ||
74 | double yf, sf; | ||
75 | y = strtok(str, "+"); | ||
76 | slope = strtok(NULL, "v"); | ||
77 | str = strtok(NULL, "/"); /* If we find anyting at all then the | ||
78 | * string is malformed. | ||
79 | */ | ||
80 | if (str || !y || !slope) | ||
81 | return 0; | ||
82 | |||
83 | yf = strtof(y, &y); | ||
84 | sf = strtof(slope, &slope); | ||
85 | |||
86 | if (*y || *slope || | ||
87 | yf < 0.0 || sf <= 0.0) | ||
88 | return 0; | ||
89 | |||
90 | *_y = f2fp(yf); | ||
91 | *_slope = f2fp(sf); | ||
92 | return 1; | ||
93 | } | ||
94 | |||
95 | 69 | ||
96 | #define OPTSTR "p:c:a:w:" | 70 | #define OPTSTR "p:c:a:" |
97 | 71 | ||
98 | int main(int argc, char** argv) | 72 | int main(int argc, char** argv) |
99 | { | 73 | { |
@@ -107,13 +81,7 @@ int main(int argc, char** argv) | |||
107 | 81 | ||
108 | int adaptive = 0; | 82 | int adaptive = 0; |
109 | unsigned int level = 0; | 83 | unsigned int level = 0; |
110 | service_level_t slevel[MAX_SERVICE_LEVELS]; | 84 | service_level_t slevel[MAX_SERVICE_LEVELS]; |
111 | fp_t wt_y; /* weight-transfer y intercept */ | ||
112 | fp_t wt_slope; /* weight-transfer slope */ | ||
113 | |||
114 | |||
115 | wt_y = f2fp(0.0); | ||
116 | wt_slope = f2fp(1.0); | ||
117 | 85 | ||
118 | while ((opt = getopt(argc, argv, OPTSTR)) != -1) { | 86 | while ((opt = getopt(argc, argv, OPTSTR)) != -1) { |
119 | switch (opt) { | 87 | switch (opt) { |
@@ -124,10 +92,6 @@ int main(int argc, char** argv) | |||
124 | if (!parse_service_level(slevel + level++, optarg)) | 92 | if (!parse_service_level(slevel + level++, optarg)) |
125 | usage("Bad service level."); | 93 | usage("Bad service level."); |
126 | break; | 94 | break; |
127 | case 'w': | ||
128 | if (!parse_wt(&wt_y, &wt_slope, optarg)) | ||
129 | usage("Bad weight transfer function."); | ||
130 | break; | ||
131 | case 'p': | 95 | case 'p': |
132 | cpu = atoi(optarg); | 96 | cpu = atoi(optarg); |
133 | break; | 97 | break; |
@@ -169,8 +133,7 @@ int main(int argc, char** argv) | |||
169 | usage("Arguments missing."); | 133 | usage("Arguments missing."); |
170 | info.exec_path = argv[optind]; | 134 | info.exec_path = argv[optind]; |
171 | info.argv = argv + optind; | 135 | info.argv = argv + optind; |
172 | ret = create_adaptive_rt_task(launch, &info, level, slevel, | 136 | ret = create_adaptive_rt_task(launch, &info, level, slevel); |
173 | wt_y, wt_slope); | ||
174 | } | 137 | } |
175 | 138 | ||
176 | 139 | ||