This patchset includes fixes/changes that have been done. These patches mainly fixed some typos or moves code but should not change the behavior of rt-app.
changes from v1: - split style fix patches in smaller ones - clarify some changelogs - remove patches not suitable for this patchset
Those patches are also found in the branch: https://git.linaro.org/people/picheng.chen/rt-app.git fixes_v2
Chris Muller (1): Update thread name
Vincent Guittot (10): fix deadline print format consolidate trace and debug point update .gitignore fix inconsistency in delay unit fix cpu affinity string info deadline: set deadline field to deadline parameter reorder the start sequence of threads remove the yaml example as we don't support it remove useless json_object_put rt-app: remove use of deprecated json interface
pi-cheng.chen (9): remove useless space and add blank lines to make the code more readable fix some comments align parameters and indents some style fixes Rename variable to improve readability do not sleep if we have run longer than expected fix debugfs path remove unused function add missed code snip to get deadline parameter
.gitignore | 8 ++ doc/taskset.yml | 53 ------------- src/rt-app.c | 195 +++++++++++++++++++++++++++------------------- src/rt-app_args.c | 57 +++++++------- src/rt-app_parse_config.c | 49 +++++++----- src/rt-app_utils.c | 3 + 6 files changed, 185 insertions(+), 180 deletions(-) delete mode 100644 doc/taskset.yml
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app.c | 19 ++++++++++++++++++- src/rt-app_args.c | 7 +++++-- src/rt-app_parse_config.c | 2 +- src/rt-app_utils.c | 3 +++ 4 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/src/rt-app.c b/src/rt-app.c index 3c293e7..ee26a3f 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -27,6 +27,7 @@ static volatile int continue_running; static pthread_t *threads; static int nthreads; rtapp_options_t opts; + static ftrace_data_t ft_data = { .debugfs = "/debug", .trace_fd = -1, @@ -108,6 +109,7 @@ shutdown(int sig) { pthread_join(threads[i], NULL); } + if (opts.ftrace) { log_notice("stopping ftrace"); log_ftrace(ft_data.marker_fd, "main ends\n"); @@ -115,6 +117,7 @@ shutdown(int sig) close(ft_data.trace_fd); close(ft_data.marker_fd); } + exit(EXIT_SUCCESS); }
@@ -194,6 +197,7 @@ void *thread_body(void *arg) ); data->lock_pages = 0; /* forced off for SCHED_OTHER */ break; + #ifdef AQUOSA case aquosa: fprintf(data->log_handler, "# Policy : AQUOSA\n"); @@ -201,11 +205,12 @@ void *thread_body(void *arg) data->params.Q = round((timespec_to_usec(&data->max_et) * (( 100.0 + data->sched_prio ) / 100)) / (data->fragment * 1.0)); data->params.P = round(timespec_to_usec(&data->period) / (data->fragment * 1.0)); data->params.flags = 0; + log_notice("[%d] Creating QRES Server with Q=%ld, P=%ld", data->ind,data->params.Q, data->params.P);
qos_chk_ok_exit(qres_init()); - qos_chk_ok_exit(qres_create_server(&data->params, + qos_chk_ok_exit(qres_create_server(&data->params, &data->sid)); log_notice("[%d] AQuoSA server ID: %d", data->ind, data->sid); log_notice("[%d] attaching thread (deadline: %lu) to server %d", @@ -217,6 +222,7 @@ void *thread_body(void *arg)
break; #endif + #ifdef DLSCHED case deadline: fprintf(data->log_handler, "# Policy : SCHED_DEADLINE\n"); @@ -262,6 +268,7 @@ void *thread_body(void *arg) NULL); log_notice("[%d] Starting...", data->ind); } + /* if we know the duration we can calculate how many periods we will * do at most, and the log to memory, instead of logging to file. */ @@ -315,6 +322,7 @@ void *thread_body(void *arg)
if (opts.ftrace) log_ftrace(ft_data.marker_fd, "[%d] begins loop %d", data->ind, i); + clock_gettime(CLOCK_MONOTONIC, &t_start); run(data->ind, &data->min_et, &data->max_et, data->blockages, data->nblockages); @@ -328,6 +336,7 @@ void *thread_body(void *arg) curr_timing = &timings[i]; else curr_timing = &tmp_timing; + curr_timing->ind = data->ind; curr_timing->period = timespec_to_usec(&data->period); curr_timing->min_et = timespec_to_usec(&data->min_et); @@ -339,6 +348,7 @@ void *thread_body(void *arg) curr_timing->deadline = timespec_to_usec(&data->deadline); curr_timing->duration = timespec_to_usec(&t_diff); curr_timing->slack = timespec_to_lusec(&t_slack); + #ifdef AQUOSA if (data->sched_policy == aquosa) { curr_timing->budget = data->params.Q; @@ -359,9 +369,11 @@ void *thread_body(void *arg)
t_next = timespec_add(&t_next, &data->period); data->deadline = timespec_add(&data->deadline, &data->period); + if (opts.ftrace) log_ftrace(ft_data.marker_fd, "[%d] end loop %d", data->ind, i); + if (curr_timing->slack < 0 && opts.die_on_dmiss) { log_critical("[%d] DEADLINE MISS !!!", data->ind); if (opts.ftrace) @@ -393,12 +405,14 @@ exit_miss: log_ftrace(ft_data.marker_fd, "[%d] exiting", data->ind); log_notice("[%d] Exiting.", data->ind); fclose(data->log_handler); + #ifdef AQUOSA if (data->sched_policy == aquosa) { qres_destroy_server(data->sid); qres_cleanup(); } #endif + pthread_exit(NULL); }
@@ -466,12 +480,14 @@ int main(int argc, char* argv[]) } else { tdata->wait_before_start = 0; } + tdata->duration = opts.duration; tdata->main_app_start = t_start; tdata->lock_pages = opts.lock_pages; #ifdef AQUOSA tdata->fragment = opts.fragment; #endif + if (opts.logdir) { snprintf(tmp, PATH_LENGTH, "%s/%s-%s.log", opts.logdir, @@ -528,6 +544,7 @@ int main(int argc, char* argv[]) else fprintf(gnuplot_script, ", "); } + fprintf(gnuplot_script, "set terminal wxt\nreplot\n"); fclose(gnuplot_script);
diff --git a/src/rt-app_args.c b/src/rt-app_args.c index 36e7e51..b7dcb21 100644 --- a/src/rt-app_args.c +++ b/src/rt-app_args.c @@ -81,6 +81,7 @@ parse_thread_args(char *arg, int idx, thread_data_t *tdata, policy_t def_policy) token = strtok(str, ":"); tdata->name = malloc(sizeof(char) * 5); tdata->ind = idx; + /* default name for command line threads */ snprintf(tdata->name, 1, "t%d", tdata->ind); tdata->sched_prio = DEFAULT_THREAD_PRIORITY; @@ -173,6 +174,7 @@ parse_thread_args(char *arg, int idx, thread_data_t *tdata, policy_t def_policy) } token = strtok(NULL, ":"); } + if ( i < 2 ) { printf("Period and exec time are mandatory\n"); exit(EXIT_INV_COMMANDLINE); @@ -224,6 +226,7 @@ parse_command_line_options(int argc, char **argv, rtapp_options_t *opts) #ifdef AQUOSA opts->fragment = 1; #endif + static struct option long_options[] = { {"help", 0, 0, 'h'}, {"fifo", 0, 0, 'f'}, @@ -337,10 +340,9 @@ parse_command_line_options(int argc, char **argv, rtapp_options_t *opts) default: log_error("Invalid option %c", ch); usage(NULL, EXIT_INV_COMMANDLINE); - } - } + if ( opts->nthreads < 1) usage("You have to set parameters for at least one thread", EXIT_INV_COMMANDLINE); @@ -363,6 +365,7 @@ parse_command_line(int argc, char **argv, rtapp_options_t *opts) return; } #endif + parse_command_line_options(argc, argv, opts); opts->resources = NULL; opts->nresources = 0; diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index 4d8bff8..0f99c3b 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -246,7 +246,6 @@ serialize_acl(rtapp_resource_access_list_t **acl, /* recurse on the rest of resources */ serialize_acl(&(*acl), next_idx, task_resources, resources); } - }
static void @@ -286,6 +285,7 @@ parse_thread_resources(const rtapp_options_t *opts, struct json_object *locks, last = tmp; tmp = tmp->next; } while (tmp != NULL); + /* move first element to list end */ if (last != head) { data->blockages[i].acl = head->next; diff --git a/src/rt-app_utils.c b/src/rt-app_utils.c index 0c08f02..9719053 100644 --- a/src/rt-app_utils.c +++ b/src/rt-app_utils.c @@ -224,17 +224,20 @@ void ftrace_write(int mark_fd, const char *fmt, ...) va_start(ap, fmt); n = vsnprintf(tmp, BUF_SIZE, fmt, ap); va_end(ap); + /* If it worked return success */ if (n > -1 && n < size) { write(mark_fd, tmp, n); free(tmp); return; } + /* Else try again with more space */ if (n > -1) /* glibc 2.1 */ size = n+1; else /* glibc 2.0 */ size *= 2; + if ((ntmp = realloc(tmp, size)) == NULL) { free(tmp); log_error("Cannot reallocate ftrace buffer");
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app.c | 21 +++++++++++++-------- src/rt-app_parse_config.c | 6 ++++-- 2 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/src/rt-app.c b/src/rt-app.c index ee26a3f..e1604b5 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -53,16 +53,16 @@ void run(int ind, struct timespec *min, struct timespec *max, rtapp_tasks_resource_list_t *blockages, int nblockages) { int i; - //int m = max_run(timespec_to_msec(min), timespec_to_msec(max)); - //struct timespec t_start, t_step, t_exec = msec_to_timespec(m); struct timespec t_start, now, t_exec, t_totexec = *max; rtapp_resource_access_list_t *lock, *last;
- /* get the start time */ + /* Get the start time */ clock_gettime(CLOCK_THREAD_CPUTIME_ID, &t_start);
for (i = 0; i < nblockages; i++) { + + /* Lock resources */ lock = blockages[i].acl; while (lock != NULL) { log_debug("[%d] locking %d", ind, lock->res->index); @@ -74,6 +74,8 @@ void run(int ind, struct timespec *min, struct timespec *max, last = lock; lock = lock->next; } + + /* Busy wait */ clock_gettime(CLOCK_THREAD_CPUTIME_ID, &now); t_exec = timespec_add(&now, &blockages[i].usage); log_debug("[%d] busywait for %lu", ind, timespec_to_usec(&blockages[i].usage)); @@ -82,6 +84,8 @@ void run(int ind, struct timespec *min, struct timespec *max, "[%d] busywait for %d", ind, timespec_to_usec(&blockages[i].usage)); busywait(&t_exec); + + /* Unlock resources */ lock = last; while (lock != NULL) { log_debug("[%d] unlocking %d", ind, lock->res->index); @@ -94,7 +98,7 @@ void run(int ind, struct timespec *min, struct timespec *max, } }
- /* compute finish time for CPUTIME_ID clock */ + /* Compute finish time for CPUTIME_ID clock */ t_exec = timespec_add(&t_start, &t_totexec); busywait(&t_exec); } @@ -188,6 +192,9 @@ void *thread_body(void *arg)
case other: fprintf(data->log_handler, "# Policy : SCHED_OTHER\n"); + + /* add priority setting */ + log_notice("[%d] starting thread with period: %lu, exec: %lu," "deadline: %lu", data->ind, @@ -416,9 +423,6 @@ exit_miss: pthread_exit(NULL); }
-/* parse a thread token in the form $period:$exec:$deadline:$policy:$prio and - * fills the thread_data structure - */
int main(int argc, char* argv[]) { @@ -430,6 +434,7 @@ int main(int argc, char* argv[])
parse_command_line(argc, argv, &opts);
+ /* allocated threads */ nthreads = opts.nthreads; threads = malloc(nthreads * sizeof(pthread_t));
@@ -439,7 +444,7 @@ int main(int argc, char* argv[]) signal(SIGHUP, shutdown); signal(SIGINT, shutdown);
- /* if using ftrace open trace and marker fds */ + /* if using ftrace, open trace and marker fds */ if (opts.ftrace) { log_notice("configuring ftrace"); strcpy(tmp, ft_data.debugfs); diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index 0f99c3b..5ca684b 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -502,8 +502,10 @@ get_opts_from_json_object(struct json_object *root, rtapp_options_t *opts) void parse_config_stdin(rtapp_options_t *opts) { - /* read from stdin until EOF, write to temp file and parse - * as a "normal" config file */ + /* + * Read from stdin until EOF, write to temp file and parse + * as a "normal" config file + */ size_t in_length; char buf[JSON_FILE_BUF_SIZE]; struct json_object *js;
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app.c | 73 ++++++++++++++++++++++++----------------------- src/rt-app_args.c | 43 ++++++++++++++-------------- src/rt-app_parse_config.c | 2 +- 3 files changed, 60 insertions(+), 58 deletions(-)
diff --git a/src/rt-app.c b/src/rt-app.c index e1604b5..a7c1d97 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -181,13 +181,12 @@ void *thread_body(void *arg) }
log_notice("[%d] starting thread with period: %lu, exec: %lu," - "deadline: %lu, priority: %d", - data->ind, - timespec_to_usec(&data->period), - timespec_to_usec(&data->min_et), - timespec_to_usec(&data->deadline), - data->sched_prio - ); + "deadline: %lu, priority: %d", + data->ind, + timespec_to_usec(&data->period), + timespec_to_usec(&data->min_et), + timespec_to_usec(&data->deadline), + data->sched_prio); break;
case other: @@ -196,37 +195,39 @@ void *thread_body(void *arg) /* add priority setting */
log_notice("[%d] starting thread with period: %lu, exec: %lu," - "deadline: %lu", - data->ind, - timespec_to_usec(&data->period), - timespec_to_usec(&data->min_et), - timespec_to_usec(&data->deadline) - ); + "deadline: %lu", + data->ind, + timespec_to_usec(&data->period), + timespec_to_usec(&data->min_et), + timespec_to_usec(&data->deadline)); + data->lock_pages = 0; /* forced off for SCHED_OTHER */ break;
#ifdef AQUOSA case aquosa: fprintf(data->log_handler, "# Policy : AQUOSA\n"); - data->params.Q_min = round((timespec_to_usec(&data->min_et) * (( 100.0 + data->sched_prio ) / 100)) / (data->fragment * 1.0)); - data->params.Q = round((timespec_to_usec(&data->max_et) * (( 100.0 + data->sched_prio ) / 100)) / (data->fragment * 1.0)); - data->params.P = round(timespec_to_usec(&data->period) / (data->fragment * 1.0)); + data->params.Q_min = round((timespec_to_usec(&data->min_et) + * (( 100.0 + data->sched_prio ) / 100)) / (data->fragment * 1.0)); + data->params.Q = round((timespec_to_usec(&data->max_et) + * (( 100.0 + data->sched_prio ) / 100)) / (data->fragment * 1.0)); + data->params.P = round(timespec_to_usec(&data->period) + / (data->fragment * 1.0)); data->params.flags = 0;
log_notice("[%d] Creating QRES Server with Q=%ld, P=%ld", - data->ind,data->params.Q, data->params.P); + data->ind,data->params.Q, data->params.P);
qos_chk_ok_exit(qres_init()); qos_chk_ok_exit(qres_create_server(&data->params, &data->sid)); log_notice("[%d] AQuoSA server ID: %d", data->ind, data->sid); log_notice("[%d] attaching thread (deadline: %lu) to server %d", - data->ind, - timespec_to_usec(&data->deadline), - data->sid - ); - qos_chk_ok_exit(qres_attach_thread(data->sid, 0, 0)); + data->ind, + timespec_to_usec(&data->deadline), + data->sid);
+ qos_chk_ok_exit(qres_attach_thread(data->sid, 0, 0)); break; #endif
@@ -239,16 +240,16 @@ void *thread_body(void *arg) attr.sched_policy = SCHED_DEADLINE; attr.sched_priority = 0; attr.sched_runtime = timespec_to_nsec(&data->max_et) + - (timespec_to_nsec(&data->max_et) /100) * BUDGET_OVERP; + (timespec_to_nsec(&data->max_et) /100) * BUDGET_OVERP; attr.sched_deadline = timespec_to_nsec(&data->period); attr.sched_period = timespec_to_nsec(&data->period); - break; #endif
default: log_error("Unknown scheduling policy %d", - data->sched_policy); + data->sched_policy); + exit(EXIT_FAILURE); }
@@ -282,9 +283,9 @@ void *thread_body(void *arg) timings = NULL; if (data->duration > 0) { my_duration_usec = (data->duration * 10e6) - - (data->wait_before_start * 1000); + (data->wait_before_start * 1000); nperiods = (int) ceil( my_duration_usec / - (double) timespec_to_usec(&data->period)); + (double) timespec_to_usec(&data->period)); timings = malloc ( nperiods * sizeof(timing_point_t)); }
@@ -293,19 +294,19 @@ void *thread_body(void *arg) "\tBudget\tUsed Budget\n");
#ifdef DLSCHED + /* TODO find a better way to handle that constraint */ /* * Set the task to SCHED_DEADLINE as far as possible touching its * budget as little as possible for the first iteration. */ if (data->sched_policy == SCHED_DEADLINE) { log_notice("[%d] starting thread with period: %lu, exec: %lu," - "deadline: %lu, priority: %d", - data->ind, - attr.sched_period / 1000, - attr.sched_runtime / 1000, - attr.sched_deadline / 1000, - attr.sched_priority - ); + "deadline: %lu, priority: %d", + data->ind, + attr.sched_period / 1000, + attr.sched_runtime / 1000, + attr.sched_deadline / 1000, + attr.sched_priority);
ret = sched_setattr(tid, &attr, flags); if (ret != 0) { @@ -363,7 +364,7 @@ void *thread_body(void *arg) &abs_used_budget, NULL); curr_timing->used_budget = - abs_used_budget - prev_abs_used_budget; + abs_used_budget - prev_abs_used_budget; prev_abs_used_budget = abs_used_budget;
} else { @@ -554,7 +555,7 @@ int main(int argc, char* argv[]) fclose(gnuplot_script);
snprintf(tmp, PATH_LENGTH, "%s/%s-slack.plot", - opts.logdir, opts.logbasename); + opts.logdir, opts.logbasename); gnuplot_script = fopen(tmp, "w+"); snprintf(tmp, PATH_LENGTH, "%s-slack.eps", opts.logbasename); diff --git a/src/rt-app_args.c b/src/rt-app_args.c index b7dcb21..cda1034 100644 --- a/src/rt-app_args.c +++ b/src/rt-app_args.c @@ -28,7 +28,7 @@ usage (const char* msg, int ex_code) "rt-app <taskset.json>\nOR\n"); #endif printf("rt-app [options] -t <period>:<exec>[:policy" - "[:CPU affinity[:prio[:deadline]]]] -t ...\n\n"); + "[:CPU affinity[:prio[:deadline]]]] -t ...\n\n"); printf("-h, --help\t\t:\tshow this help\n"); printf("-f, --fifo\t\t:\tset default policy for threads to SCHED_FIFO\n"); printf("-r, --rr\t\t:\tset default policy fior threads to SCHED_RR\n"); @@ -228,24 +228,25 @@ parse_command_line_options(int argc, char **argv, rtapp_options_t *opts) #endif
static struct option long_options[] = { - {"help", 0, 0, 'h'}, - {"fifo", 0, 0, 'f'}, - {"rr", 0, 0, 'r'}, - {"thread", 1, 0, 't'}, - {"spacing", 1, 0, 's'}, - {"logdir", 1, 0, 'l'}, - {"baselog", 1, 0, 'b'}, - {"gnuplot", 1, 0, 'G'}, - {"duration", 1, 0, 'D'}, - {"ftrace", 0, 0, 'T'}, - {"pi_enabled", 0, 0, 'T'}, - {"die_on_dmiss", 0, 0, 'M'}, + {"help", 0, 0, 'h'}, + {"fifo", 0, 0, 'f'}, + {"rr", 0, 0, 'r'}, + {"thread", 1, 0, 't'}, + {"spacing", 1, 0, 's'}, + {"logdir", 1, 0, 'l'}, + {"baselog", 1, 0, 'b'}, + {"gnuplot", 1, 0, 'G'}, + {"duration", 1, 0, 'D'}, + {"ftrace", 0, 0, 'T'}, + {"pi_enabled", 0, 0, 'T'}, + {"die_on_dmiss", 0, 0, 'M'}, #ifdef AQUOSA - {"qos", 0, 0, 'q'}, - {"frag",1, 0, 'g'}, + {"qos", 0, 0, 'q'}, + {"frag",1, 0, 'g'}, #endif - {0, 0, 0, 0} - }; + {0, 0, 0, 0} + }; + #ifdef AQUOSA while (( ch = getopt_long(argc,argv,"D:GKhfrb:s:l:qg:t:TM", long_options, &longopt_idx)) != -1) @@ -293,13 +294,13 @@ parse_command_line_options(int argc, char **argv, rtapp_options_t *opts) if (opts->nthreads > 0) { opts->threads_data = realloc( - opts->threads_data, - (opts->nthreads+1) * \ + opts->threads_data, + (opts->nthreads+1) * \ sizeof(thread_data_t)); } parse_thread_args(optarg, opts->nthreads, - &opts->threads_data[opts->nthreads], - opts->policy); + &opts->threads_data[opts->nthreads], + opts->policy); opts->nthreads++; break; case 'G': diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index 5ca684b..fde6f9e 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -318,7 +318,7 @@ parse_thread_resources(const rtapp_options_t *opts, struct json_object *locks, data->blockages[i].usage = usec_to_timespec(usage_usec); } log_info(PIN "res %d, usage: %d acl: %s", cur_res_idx, - usage_usec, debug_msg); + usage_usec, debug_msg); } }
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app.c | 20 ++++++++------------ src/rt-app_args.c | 7 ++++--- src/rt-app_parse_config.c | 7 ++++--- 3 files changed, 16 insertions(+), 18 deletions(-)
diff --git a/src/rt-app.c b/src/rt-app.c index a7c1d97..3515027 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -474,8 +474,7 @@ int main(int argc, char* argv[]) clock_gettime(CLOCK_MONOTONIC, &t_start);
/* start threads */ - for (i = 0; i < nthreads; i++) - { + for (i = 0; i < nthreads; i++) { tdata = &opts.threads_data[i]; if (opts.spacing > 0 ) { /* start the thread, then it will sleep accordingly @@ -500,7 +499,7 @@ int main(int argc, char* argv[]) opts.logbasename, tdata->name); tdata->log_handler = fopen(tmp, "w"); - if (!tdata->log_handler){ + if (!tdata->log_handler) { log_error("Cannot open logfile %s", tmp); exit(EXIT_FAILURE); } @@ -516,8 +515,7 @@ int main(int argc, char* argv[]) }
/* print gnuplot files */ - if (opts.logdir && opts.gnuplot) - { + if (opts.logdir && opts.gnuplot) { snprintf(tmp, PATH_LENGTH, "%s/%s-duration.plot", opts.logdir, opts.logbasename); gnuplot_script = fopen(tmp, "w+"); @@ -533,8 +531,7 @@ int main(int argc, char* argv[]) "set ylabel "Exec Time [usec]"\n" "plot ", tmp);
- for (i=0; i<nthreads; i++) - { + for (i=0; i<nthreads; i++) { snprintf(tmp, PATH_LENGTH, "%s/%s-duration.plot", opts.logdir, opts.logbasename);
@@ -570,8 +567,7 @@ int main(int argc, char* argv[]) "set ylabel "Slack/Tardiness [usec]"\n" "plot ", tmp);
- for (i=0; i < nthreads; i++) - { + for (i=0; i < nthreads; i++) { fprintf(gnuplot_script, ""%s-%s.log" u ($5/1000):10 w l" " title "thread [%s] (%s)"", @@ -585,19 +581,19 @@ int main(int argc, char* argv[]) fprintf(gnuplot_script, ", ");
} + fprintf(gnuplot_script, "set terminal wxt\nreplot\n"); fclose(gnuplot_script); }
- if (opts.duration > 0) - { + if (opts.duration > 0) { sleep(opts.duration); if (opts.ftrace) log_ftrace(ft_data.marker_fd, "main shutdown\n"); shutdown(SIGTERM); }
- for (i = 0; i < nthreads; i++) { + for (i = 0; i < nthreads; i++) { pthread_join(threads[i], NULL); }
diff --git a/src/rt-app_args.c b/src/rt-app_args.c index cda1034..fa2c646 100644 --- a/src/rt-app_args.c +++ b/src/rt-app_args.c @@ -354,14 +354,15 @@ void parse_command_line(int argc, char **argv, rtapp_options_t *opts) { #ifdef JSON + struct stat config_file_stat; + if (argc < 2) usage(NULL, EXIT_SUCCESS); - struct stat config_file_stat; + if (stat(argv[1], &config_file_stat) == 0) { parse_config(argv[1], opts); return; - } - else if (strcmp(argv[1], "-") == 0) { + } else if (strcmp(argv[1], "-") == 0) { parse_config_stdin(opts); return; } diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index fde6f9e..85aa14f 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -260,10 +260,11 @@ parse_thread_resources(const rtapp_options_t *opts, struct json_object *locks, rtapp_resource_access_list_t *tmp, *head, *last; char debug_msg[512], tmpmsg[512];
- data->blockages = malloc(sizeof(rtapp_tasks_resource_list_t) * - json_object_array_length(locks)); data->nblockages = json_object_array_length(locks); - for (i = 0; i< json_object_array_length(locks); i++) + data->blockages = malloc(sizeof(rtapp_tasks_resource_list_t) * + data->nblockages); + + for (i = 0; i< data->nblockages; i++) { res = json_object_array_get_idx(locks, i); if (!json_object_is_type(res, json_type_int)){
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/src/rt-app.c b/src/rt-app.c index 3515027..ffd3494 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -129,7 +129,7 @@ void *thread_body(void *arg) { thread_data_t *data = (thread_data_t*) arg; struct sched_param param; - struct timespec t, t_next; + struct timespec t_now, t_next; unsigned long t_start_usec; unsigned long my_duration_usec; int nperiods; @@ -267,9 +267,9 @@ void *thread_body(void *arg) if (data->wait_before_start > 0) { log_notice("[%d] Waiting %ld usecs... ", data->ind, data->wait_before_start); - clock_gettime(CLOCK_MONOTONIC, &t); + clock_gettime(CLOCK_MONOTONIC, &t_now); t_next = msec_to_timespec(data->wait_before_start); - t_next = timespec_add(&t, &t_next); + t_next = timespec_add(&t_now, &t_next); clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t_next, @@ -321,9 +321,10 @@ void *thread_body(void *arg)
if (opts.ftrace) log_ftrace(ft_data.marker_fd, "[%d] starts", data->ind); - clock_gettime(CLOCK_MONOTONIC, &t); - t_next = t; - data->deadline = timespec_add(&t, &data->deadline); + + clock_gettime(CLOCK_MONOTONIC, &t_now); + t_next = t_now; + data->deadline = timespec_add(&t_now, &data->deadline);
while (continue_running) { struct timespec t_start, t_end, t_diff, t_slack;
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/rt-app.c b/src/rt-app.c index ffd3494..554d024 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -391,7 +391,11 @@ void *thread_body(void *arg) shutdown(SIGTERM); goto exit_miss; } - clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t_next, NULL); + + clock_gettime(CLOCK_MONOTONIC, &t_now); + if (timespec_lower(&t_now, &t_next)) + clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t_next, NULL); + i++; }
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/rt-app.c b/src/rt-app.c index 554d024..0d99056 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -29,7 +29,7 @@ static int nthreads; rtapp_options_t opts;
static ftrace_data_t ft_data = { - .debugfs = "/debug", + .debugfs = "/sys/kernel/debug", .trace_fd = -1, .marker_fd = -1, };
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app.c | 5 ----- 1 file changed, 5 deletions(-)
diff --git a/src/rt-app.c b/src/rt-app.c index 0d99056..9db520a 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -34,11 +34,6 @@ static ftrace_data_t ft_data = { .marker_fd = -1, };
-static inline unsigned int max_run(int min, int max) -{ - return min + (((double) rand()) / RAND_MAX) * (max - min); -} - static inline busywait(struct timespec *to) { struct timespec t_step;
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app_parse_config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index 85aa14f..cd0ddcd 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -364,6 +364,18 @@ parse_thread_data(char *name, struct json_object *obj, int idx, data->min_et = usec_to_timespec(exec); data->max_et = usec_to_timespec(exec);
+ /* deadline */ + dline = get_int_value_from(obj, "deadline", TRUE, period); + if (dline < exec) { + log_critical(PIN2 "Deadline cannot be less than exec time"); + exit(EXIT_INV_CONFIG); + } + if (dline > period) { + log_critical(PIN2 "Deadline cannot be greater than period"); + exit(EXIT_INV_CONFIG); + } + data->deadline = usec_to_timespec(dline); + /* policy */ policy_to_string(opts->policy, def_policy); policy = get_string_value_from(obj, "policy", TRUE, def_policy);
Hi,
On 05/13/2015 04:31 AM, pi-cheng.chen wrote:
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org
src/rt-app_parse_config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index 85aa14f..cd0ddcd 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -364,6 +364,18 @@ parse_thread_data(char *name, struct json_object *obj, int idx, data->min_et = usec_to_timespec(exec); data->max_et = usec_to_timespec(exec);
- /* deadline */
- dline = get_int_value_from(obj, "deadline", TRUE, period);
- if (dline < exec) {
log_critical(PIN2 "Deadline cannot be less than exec time");
exit(EXIT_INV_CONFIG);
- }
- if (dline > period) {
log_critical(PIN2 "Deadline cannot be greater than period");
exit(EXIT_INV_CONFIG);
- }
- data->deadline = usec_to_timespec(dline);
There is already this exact snippet a bit below, after "priority".
Thanks,
- Juri
/* policy */ policy_to_string(opts->policy, def_policy); policy = get_string_value_from(obj, "policy", TRUE, def_policy);
On 27 May 2015 at 10:52, Juri Lelli juri.lelli@arm.com wrote:
Hi,
On 05/13/2015 04:31 AM, pi-cheng.chen wrote:
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org
src/rt-app_parse_config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index 85aa14f..cd0ddcd 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -364,6 +364,18 @@ parse_thread_data(char *name, struct json_object *obj, int idx, data->min_et = usec_to_timespec(exec); data->max_et = usec_to_timespec(exec);
/* deadline */
dline = get_int_value_from(obj, "deadline", TRUE, period);
if (dline < exec) {
log_critical(PIN2 "Deadline cannot be less than exec time");
exit(EXIT_INV_CONFIG);
}
if (dline > period) {
log_critical(PIN2 "Deadline cannot be greater than period");
exit(EXIT_INV_CONFIG);
}
data->deadline = usec_to_timespec(dline);
There is already this exact snippet a bit below, after "priority".
Pi-Cheng,
Can you point the original sha1 ? I can't find it in g.l.o to try to understand the duplication
Regards, Vincent
Thanks,
- Juri
/* policy */ policy_to_string(opts->policy, def_policy); policy = get_string_value_from(obj, "policy", TRUE, def_policy);
On Thu, May 28, 2015 at 7:04 PM, Vincent Guittot vincent.guittot@linaro.org wrote:
On 27 May 2015 at 10:52, Juri Lelli juri.lelli@arm.com wrote:
Hi,
On 05/13/2015 04:31 AM, pi-cheng.chen wrote:
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org
src/rt-app_parse_config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index 85aa14f..cd0ddcd 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -364,6 +364,18 @@ parse_thread_data(char *name, struct json_object *obj, int idx, data->min_et = usec_to_timespec(exec); data->max_et = usec_to_timespec(exec);
/* deadline */
dline = get_int_value_from(obj, "deadline", TRUE, period);
if (dline < exec) {
log_critical(PIN2 "Deadline cannot be less than exec time");
exit(EXIT_INV_CONFIG);
}
if (dline > period) {
log_critical(PIN2 "Deadline cannot be greater than period");
exit(EXIT_INV_CONFIG);
}
data->deadline = usec_to_timespec(dline);
There is already this exact snippet a bit below, after "priority".
Pi-Cheng,
Can you point the original sha1 ? I can't find it in g.l.o to try to understand the duplication
Hi Vincent,
The original sha1 is 80debd6a5a28b162a69c981c0f42b9ee61777a41 I think I made a mistake when I was cherry-picking this patch and fixing the conflicts. In the original patch, it was not trying to add this code snip but moving the code snip to above the code getting policy instead. Sorry for that.
BTW, do you remember the reason for doing the move?
Best Regards, Pi-Cheng
Regards, Vincent
Thanks,
- Juri
/* policy */ policy_to_string(opts->policy, def_policy); policy = get_string_value_from(obj, "policy", TRUE, def_policy);
On 28 May 2015 at 14:05, Pi-Cheng Chen pi-cheng.chen@linaro.org wrote:
On Thu, May 28, 2015 at 7:04 PM, Vincent Guittot vincent.guittot@linaro.org wrote:
On 27 May 2015 at 10:52, Juri Lelli juri.lelli@arm.com wrote:
Hi,
On 05/13/2015 04:31 AM, pi-cheng.chen wrote:
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org
src/rt-app_parse_config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index 85aa14f..cd0ddcd 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -364,6 +364,18 @@ parse_thread_data(char *name, struct json_object *obj, int idx, data->min_et = usec_to_timespec(exec); data->max_et = usec_to_timespec(exec);
/* deadline */
dline = get_int_value_from(obj, "deadline", TRUE, period);
if (dline < exec) {
log_critical(PIN2 "Deadline cannot be less than exec time");
exit(EXIT_INV_CONFIG);
}
if (dline > period) {
log_critical(PIN2 "Deadline cannot be greater than period");
exit(EXIT_INV_CONFIG);
}
data->deadline = usec_to_timespec(dline);
There is already this exact snippet a bit below, after "priority".
Pi-Cheng,
Can you point the original sha1 ? I can't find it in g.l.o to try to understand the duplication
Hi Vincent,
The original sha1 is 80debd6a5a28b162a69c981c0f42b9ee61777a41 I think I made a mistake when I was cherry-picking this patch and fixing the conflicts. In the original patch, it was not trying to add this code snip but moving the code snip to above the code getting policy instead. Sorry for that.
BTW, do you remember the reason for doing the move?
IIRC, the goal was only to gather the settings of exec time, period time and deadline time in one place
Regards, Vincent
Best Regards, Pi-Cheng
Regards, Vincent
Thanks,
- Juri
/* policy */ policy_to_string(opts->policy, def_policy); policy = get_string_value_from(obj, "policy", TRUE, def_policy);
From: "pi-cheng.chen" pi-cheng.chen@linaro.org
move code snip getting deadline parameter to gather the settings of exec time, period time and deadline time in one place.
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org Signed-off-by: pi-cheng.chen pi-cheng.chen@linaro.org --- src/rt-app_parse_config.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index 85aa14f..3acc1c9 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -364,6 +364,18 @@ parse_thread_data(char *name, struct json_object *obj, int idx, data->min_et = usec_to_timespec(exec); data->max_et = usec_to_timespec(exec);
+ /* deadline */ + dline = get_int_value_from(obj, "deadline", TRUE, period); + if (dline < exec) { + log_critical(PIN2 "Deadline cannot be less than exec time"); + exit(EXIT_INV_CONFIG); + } + if (dline > period) { + log_critical(PIN2 "Deadline cannot be greater than period"); + exit(EXIT_INV_CONFIG); + } + data->deadline = usec_to_timespec(dline); + /* policy */ policy_to_string(opts->policy, def_policy); policy = get_string_value_from(obj, "policy", TRUE, def_policy); @@ -379,18 +391,6 @@ parse_thread_data(char *name, struct json_object *obj, int idx, data->sched_prio = get_int_value_from(obj, "priority", TRUE, DEFAULT_THREAD_PRIORITY);
- /* deadline */ - dline = get_int_value_from(obj, "deadline", TRUE, period); - if (dline < exec) { - log_critical(PIN2 "Deadline cannot be less than exec time"); - exit(EXIT_INV_CONFIG); - } - if (dline > period) { - log_critical(PIN2 "Deadline cannot be greater than period"); - exit(EXIT_INV_CONFIG); - } - data->deadline = usec_to_timespec(dline); - /* cpu set */ cpuset_obj = get_in_object(obj, "cpus", TRUE); if (cpuset_obj) {
From: Vincent Guittot vincent.guittot@linaro.org
use %llu to display 64bits value
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/rt-app.c b/src/rt-app.c index 9db520a..ff40287 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -295,8 +295,8 @@ void *thread_body(void *arg) * budget as little as possible for the first iteration. */ if (data->sched_policy == SCHED_DEADLINE) { - log_notice("[%d] starting thread with period: %lu, exec: %lu," - "deadline: %lu, priority: %d", + log_notice("[%d] starting thread with period: %llu, exec: %llu," + "deadline: %llu, priority: %d", data->ind, attr.sched_period / 1000, attr.sched_runtime / 1000,
From: Vincent Guittot vincent.guittot@linaro.org
Add a trace point for end of run loop
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/src/rt-app.c b/src/rt-app.c index ff40287..958be5f 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -95,6 +95,11 @@ void run(int ind, struct timespec *min, struct timespec *max,
/* Compute finish time for CPUTIME_ID clock */ t_exec = timespec_add(&t_start, &t_totexec); + log_debug("[%d] busywait for %lu", ind, timespec_to_usec(&t_exec)); + if (opts.ftrace) + log_ftrace(ft_data.marker_fd, + "[%d] busywait for %d", + ind, timespec_to_usec(&t_exec)); busywait(&t_exec); }
From: Vincent Guittot vincent.guittot@linaro.org
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- .gitignore | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/.gitignore b/.gitignore index 3097e0a..148b45f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,12 @@ Makefile Makefile.in README aclocal.m4 +*.txt +*.swp +*.patch +cscope.out +ID +TAGS.LST autom4te.cache/ build-aux/ config.log @@ -24,5 +30,7 @@ src/config.h src/config.h.in src/rt-app src/*.o +src/*.txt +src/*.swp src/stamp-h1
From: Vincent Guittot vincent.guittot@linaro.org
json file is filled in usec, the log displays usec but we used the value as a msec duration. fix that and use it as usec unit
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/rt-app.c b/src/rt-app.c index 958be5f..0570627 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -268,7 +268,7 @@ void *thread_body(void *arg) log_notice("[%d] Waiting %ld usecs... ", data->ind, data->wait_before_start); clock_gettime(CLOCK_MONOTONIC, &t_now); - t_next = msec_to_timespec(data->wait_before_start); + t_next = usec_to_timespec(data->wait_before_start); t_next = timespec_add(&t_now, &t_next); clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME,
From: Vincent Guittot vincent.guittot@linaro.org
don't rely on json object data
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app_parse_config.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index cd0ddcd..fc404d6 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -407,8 +407,7 @@ parse_thread_data(char *name, struct json_object *obj, int idx, cpuset_obj = get_in_object(obj, "cpus", TRUE); if (cpuset_obj) { assure_type_is(cpuset_obj, obj, "cpus", json_type_array); - data->cpuset_str = json_object_to_json_string(cpuset_obj); - log_info(PIN "key: cpus %s", data->cpuset_str); + data->cpuset_str = strdup(json_object_to_json_string(cpuset_obj)); data->cpuset = malloc(sizeof(cpu_set_t)); cpuset = json_object_get_array(cpuset_obj); CPU_ZERO(data->cpuset); @@ -420,8 +419,8 @@ parse_thread_data(char *name, struct json_object *obj, int idx, } else { data->cpuset_str = strdup("-"); data->cpuset = NULL; - log_info(PIN "key: cpus %s", data->cpuset_str); } + log_info(PIN "key: cpus %s", data->cpuset_str);
/* resources */ resources = get_in_object(obj, "resources", TRUE);
From: Chris Muller christian.muller@linaro.org
Thread name shall match the thread name from configuration file. The name cannot exceed 16 characters.
Signed-off-by: Chris Muller christian.muller@linaro.org --- src/rt-app.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/src/rt-app.c b/src/rt-app.c index 0570627..3cc2000 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -148,6 +148,12 @@ void *thread_body(void *arg) int ret, i = 0; int j;
+ /* set thread name */ + ret = pthread_setname_np(pthread_self(), data->name); + if (ret != 0) { + perror("pthread_setname_np thread name over 16 characters"); + } + /* set thread affinity */ if (data->cpuset != NULL) {
From: Vincent Guittot vincent.guittot@linaro.org
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/rt-app.c b/src/rt-app.c index 3cc2000..b305e96 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -247,7 +247,7 @@ void *thread_body(void *arg) attr.sched_priority = 0; attr.sched_runtime = timespec_to_nsec(&data->max_et) + (timespec_to_nsec(&data->max_et) /100) * BUDGET_OVERP; - attr.sched_deadline = timespec_to_nsec(&data->period); + attr.sched_deadline = timespec_to_nsec(&data->deadline); attr.sched_period = timespec_to_nsec(&data->period); break; #endif
From: Vincent Guittot vincent.guittot@linaro.org
gather all configuration, init and allocation of the thread and then start the sequence which can start with a wait for a duration
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- src/rt-app.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-)
diff --git a/src/rt-app.c b/src/rt-app.c index b305e96..23a1c03 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -270,19 +270,6 @@ void *thread_body(void *arg) } }
- if (data->wait_before_start > 0) { - log_notice("[%d] Waiting %ld usecs... ", data->ind, - data->wait_before_start); - clock_gettime(CLOCK_MONOTONIC, &t_now); - t_next = usec_to_timespec(data->wait_before_start); - t_next = timespec_add(&t_now, &t_next); - clock_nanosleep(CLOCK_MONOTONIC, - TIMER_ABSTIME, - &t_next, - NULL); - log_notice("[%d] Starting...", data->ind); - } - /* if we know the duration we can calculate how many periods we will * do at most, and the log to memory, instead of logging to file. */ @@ -299,6 +286,20 @@ void *thread_body(void *arg) "\t\tend\t\tdeadline\tdur.\tslack" "\tBudget\tUsed Budget\n");
+ + if (data->wait_before_start > 0) { + log_notice("[%d] Waiting %ld usecs... ", data->ind, + data->wait_before_start); + clock_gettime(CLOCK_MONOTONIC, &t_now); + t_next = usec_to_timespec(data->wait_before_start); + t_next = timespec_add(&t_now, &t_next); + clock_nanosleep(CLOCK_MONOTONIC, + TIMER_ABSTIME, + &t_next, + NULL); + log_notice("[%d] Starting...", data->ind); + } + #ifdef DLSCHED /* TODO find a better way to handle that constraint */ /*
From: Vincent Guittot vincent.guittot@linaro.org
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org --- doc/taskset.yml | 53 ----------------------------------------------------- 1 file changed, 53 deletions(-) delete mode 100644 doc/taskset.yml
diff --git a/doc/taskset.yml b/doc/taskset.yml deleted file mode 100644 index 5483dce..0000000 --- a/doc/taskset.yml +++ /dev/null @@ -1,53 +0,0 @@ -# maybe useless to pre-define resources here. -resources: - - m0 - - m1 - - m2 - - m3 - -tasks: - # task name can be "A", "t0", etc. It will only be used in log names - # and in graphs. - t0: - - exec: 10000 # usec, mandatory - period: 10000 # usec, mandatory - deadline: 8000 # usec, optional, default = $period - cpu: 0,1 # optional, default = - (all) - policy: FIFO # optional, default = $global.default_policy - lock: m1 - resources: - - m1: - - duration : 1000 - t1: - - exec: 50000 - period: 100000 - cpu: 1 - policy: DEADLINE - lock: m0,m3,m2 # optional. direct lock order - resources: - - m0: - - duration: 1000 # usec, mandatory if present in $lock list. - access : m2 # optional, list - - m1: - - duration: 100 - access: m3 - - - m2: - - duration: 200 - access: m1 - - - m3: - - duration: 500 - -global: - # here values are set to their defaults, as an example. - - spacing: 0 # msec, optional - default_policy: OTHER # optional - duration: -1 # seconds, optional, -1 means not ending - gnuplot: false # optional - logdir: null # full/relative path to the directory where to store logs - # by default it is not set, so rt-app logs to stdout - baselog: rt-app # basename for thread logs (needs $lodgir != null) - frag: 1 # fragmentation of resource reservations w.r.t thread $period - # i.e. 2 means thread period is twice as big as RR period. -
From: Vincent Guittot vincent.guittot@linaro.org
futhermore, some object are used several times
Vincent Guittot vincent.guittot@linaro.org --- src/rt-app_parse_config.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index fc404d6..33ea783 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -120,7 +120,6 @@ get_int_value_from(struct json_object *where, set_default_if_needed(key, value, have_def, def_value); assure_type_is(value, where, key, json_type_int); i_value = json_object_get_int(value); - json_object_put(value); log_info(PIN "key: %s, value: %d, type <int>", key, i_value); return i_value; } @@ -137,7 +136,6 @@ get_bool_value_from(struct json_object *where, set_default_if_needed(key, value, have_def, def_value); assure_type_is(value, where, key, json_type_boolean); b_value = json_object_get_boolean(value); - json_object_put(value); log_info(PIN "key: %s, value: %d, type <bool>", key, b_value); return b_value; } @@ -158,7 +156,6 @@ get_string_value_from(struct json_object *where, } assure_type_is(value, where, key, json_type_string); s_value = strdup(json_object_get_string(value)); - json_object_put(value); log_info(PIN "key: %s, value: %s, type <string>", key, s_value); return s_value; } @@ -508,6 +505,7 @@ get_opts_from_json_object(struct json_object *root, rtapp_options_t *opts) parse_global(global, opts); parse_resources(resources, opts); parse_tasks(tasks, opts); + json_object_put(tasks);
}
Hi,
On 05/13/2015 04:32 AM, pi-cheng.chen wrote:
From: Vincent Guittot vincent.guittot@linaro.org
futhermore, some object are used several times
Vincent Guittot vincent.guittot@linaro.org
src/rt-app_parse_config.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index fc404d6..33ea783 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -120,7 +120,6 @@ get_int_value_from(struct json_object *where, set_default_if_needed(key, value, have_def, def_value); assure_type_is(value, where, key, json_type_int); i_value = json_object_get_int(value);
- json_object_put(value); log_info(PIN "key: %s, value: %d, type <int>", key, i_value); return i_value;
} @@ -137,7 +136,6 @@ get_bool_value_from(struct json_object *where, set_default_if_needed(key, value, have_def, def_value); assure_type_is(value, where, key, json_type_boolean); b_value = json_object_get_boolean(value);
- json_object_put(value); log_info(PIN "key: %s, value: %d, type <bool>", key, b_value); return b_value;
} @@ -158,7 +156,6 @@ get_string_value_from(struct json_object *where, } assure_type_is(value, where, key, json_type_string); s_value = strdup(json_object_get_string(value));
- json_object_put(value); log_info(PIN "key: %s, value: %s, type <string>", key, s_value); return s_value;
} @@ -508,6 +505,7 @@ get_opts_from_json_object(struct json_object *root, rtapp_options_t *opts) parse_global(global, opts); parse_resources(resources, opts); parse_tasks(tasks, opts);
- json_object_put(tasks);
Why is this needed here (and not for global and resources too) ?
Thanks,
- Juri
}
Le 27 mai 2015 10:53 AM, "Juri Lelli" juri.lelli@arm.com a écrit :
Hi,
On 05/13/2015 04:32 AM, pi-cheng.chen wrote:
From: Vincent Guittot vincent.guittot@linaro.org
futhermore, some object are used several times
Vincent Guittot vincent.guittot@linaro.org
src/rt-app_parse_config.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index fc404d6..33ea783 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -120,7 +120,6 @@ get_int_value_from(struct json_object *where, set_default_if_needed(key, value, have_def, def_value); assure_type_is(value, where, key, json_type_int); i_value = json_object_get_int(value);
json_object_put(value); log_info(PIN "key: %s, value: %d, type <int>", key, i_value); return i_value;
} @@ -137,7 +136,6 @@ get_bool_value_from(struct json_object *where, set_default_if_needed(key, value, have_def, def_value); assure_type_is(value, where, key, json_type_boolean); b_value = json_object_get_boolean(value);
json_object_put(value); log_info(PIN "key: %s, value: %d, type <bool>", key, b_value); return b_value;
} @@ -158,7 +156,6 @@ get_string_value_from(struct json_object *where, } assure_type_is(value, where, key, json_type_string); s_value = strdup(json_object_get_string(value));
json_object_put(value); log_info(PIN "key: %s, value: %s, type <string>", key, s_value); return s_value;
} @@ -508,6 +505,7 @@ get_opts_from_json_object(struct json_object *root,
rtapp_options_t *opts)
parse_global(global, opts); parse_resources(resources, opts); parse_tasks(tasks, opts);
json_object_put(tasks);
Why is this needed here (and not for global and resources too) ?
IIRC, There are several patches around ref count and memory management of json object. This patch fixes some issues for tasks object and the others objects are solved by other patches
Regards, Vincent
Thanks,
- Juri
}
On Fri, May 29, 2015 at 7:50 PM, Vincent Guittot vincent.guittot@linaro.org wrote:
Le 27 mai 2015 10:53 AM, "Juri Lelli" juri.lelli@arm.com a écrit :
Hi,
On 05/13/2015 04:32 AM, pi-cheng.chen wrote:
From: Vincent Guittot vincent.guittot@linaro.org
futhermore, some object are used several times
Vincent Guittot vincent.guittot@linaro.org
src/rt-app_parse_config.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index fc404d6..33ea783 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -120,7 +120,6 @@ get_int_value_from(struct json_object *where, set_default_if_needed(key, value, have_def, def_value); assure_type_is(value, where, key, json_type_int); i_value = json_object_get_int(value);
json_object_put(value); log_info(PIN "key: %s, value: %d, type <int>", key, i_value); return i_value;
} @@ -137,7 +136,6 @@ get_bool_value_from(struct json_object *where, set_default_if_needed(key, value, have_def, def_value); assure_type_is(value, where, key, json_type_boolean); b_value = json_object_get_boolean(value);
json_object_put(value); log_info(PIN "key: %s, value: %d, type <bool>", key, b_value); return b_value;
} @@ -158,7 +156,6 @@ get_string_value_from(struct json_object *where, } assure_type_is(value, where, key, json_type_string); s_value = strdup(json_object_get_string(value));
json_object_put(value); log_info(PIN "key: %s, value: %s, type <string>", key, s_value); return s_value;
} @@ -508,6 +505,7 @@ get_opts_from_json_object(struct json_object *root, rtapp_options_t *opts) parse_global(global, opts); parse_resources(resources, opts); parse_tasks(tasks, opts);
json_object_put(tasks);
Why is this needed here (and not for global and resources too) ?
IIRC, There are several patches around ref count and memory management of json object. This patch fixes some issues for tasks object and the others objects are solved by other patches
Hi Vincent,
I think this is to fix something in the patch which adds phase feature. The original commit id in linaro branch is: 3bda96e6e6641d9409ae21e83dddc57514ca8a35
So it should be moved to other series and squashed into the new feature.
Best Regards, Pi-Cheng
Regards, Vincent
Thanks,
- Juri
}
On 10/06/15 03:50, Pi-Cheng Chen wrote:
On Fri, May 29, 2015 at 7:50 PM, Vincent Guittot vincent.guittot@linaro.org wrote:
Le 27 mai 2015 10:53 AM, "Juri Lelli" juri.lelli@arm.com a écrit :
Hi,
On 05/13/2015 04:32 AM, pi-cheng.chen wrote:
From: Vincent Guittot vincent.guittot@linaro.org
futhermore, some object are used several times
Vincent Guittot vincent.guittot@linaro.org
src/rt-app_parse_config.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index fc404d6..33ea783 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -120,7 +120,6 @@ get_int_value_from(struct json_object *where, set_default_if_needed(key, value, have_def, def_value); assure_type_is(value, where, key, json_type_int); i_value = json_object_get_int(value);
json_object_put(value); log_info(PIN "key: %s, value: %d, type <int>", key, i_value); return i_value;
} @@ -137,7 +136,6 @@ get_bool_value_from(struct json_object *where, set_default_if_needed(key, value, have_def, def_value); assure_type_is(value, where, key, json_type_boolean); b_value = json_object_get_boolean(value);
json_object_put(value); log_info(PIN "key: %s, value: %d, type <bool>", key, b_value); return b_value;
} @@ -158,7 +156,6 @@ get_string_value_from(struct json_object *where, } assure_type_is(value, where, key, json_type_string); s_value = strdup(json_object_get_string(value));
json_object_put(value); log_info(PIN "key: %s, value: %s, type <string>", key, s_value); return s_value;
} @@ -508,6 +505,7 @@ get_opts_from_json_object(struct json_object *root, rtapp_options_t *opts) parse_global(global, opts); parse_resources(resources, opts); parse_tasks(tasks, opts);
json_object_put(tasks);
Why is this needed here (and not for global and resources too) ?w
IIRC, There are several patches around ref count and memory management of json object. This patch fixes some issues for tasks object and the others objects are solved by other patches
Hi Vincent,
I think this is to fix something in the patch which adds phase feature. The original commit id in linaro branch is: 3bda96e6e6641d9409ae21e83dddc57514ca8a35
So it should be moved to other series and squashed into the new feature.
Ok, I kept this aside for now.
Thanks,
- Juri
Best Regards, Pi-Cheng
Regards, Vincent
Thanks,
- Juri
}
From: Vincent Guittot vincent.guittot@linaro.org
With libjson-c v0.12, json_tokener_errors is no more available. Replace depracated json_object_object_get by json_object_object_get_ex
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org Tested-by: Nicolas Pitre nico@linaro.org --- src/rt-app_parse_config.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index 33ea783..5818efd 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -95,10 +95,10 @@ get_in_object(struct json_object *where, int nullable) { struct json_object *to; - to = json_object_object_get(where, what); - if (!nullable && is_error(to)) { - log_critical(PFX "Error while parsing config:\n" PFL - "%s", json_tokener_errors[-(unsigned long)to]); + json_bool ret; + ret = json_object_object_get_ex(where, what, &to); + if (!nullable && !ret) { + log_critical(PFX "Error while parsing config\n" PFL); exit(EXIT_INV_CONFIG); } if (!nullable && strcmp(json_object_to_json_string(to), "null") == 0) { @@ -486,8 +486,7 @@ get_opts_from_json_object(struct json_object *root, rtapp_options_t *opts) struct json_object *global, *tasks, *resources;
if (is_error(root)) { - log_error(PFX "Error while parsing input JSON: %s", - json_tokener_errors[-(unsigned long)root]); + log_error(PFX "Error while parsing input JSON"); exit(EXIT_INV_CONFIG); } log_info(PFX "Successfully parsed input JSON");
Hi Pi-Cheng,
IMO you should add your own sign-off after each patch since you're the one upstreaming Vincent's code. No need to resend this series just yet. If Juri accepts this patchset then perhaps he can just add it in while importing the code into git.
Regards, Amit
On Wed, May 13, 2015 at 9:01 AM, pi-cheng.chen pi-cheng.chen@linaro.org wrote:
This patchset includes fixes/changes that have been done. These patches mainly fixed some typos or moves code but should not change the behavior of rt-app.
changes from v1:
- split style fix patches in smaller ones
- clarify some changelogs
- remove patches not suitable for this patchset
Those patches are also found in the branch: https://git.linaro.org/people/picheng.chen/rt-app.git fixes_v2
Chris Muller (1): Update thread name
Vincent Guittot (10): fix deadline print format consolidate trace and debug point update .gitignore fix inconsistency in delay unit fix cpu affinity string info deadline: set deadline field to deadline parameter reorder the start sequence of threads remove the yaml example as we don't support it remove useless json_object_put rt-app: remove use of deprecated json interface
pi-cheng.chen (9): remove useless space and add blank lines to make the code more readable fix some comments align parameters and indents some style fixes Rename variable to improve readability do not sleep if we have run longer than expected fix debugfs path remove unused function add missed code snip to get deadline parameter
.gitignore | 8 ++ doc/taskset.yml | 53 ------------- src/rt-app.c | 195 +++++++++++++++++++++++++++------------------- src/rt-app_args.c | 57 +++++++------- src/rt-app_parse_config.c | 49 +++++++----- src/rt-app_utils.c | 3 + 6 files changed, 185 insertions(+), 180 deletions(-) delete mode 100644 doc/taskset.yml
-- 1.9.1
Sched-tools mailing list Sched-tools@lists.linaro.org https://lists.linaro.org/mailman/listinfo/sched-tools
On 13 May 2015 at 07:50, Amit Kucheria amit.kucheria@linaro.org wrote:
Hi Pi-Cheng,
IMO you should add your own sign-off after each patch since you're the one upstreaming Vincent's code. No need to resend this series just
I was thinking exactly the same. Add your signoff on patches that you have modified
yet. If Juri accepts this patchset then perhaps he can just add it in while importing the code into git.
Regards, Amit
On Wed, May 13, 2015 at 9:01 AM, pi-cheng.chen pi-cheng.chen@linaro.org wrote:
This patchset includes fixes/changes that have been done. These patches mainly fixed some typos or moves code but should not change the behavior of rt-app.
changes from v1:
- split style fix patches in smaller ones
- clarify some changelogs
- remove patches not suitable for this patchset
Those patches are also found in the branch: https://git.linaro.org/people/picheng.chen/rt-app.git fixes_v2
Chris Muller (1): Update thread name
Vincent Guittot (10): fix deadline print format consolidate trace and debug point update .gitignore fix inconsistency in delay unit fix cpu affinity string info deadline: set deadline field to deadline parameter reorder the start sequence of threads remove the yaml example as we don't support it remove useless json_object_put rt-app: remove use of deprecated json interface
pi-cheng.chen (9): remove useless space and add blank lines to make the code more readable fix some comments align parameters and indents some style fixes Rename variable to improve readability do not sleep if we have run longer than expected fix debugfs path remove unused function add missed code snip to get deadline parameter
.gitignore | 8 ++ doc/taskset.yml | 53 ------------- src/rt-app.c | 195 +++++++++++++++++++++++++++------------------- src/rt-app_args.c | 57 +++++++------- src/rt-app_parse_config.c | 49 +++++++----- src/rt-app_utils.c | 3 + 6 files changed, 185 insertions(+), 180 deletions(-) delete mode 100644 doc/taskset.yml
-- 1.9.1
Sched-tools mailing list Sched-tools@lists.linaro.org https://lists.linaro.org/mailman/listinfo/sched-tools
On Wed, May 13, 2015 at 2:39 PM, Vincent Guittot vincent.guittot@linaro.org wrote:
On 13 May 2015 at 07:50, Amit Kucheria amit.kucheria@linaro.org wrote:
Hi Pi-Cheng,
IMO you should add your own sign-off after each patch since you're the one upstreaming Vincent's code. No need to resend this series just
I was thinking exactly the same. Add your signoff on patches that you have modified
ok. I will add it in the following rounds.
yet. If Juri accepts this patchset then perhaps he can just add it in while importing the code into git.
Regards, Amit
On Wed, May 13, 2015 at 9:01 AM, pi-cheng.chen pi-cheng.chen@linaro.org wrote:
This patchset includes fixes/changes that have been done. These patches mainly fixed some typos or moves code but should not change the behavior of rt-app.
changes from v1:
- split style fix patches in smaller ones
- clarify some changelogs
- remove patches not suitable for this patchset
Those patches are also found in the branch: https://git.linaro.org/people/picheng.chen/rt-app.git fixes_v2
Chris Muller (1): Update thread name
Vincent Guittot (10): fix deadline print format consolidate trace and debug point update .gitignore fix inconsistency in delay unit fix cpu affinity string info deadline: set deadline field to deadline parameter reorder the start sequence of threads remove the yaml example as we don't support it remove useless json_object_put rt-app: remove use of deprecated json interface
pi-cheng.chen (9): remove useless space and add blank lines to make the code more readable fix some comments align parameters and indents some style fixes Rename variable to improve readability do not sleep if we have run longer than expected fix debugfs path remove unused function add missed code snip to get deadline parameter
.gitignore | 8 ++ doc/taskset.yml | 53 ------------- src/rt-app.c | 195 +++++++++++++++++++++++++++------------------- src/rt-app_args.c | 57 +++++++------- src/rt-app_parse_config.c | 49 +++++++----- src/rt-app_utils.c | 3 + 6 files changed, 185 insertions(+), 180 deletions(-) delete mode 100644 doc/taskset.yml
-- 1.9.1
Sched-tools mailing list Sched-tools@lists.linaro.org https://lists.linaro.org/mailman/listinfo/sched-tools
Hi,
On 13/05/15 08:33, Pi-Cheng Chen wrote:
On Wed, May 13, 2015 at 2:39 PM, Vincent Guittot vincent.guittot@linaro.org wrote:
On 13 May 2015 at 07:50, Amit Kucheria amit.kucheria@linaro.org wrote:
Hi Pi-Cheng,
IMO you should add your own sign-off after each patch since you're the one upstreaming Vincent's code. No need to resend this series just
I was thinking exactly the same. Add your signoff on patches that you have modified
ok. I will add it in the following rounds.
So, I started pulling them, but I then I realized that Amit's and Vincent's views seem to differ a bit :). Do I add Pi-Cheng SOB to all of them or do I wait for an indication of which patches have to have both SOB?
Best,
- Juri
yet. If Juri accepts this patchset then perhaps he can just add it in while importing the code into git.
Regards, Amit
On Wed, May 13, 2015 at 9:01 AM, pi-cheng.chen pi-cheng.chen@linaro.org wrote:
This patchset includes fixes/changes that have been done. These patches mainly fixed some typos or moves code but should not change the behavior of rt-app.
changes from v1:
- split style fix patches in smaller ones
- clarify some changelogs
- remove patches not suitable for this patchset
Those patches are also found in the branch: https://git.linaro.org/people/picheng.chen/rt-app.git fixes_v2
Chris Muller (1): Update thread name
Vincent Guittot (10): fix deadline print format consolidate trace and debug point update .gitignore fix inconsistency in delay unit fix cpu affinity string info deadline: set deadline field to deadline parameter reorder the start sequence of threads remove the yaml example as we don't support it remove useless json_object_put rt-app: remove use of deprecated json interface
pi-cheng.chen (9): remove useless space and add blank lines to make the code more readable fix some comments align parameters and indents some style fixes Rename variable to improve readability do not sleep if we have run longer than expected fix debugfs path remove unused function add missed code snip to get deadline parameter
.gitignore | 8 ++ doc/taskset.yml | 53 ------------- src/rt-app.c | 195 +++++++++++++++++++++++++++------------------- src/rt-app_args.c | 57 +++++++------- src/rt-app_parse_config.c | 49 +++++++----- src/rt-app_utils.c | 3 + 6 files changed, 185 insertions(+), 180 deletions(-) delete mode 100644 doc/taskset.yml
-- 1.9.1
Sched-tools mailing list Sched-tools@lists.linaro.org https://lists.linaro.org/mailman/listinfo/sched-tools
Le 15 mai 2015 6:11 PM, "Juri Lelli" juri.lelli@arm.com a écrit :
Hi,
On 13/05/15 08:33, Pi-Cheng Chen wrote:
On Wed, May 13, 2015 at 2:39 PM, Vincent Guittot vincent.guittot@linaro.org wrote:
On 13 May 2015 at 07:50, Amit Kucheria amit.kucheria@linaro.org
wrote:
Hi Pi-Cheng,
IMO you should add your own sign-off after each patch since you're the one upstreaming Vincent's code. No need to resend this series just
I was thinking exactly the same. Add your signoff on patches that you have modified
ok. I will add it in the following rounds.
So, I started pulling them, but I then I realized that Amit's and Vincent's views seem to differ a bit :). Do I add Pi-Cheng SOB to all of them or do I wait for an indication of which patches have to have both
SOB?
Let make thing simple and add Pi-Cheng SOB on all patches. He has at least picked them and rebased them when he hasn't done more modifications
Regards Vincent
Best,
- Juri
yet. If Juri accepts this patchset then perhaps he can just add it in while importing the code into git.
Regards, Amit
On Wed, May 13, 2015 at 9:01 AM, pi-cheng.chen <
pi-cheng.chen@linaro.org> wrote:
This patchset includes fixes/changes that have been done. These
patches
mainly fixed some typos or moves code but should not change the behavior of rt-app.
changes from v1:
- split style fix patches in smaller ones
- clarify some changelogs
- remove patches not suitable for this patchset
Those patches are also found in the branch: https://git.linaro.org/people/picheng.chen/rt-app.git fixes_v2
Chris Muller (1): Update thread name
Vincent Guittot (10): fix deadline print format consolidate trace and debug point update .gitignore fix inconsistency in delay unit fix cpu affinity string info deadline: set deadline field to deadline parameter reorder the start sequence of threads remove the yaml example as we don't support it remove useless json_object_put rt-app: remove use of deprecated json interface
pi-cheng.chen (9): remove useless space and add blank lines to make the code more readable fix some comments align parameters and indents some style fixes Rename variable to improve readability do not sleep if we have run longer than expected fix debugfs path remove unused function add missed code snip to get deadline parameter
.gitignore | 8 ++ doc/taskset.yml | 53 ------------- src/rt-app.c | 195
+++++++++++++++++++++++++++-------------------
src/rt-app_args.c | 57 +++++++------- src/rt-app_parse_config.c | 49 +++++++----- src/rt-app_utils.c | 3 + 6 files changed, 185 insertions(+), 180 deletions(-) delete mode 100644 doc/taskset.yml
-- 1.9.1
Sched-tools mailing list Sched-tools@lists.linaro.org https://lists.linaro.org/mailman/listinfo/sched-tools
Hi,
On Sat, May 16, 2015 at 12:11 AM, Juri Lelli juri.lelli@arm.com wrote:
Hi,
On 13/05/15 08:33, Pi-Cheng Chen wrote:
On Wed, May 13, 2015 at 2:39 PM, Vincent Guittot vincent.guittot@linaro.org wrote:
On 13 May 2015 at 07:50, Amit Kucheria amit.kucheria@linaro.org wrote:
Hi Pi-Cheng,
IMO you should add your own sign-off after each patch since you're the one upstreaming Vincent's code. No need to resend this series just
I was thinking exactly the same. Add your signoff on patches that you have modified
ok. I will add it in the following rounds.
So, I started pulling them, but I then I realized that Amit's and Vincent's views seem to differ a bit :). Do I add Pi-Cheng SOB to all of them or do I wait for an indication of which patches have to have both SOB?
I've put my SOB on those patches I re-formatted. You can pull them from: https://git.linaro.org/people/picheng.chen/rt-app.git fixes_v3
Best Regards, Pi-Cheng
Best,
- Juri
yet. If Juri accepts this patchset then perhaps he can just add it in while importing the code into git.
Regards, Amit
On Wed, May 13, 2015 at 9:01 AM, pi-cheng.chen pi-cheng.chen@linaro.org wrote:
This patchset includes fixes/changes that have been done. These patches mainly fixed some typos or moves code but should not change the behavior of rt-app.
changes from v1:
- split style fix patches in smaller ones
- clarify some changelogs
- remove patches not suitable for this patchset
Those patches are also found in the branch: https://git.linaro.org/people/picheng.chen/rt-app.git fixes_v2
Chris Muller (1): Update thread name
Vincent Guittot (10): fix deadline print format consolidate trace and debug point update .gitignore fix inconsistency in delay unit fix cpu affinity string info deadline: set deadline field to deadline parameter reorder the start sequence of threads remove the yaml example as we don't support it remove useless json_object_put rt-app: remove use of deprecated json interface
pi-cheng.chen (9): remove useless space and add blank lines to make the code more readable fix some comments align parameters and indents some style fixes Rename variable to improve readability do not sleep if we have run longer than expected fix debugfs path remove unused function add missed code snip to get deadline parameter
.gitignore | 8 ++ doc/taskset.yml | 53 ------------- src/rt-app.c | 195 +++++++++++++++++++++++++++------------------- src/rt-app_args.c | 57 +++++++------- src/rt-app_parse_config.c | 49 +++++++----- src/rt-app_utils.c | 3 + 6 files changed, 185 insertions(+), 180 deletions(-) delete mode 100644 doc/taskset.yml
-- 1.9.1
Sched-tools mailing list Sched-tools@lists.linaro.org https://lists.linaro.org/mailman/listinfo/sched-tools
Hi,
On 13/05/15 04:31, pi-cheng.chen wrote:
This patchset includes fixes/changes that have been done. These patches mainly fixed some typos or moves code but should not change the behavior of rt-app.
I merged the series in
git@github.com:scheduler-tools/rt-app.git master
Thanks a lot for this effort and looking forward for the following series!
Best,
- Juri
changes from v1:
- split style fix patches in smaller ones
- clarify some changelogs
- remove patches not suitable for this patchset
Those patches are also found in the branch: https://git.linaro.org/people/picheng.chen/rt-app.git fixes_v2
Chris Muller (1): Update thread name
Vincent Guittot (10): fix deadline print format consolidate trace and debug point update .gitignore fix inconsistency in delay unit fix cpu affinity string info deadline: set deadline field to deadline parameter reorder the start sequence of threads remove the yaml example as we don't support it remove useless json_object_put rt-app: remove use of deprecated json interface
pi-cheng.chen (9): remove useless space and add blank lines to make the code more readable fix some comments align parameters and indents some style fixes Rename variable to improve readability do not sleep if we have run longer than expected fix debugfs path remove unused function add missed code snip to get deadline parameter
.gitignore | 8 ++ doc/taskset.yml | 53 ------------- src/rt-app.c | 195 +++++++++++++++++++++++++++------------------- src/rt-app_args.c | 57 +++++++------- src/rt-app_parse_config.c | 49 +++++++----- src/rt-app_utils.c | 3 + 6 files changed, 185 insertions(+), 180 deletions(-) delete mode 100644 doc/taskset.yml