From edfb01f94b56fcc3e3bc7098e233fcbbb862b462 Mon Sep 17 00:00:00 2001 From: leochanj105 Date: Thu, 28 Oct 2021 11:15:36 -0400 Subject: fix stitch and loc, added flush --- extra.h | 102 ++++++++++++++++++++++++---------------------------------------- 1 file changed, 38 insertions(+), 64 deletions(-) (limited to 'extra.h') diff --git a/extra.h b/extra.h index fce8c3f..9da536d 100644 --- a/extra.h +++ b/extra.h @@ -30,7 +30,7 @@ extern int sched_getcpu(); #endif // This is a proxy for "case study mode" now -#define LITMUS 0 +#define LITMUS 0 #define MMDC_PROF 0 #if LITMUS @@ -60,6 +60,8 @@ int _rt_core; int _rt_will_output; struct timespec _rt_start, _rt_end; +int first_job; + char *_rt_run_id; char *_rt_our_prog_name; char *_rt_other_prog_name; @@ -78,10 +80,10 @@ char _rt_shm_name[_ID_SZ] = "/_libextra_barrier-"; #if LITMUS lt_t _rt_period; +int _rt_crit; lt_t _rt_phase; lt_t _rt_cost; lt_t _rt_deadline; -int _rt_crit; struct control_page *_rt_cp; #endif @@ -108,7 +110,7 @@ static void _rt_load_params_itrl(int argc, char **argv) { #if LITMUS fprintf(stderr, " in ms\n"); fprintf(stderr, " 0 for Level-A, 1 for Level-B, 2 for Level-C\n"); - fprintf(stderr, " in ms\n"); + fprintf(stderr, " in ms\n"); fprintf(stderr, " in ms\n"); fprintf(stderr, " in ms\n"); #endif /* LITMUS */ @@ -150,19 +152,23 @@ static void _rt_load_params_itrl(int argc, char **argv) { fprintf(stderr, "Run ID is too large! Keep it to less than %d characters.\n", _RT_FILENAME_LEN); exit(1); } -#ifdef PAIRED - // __rt_sem2_name happens to be the longest - if (strlen(pairId) + strlen(_rt_sem2_name) > _ID_SZ) { - fprintf(stderr, "PairID is too long! Maximum length is %ld characters.\n", _ID_SZ - strlen(_rt_sem2_name)); - exit(1); - } _rt_start_time = calloc(_rt_max_jobs * _rt_will_output, sizeof(long long)); _rt_end_time = calloc(_rt_max_jobs * _rt_will_output, sizeof(long long)); - _rt_exec_time = calloc(_rt_max_jobs * _rt_will_output, sizeof(float)); if (!_rt_end_time || !_rt_start_time) { perror("Unable to allocate buffers for execution times"); exit(1); } + _rt_exec_time = calloc(_rt_max_jobs * _rt_will_output, sizeof(float)); + if (!_rt_exec_time) { + perror("Unable to allocate buffer for execution times"); + exit(1); + } +#ifdef PAIRED + // __rt_sem2_name happens to be the longest + if (strlen(pairId) + strlen(_rt_sem2_name) > _ID_SZ) { + fprintf(stderr, "PairID is too long! Maximum length is %ld characters.\n", _ID_SZ - strlen(_rt_sem2_name)); + exit(1); + } // Use PairID to create unique semaphore and shared memory paths strcat(_rt_sem1_name, pairId); strcat(_rt_sem2_name, pairId); @@ -201,16 +207,11 @@ static void _rt_load_params_itrl(int argc, char **argv) { exit(1); } *_rt_barrier = 0; -#else - _rt_start_time = calloc(_rt_max_jobs * _rt_will_output, sizeof(long long)); - _rt_end_time = calloc(_rt_max_jobs * _rt_will_output, sizeof(long long)); - _rt_exec_time = calloc(_rt_max_jobs * _rt_will_output, sizeof(float)); - if (!_rt_exec_time) { - perror("Unable to allocate buffer for execution times"); - exit(1); - } +// #else + #endif /* PAIRED */ _rt_jobs_complete = 0; + first_job = 1; mlockall(MCL_CURRENT || MCL_FUTURE); #if LITMUS _rt_period = ms2ns(strtoul(argv[end], NULL, 10)); @@ -218,7 +219,6 @@ static void _rt_load_params_itrl(int argc, char **argv) { _rt_phase = ms2ns(strtoul(argv[end+2], NULL, 10)); _rt_cost = ms2ns(strtoul(argv[end+3], NULL, 10)); _rt_deadline = ms2ns(strtoul(argv[end+4], NULL, 10)); - // _rt_phase = 0; unsigned int wait = 1; if (be_migrate_to_domain(_rt_core) < 0) { perror("Unable to migrate to specified CPU"); @@ -232,7 +232,6 @@ static void _rt_load_params_itrl(int argc, char **argv) { rt_param.relative_deadline = _rt_deadline; rt_param.phase = _rt_phase; rt_param.priority = LITMUS_LOWEST_PRIORITY; - // rt_param.priority = ns2ms(_rt_phase); rt_param.cls = _rt_crit; rt_param.budget_policy = NO_ENFORCEMENT; rt_param.cpu = _rt_core; @@ -358,21 +357,10 @@ static void _rt_save_job_result() { _rt_end_time[_rt_jobs_complete] = _rt_end.tv_sec; _rt_end_time[_rt_jobs_complete] *= _BILLION; _rt_end_time[_rt_jobs_complete] += _rt_end.tv_nsec; - +// #else _rt_exec_time[_rt_jobs_complete] = _rt_end.tv_sec - _rt_start.tv_sec; _rt_exec_time[_rt_jobs_complete] *= _BILLION; _rt_exec_time[_rt_jobs_complete] += _rt_end.tv_nsec - _rt_start.tv_nsec; -// #else -// _rt_start_time[_rt_jobs_complete] = _rt_start.tv_sec; -// _rt_start_time[_rt_jobs_complete] *= _BILLION; -// _rt_start_time[_rt_jobs_complete] += _rt_start.tv_nsec; -// _rt_end_time[_rt_jobs_complete] = _rt_end.tv_sec; -// _rt_end_time[_rt_jobs_complete] *= _BILLION; -// _rt_end_time[_rt_jobs_complete] += _rt_end.tv_nsec; - -// _rt_exec_time[_rt_jobs_complete] = _rt_end.tv_sec - _rt_start.tv_sec; -// _rt_exec_time[_rt_jobs_complete] *= _BILLION; -// _rt_exec_time[_rt_jobs_complete] += _rt_end.tv_nsec - _rt_start.tv_nsec; // #endif /* PAIRED */ #if MMDC_PROF _rt_mmdc_read[_rt_jobs_complete] = mmdc_res.read_bytes; @@ -439,7 +427,12 @@ out: // Start a job static void _rt_start_loop() { + // Let the first job run before synchrnous release --- make sure we have no further page faults + if(first_job){ + return; + } #if LITMUS + // static lt_t last = 0; if (_rt_jobs_complete == 0) { if(wait_for_ts_release() != 0){ perror("Unable to wait for taskset release"); @@ -451,45 +444,27 @@ static void _rt_start_loop() { perror("Unable to sleep for next period"); } } - // static lt_t last = 0; - // lt_t now = litmus_clock(); - // fprintf(stderr, "current now : %llu\n", now); - // if (now > _rt_cp->deadline) { - // fprintf(stderr, "(%s/%d:%lu) ", _rt_our_prog_name, gettid(), _rt_cp->job_index); - // // if (_rt_crit == 0) - // // fprintf(stderr, "CATASTROPHIC: Level-A"); - // // else if (_rt_crit == 1) - // // fprintf(stderr, "HAZARDOUS: Level-B"); - // // else - // // fprintf(stderr, "MAJOR: Level-C"); - // fprintf(stderr, " tardy %llu ns, " - // "relative tardiness %f\n", - // now - _rt_cp->deadline, - // (now - _rt_cp->deadline) / (double)_rt_period); - // } + // if (last == 0) { // last = now; - // } - // else if (now > last + 60ull * _BILLION && _rt_crit >= 2) { + // } else if (now > last + 60ull * _BILLION && _rt_crit >= 2) { // last = now; // fprintf(stderr, "(%s/%d:%lu) Ping\n", _rt_our_prog_name, gettid(), _rt_cp->job_index); // } - // lt_t now = litmus_clock(); - // if(_rt_jobs_complete != 0){ - // fprintf(stderr, "in start before sleep: release: %llu, deadline: %llu, now: %llu\n", _rt_cp->release ,_rt_cp->deadline, litmus_clock()); - - // fprintf(stderr, "in start after sleep: release: %llu, deadline: %llu, now: %llu\n", _rt_cp->release ,_rt_cp->deadline, litmus_clock()); + // if (sleep_next_period() != 0) { + // perror("Unable to sleep for next period"); // } #else sched_yield(); + // sleep(1); #endif /* LITMUS */ #ifdef PAIRED FIRST_UNLOCK FIRST_LOCK #endif /* PAIRED */ -#if !LITMUS +// #if !LITMUS FLUSH_CACHES -#endif +// #endif #ifdef PAIRED BARRIER_SYNC #endif /* PAIRED */ @@ -503,6 +478,11 @@ static void _rt_start_loop() { // Complete a job static void _rt_stop_loop() { clock_gettime(CLOCK_MONOTONIC, &_rt_end); + // Set first_job == 0 + if(first_job){ + first_job = 0; + return; + } #if MMDC_PROF /* This freezes the profiling and makes results available */ pause_mmdc_profiling(mmdc); @@ -513,16 +493,10 @@ static void _rt_stop_loop() { long long end = _rt_end_time[_rt_jobs_complete]; if (end > _rt_cp->deadline) { fprintf(stderr, "(%s/%d:%lu) ", _rt_our_prog_name, gettid(), _rt_cp->job_index); - // if (_rt_crit == 0) - // fprintf(stderr, "CATASTROPHIC: Level-A"); - // else if (_rt_crit == 1) - // fprintf(stderr, "HAZARDOUS: Level-B"); - // else - // fprintf(stderr, "MAJOR: Level-C"); fprintf(stderr, " tardy %llu ns, " "relative tardiness %f\n", end - _rt_cp->deadline, - (end - _rt_cp->deadline) / (double)_rt_period); + (end - _rt_cp->deadline) / (double)_rt_deadline); } #endif _rt_jobs_complete++; -- cgit v1.2.2