aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBjoern B. Brandenburg <bbb@cs.unc.edu>2007-10-08 20:44:26 -0400
committerBjoern B. Brandenburg <bbb@cs.unc.edu>2007-10-08 20:44:26 -0400
commite7869361400ef89ae169c1acf17296b7ada47cc8 (patch)
tree7beb6e7071dcfdb3b4c00425653bf350ff66b517 /src
parent52037de5606d863f00c3ccb9d872fd3bc7815453 (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.c16
-rw-r--r--src/rt_launch.c57
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
12int set_service_levels(pid_t pid, 12int 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)
28struct adaptive_param { 26struct 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
35int setup_adaptive(int pid, struct adaptive_param* arg) 31int 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
41int create_adaptive_rt_task(rt_fn_t rt_prog, void *arg, 36int 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
24void usage(char *error) { 24void 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 */
71static 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
98int main(int argc, char** argv) 72int 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