diff --git a/kernel/syscall.c b/kernel/syscall.c index 357dd894..69291eef 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -3767,10 +3767,48 @@ unsigned long perf_event_read_value(struct mc_perf_event *event) unsigned long rtn_count = 0; unsigned long pmc_count = 0; int counter_id = event->counter_id; + struct thread *thread = cpu_local_var(current); + unsigned long cur_user_tsc, cur_system_tsc; + if (event->stopped_user_tsc) { + cur_user_tsc = event->stopped_user_tsc; + } + else { + cur_user_tsc = thread->user_tsc; + } + + if (event->stopped_system_tsc) { + cur_system_tsc = event->stopped_system_tsc; + } + else { + cur_system_tsc = thread->system_tsc; + } + + /* -- For use_invariant_tsc -- + * Add sum of counts in the previous start-stop periods to + * the current count in the start-read period + */ if(event->pid == 0) { - pmc_count = ihk_mc_perfctr_value(counter_id, - event->attr.sample_freq); + if (event->use_invariant_tsc) { + if (!event->attr.exclude_user) { + pmc_count += cur_user_tsc - + event->base_user_tsc + + event->user_accum_count; + } + if (!event->attr.exclude_kernel) { + /* Add sum of counts in the previous + * start-stop periods to the current count + * in the start-read period + */ + pmc_count += cur_system_tsc - + event->base_system_tsc + + event->system_accum_count; + } + } + else { + pmc_count = ihk_mc_perfctr_read(counter_id) + + event->attr.sample_freq; + } } rtn_count += event->count + pmc_count; @@ -3787,14 +3825,14 @@ perf_event_read_group(struct mc_perf_event *event, unsigned long read_format, ch struct mc_perf_event *leader = event->group_leader, *sub; int n = 0, size = 0, ret; unsigned long count; - unsigned long values[5]; + long long values[5]; count = perf_event_read_value(leader); values[n++] = 1 + leader->nr_siblings; values[n++] = count; - size = n * sizeof(unsigned long); + size = n * sizeof(long long); if (copy_to_user(buf, values, size)) return -EFAULT; @@ -3805,7 +3843,7 @@ perf_event_read_group(struct mc_perf_event *event, unsigned long read_format, ch n = 0; values[n++] = perf_event_read_value(sub); - size = n * sizeof(unsigned long); + size = n * sizeof(long long); if (copy_to_user(buf + ret, values, size)) { return -EFAULT; @@ -3854,25 +3892,75 @@ void perf_start(struct mc_perf_event *event) int counter_id; unsigned long counter_mask = 0; struct mc_perf_event *leader = event->group_leader, *sub; + struct thread *thread = cpu_local_var(current); + /* -- For use_invariant_tsc -- + * Record sum of counts the previous start-stop periods + * into accum_count, + * because only the count at the last start is recorded + */ counter_id = leader->counter_id; - if (ihk_mc_perf_counter_mask_check(1UL << counter_id)) { - perf_counter_set(leader); - counter_mask |= 1UL << counter_id; + if (ihk_mc_perf_counter_mask_check(1UL << counter_id) && + leader->state == PERF_EVENT_STATE_INACTIVE) { + if (leader->use_invariant_tsc) { + if (leader->stopped_user_tsc) { + leader->user_accum_count += + leader->stopped_user_tsc - + leader->base_user_tsc; + leader->stopped_user_tsc = 0; + } + leader->base_user_tsc = thread->user_tsc; + + if (leader->stopped_system_tsc) { + leader->system_accum_count += + leader->stopped_system_tsc - + leader->base_system_tsc; + leader->stopped_system_tsc = 0; + } + leader->base_system_tsc = thread->system_tsc; + } + else { + perf_counter_set(leader); + counter_mask |= 1UL << counter_id; + } + + leader->state = PERF_EVENT_STATE_ACTIVE; } list_for_each_entry(sub, &leader->sibling_list, group_entry) { counter_id = sub->counter_id; - if (ihk_mc_perf_counter_mask_check(1UL << counter_id)) { - perf_counter_set(sub); - counter_mask |= 1UL << counter_id; + if (ihk_mc_perf_counter_mask_check(1UL << counter_id) && + sub->state == PERF_EVENT_STATE_INACTIVE) { + if (sub->use_invariant_tsc) { + if (sub->stopped_user_tsc) { + sub->user_accum_count += + sub->stopped_user_tsc - + sub->base_user_tsc; + sub->stopped_user_tsc = 0; + } + sub->base_user_tsc = thread->user_tsc; + + if (sub->stopped_system_tsc) { + sub->system_accum_count += + sub->stopped_system_tsc - + sub->base_system_tsc; + sub->stopped_system_tsc = 0; + } + sub->base_system_tsc = thread->system_tsc; + } + else { + perf_counter_set(sub); + counter_mask |= 1UL << counter_id; + } + + sub->state = PERF_EVENT_STATE_ACTIVE; } } if (counter_mask) { ihk_mc_perfctr_start(counter_mask); - cpu_local_var(current)->proc->perf_status = PP_COUNT; } + thread->proc->perf_status = PP_COUNT; } void @@ -3880,16 +3968,62 @@ perf_reset(struct mc_perf_event *event) { int counter_id; struct mc_perf_event *leader = event->group_leader, *sub; + struct thread *thread = cpu_local_var(current); counter_id = leader->counter_id; if (ihk_mc_perf_counter_mask_check(1UL << counter_id)) { - ihk_mc_perfctr_reset(counter_id); + /* Let perf_event_read_value return zero when stopped */ + if (leader->use_invariant_tsc) { + if (leader->stopped_user_tsc) { + leader->base_user_tsc = + leader->stopped_user_tsc; + } + else { + leader->base_user_tsc = thread->user_tsc; + } + leader->user_accum_count = 0; + + if (leader->stopped_system_tsc) { + leader->base_system_tsc = + leader->stopped_system_tsc; + } + else { + leader->base_system_tsc = thread->system_tsc; + } + leader->system_accum_count = 0; + } + else { + ihk_mc_perfctr_reset(counter_id); + } } list_for_each_entry(sub, &leader->sibling_list, group_entry) { counter_id = sub->counter_id; if (ihk_mc_perf_counter_mask_check(1UL << counter_id)) { - ihk_mc_perfctr_reset(counter_id); + /* Let perf_event_read_value return zero when stopped */ + if (sub->use_invariant_tsc) { + if (sub->stopped_user_tsc) { + sub->base_user_tsc = + sub->stopped_user_tsc; + } + else { + sub->base_user_tsc = thread->user_tsc; + } + sub->user_accum_count = 0; + + if (sub->stopped_system_tsc) { + sub->base_system_tsc = + sub->stopped_system_tsc; + } + else { + sub->base_system_tsc = + thread->system_tsc; + } + sub->system_accum_count = 0; + } + else { + ihk_mc_perfctr_reset(counter_id); + } } } } @@ -3900,24 +4034,52 @@ perf_stop(struct mc_perf_event *event) int counter_id; unsigned long counter_mask = 0; struct mc_perf_event *leader = event->group_leader, *sub; + struct thread *thread = cpu_local_var(current); counter_id = leader->counter_id; - if (ihk_mc_perf_counter_mask_check(1UL << counter_id)) { - counter_mask |= 1UL << counter_id; + if (ihk_mc_perf_counter_mask_check(1UL << counter_id) && + leader->state == PERF_EVENT_STATE_ACTIVE) { + if (leader->use_invariant_tsc) { + if (leader->stopped_user_tsc == 0) { + leader->stopped_user_tsc = thread->user_tsc; + } + if (leader->stopped_system_tsc == 0) { + leader->stopped_system_tsc = thread->system_tsc; + } + } + else { + counter_mask |= 1UL << counter_id; + } + + leader->state = PERF_EVENT_STATE_INACTIVE; } list_for_each_entry(sub, &leader->sibling_list, group_entry) { counter_id = sub->counter_id; - if (ihk_mc_perf_counter_mask_check(1UL << counter_id)) { - counter_mask |= 1UL << counter_id; + if (ihk_mc_perf_counter_mask_check(1UL << counter_id) && + sub->state == PERF_EVENT_STATE_ACTIVE) { + if (sub->use_invariant_tsc) { + if (sub->stopped_user_tsc == 0) { + sub->stopped_user_tsc = + thread->user_tsc; + } + if (sub->stopped_system_tsc == 0) { + sub->stopped_system_tsc = + thread->system_tsc; + } + } + else { + counter_mask |= 1UL << counter_id; + } + sub->state = PERF_EVENT_STATE_INACTIVE; } } if (counter_mask) { ihk_mc_perfctr_stop(counter_mask, 0); - cpu_local_var(current)->proc->monitoring_event = NULL; - cpu_local_var(current)->proc->perf_status = PP_NONE; } + cpu_local_var(current)->proc->monitoring_event = NULL; + cpu_local_var(current)->proc->perf_status = PP_NONE; } static int @@ -3964,8 +4126,7 @@ perf_ioctl(struct mckfd *sfd, ihk_mc_user_context_t *ctx) break; case PERF_EVENT_IOC_RESET: // TODO: reset other process - ihk_mc_perfctr_set(counter_id, event->attr.sample_freq * -1); - event->count = 0L; + perf_reset(event); break; case PERF_EVENT_IOC_REFRESH: // TODO: refresh other process @@ -4131,6 +4292,19 @@ static int mc_perf_event_alloc(struct mc_perf_event **out, event->child_count_total = 0; event->parent = NULL; + if (attr->type == PERF_TYPE_HARDWARE && + attr->config == PERF_COUNT_HW_REF_CPU_CYCLES) { + event->use_invariant_tsc = 1; + + /* + * REF_CPU_CYCLES is counted by thread's tsc. + * Always support. + */ + *out = event; + ret = 0; + goto out; + } + switch (attr->type) { case PERF_TYPE_HARDWARE : val = ihk_mc_hw_event_map(attr->config); diff --git a/lib/include/mc_perf_event.h b/lib/include/mc_perf_event.h index 05885d4e..81de581c 100644 --- a/lib/include/mc_perf_event.h +++ b/lib/include/mc_perf_event.h @@ -256,12 +256,20 @@ struct hw_perf_event_extra { int idx; }; +/** + * enum perf_event_state - the states of an event: + */ +enum perf_event_state { + PERF_EVENT_STATE_INACTIVE = 0, + PERF_EVENT_STATE_ACTIVE = 1, +}; struct mc_perf_event { struct perf_event_attr attr; struct hw_perf_event_extra extra_reg; unsigned long hw_config; unsigned long hw_config_ext; + enum perf_event_state state; int cpu_id; int counter_id; // counter_id unsigned long count; // counter_value @@ -275,6 +283,13 @@ struct mc_perf_event { int nr_siblings; int pid; struct list_head group_entry; + int use_invariant_tsc; + long long base_user_tsc; + long long stopped_user_tsc; + long long user_accum_count; + long long base_system_tsc; + long long stopped_system_tsc; + long long system_accum_count; }; struct perf_event_mmap_page { diff --git a/test/issues/1025/C1025_aarch64.sh b/test/issues/1025/C1025_aarch64.sh new file mode 100755 index 00000000..53c8a12a --- /dev/null +++ b/test/issues/1025/C1025_aarch64.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +. ../../common.sh + +PERF_TYPE_HARDWARE=0 +PERF_COUNT_HW_REF_CPU_CYCLES=9 + +ng=0 +echo "*** C1025T01 ******************************************" +echo "** Linux's result *************************************" +echo "* REF_CPU_CYCLES event is NOT supported Linux on aarch64" +echo "" +echo "** McKernel's result *************************************" +echo "[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: none]" +${MCEXEC} ./perf_test 0 1 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_all_val.txt + +echo "[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: user]" +${MCEXEC} ./perf_test 1 1 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: kernel]" +${MCEXEC} ./perf_test 2 1 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +mck_all_val=`grep "REF_CPU" ./mck_all_val.txt | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | grep -o [0-9]*` + +if [ "x${mck_all_val}" != "x" ] && [ "x${mck_user_val}" != "x" ] && \ +[ "x${mck_kernel_val}" != "x" ] ; then + echo "** C1025T01 PASSED" +else + echo "** C1025T01 FAILED" +fi +echo "" + diff --git a/test/issues/1025/C1025_x86_64.sh b/test/issues/1025/C1025_x86_64.sh new file mode 100755 index 00000000..d2d5af08 --- /dev/null +++ b/test/issues/1025/C1025_x86_64.sh @@ -0,0 +1,670 @@ +#!/bin/sh + +. ../../common.sh + +PERF_TYPE_HARDWARE=0 +PERF_COUNT_HW_CPU_CYCLES=0 +PERF_COUNT_HW_INSTRUCTIONS=1 +PERF_COUNT_HW_REF_CPU_CYCLES=9 + +ng=0 +echo "*** C1025T01 ******************************************" +echo "** Linux's result *************************************" +echo "[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: none]" +./perf_test 0 1 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: user]" +./perf_test 1 1 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: kernel]" +./perf_test 2 1 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./lnx_user_val.txt +echo "" +echo "** McKernel's result *************************************" +echo "[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: none]" +${MCEXEC} ./perf_test 0 1 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: user]" +${MCEXEC} ./perf_test 1 1 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: kernel]" +${MCEXEC} ./perf_test 2 1 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | grep -o [0-9]*` +echo -n "check user val:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? +if [ $ng -eq 0 ]; then + echo "** C1025T01 PASSED" +else + echo "** C1025T01 FAILED" +fi +echo "" + +ng=0 +echo "*** C1025T02 ******************************************" +echo "** Linux's result *************************************" +echo "[ CASE-A , Leader fd : YES , exclude: none]" +./perf_case_a 0 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-A , Leader fd : YES , exclude: user]" +./perf_case_a 1 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-A , Leader fd : YES , exclude: kernel]" +./perf_case_a 2 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./lnx_user_val.txt +echo"" +echo "** McKernel's result *************************************" +echo "[ CASE-A , Leader fd : YES , exclude: none]" +${MCEXEC} ./perf_case_a 0 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-A , Leader fd : YES , exclude: user]" +${MCEXEC} ./perf_case_a 1 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[ CASE-A , Leader fd : YES , exclude: kernel]" +${MCEXEC} ./perf_case_a 2 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | grep -o [0-9]*` +echo -n "check user val:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? +if [ $ng -eq 0 ]; then + echo "** C1025T02 PASSED" +else + echo "** C1025T02 FAILED" +fi +echo "" + +ng=0 +echo "*** C1025T03 ******************************************" +echo "** Linux's result *************************************" +echo "[ CASE-B , Leader fd : YES , exclude: none]" +./perf_case_b 0 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-B , Leader fd : YES , exclude: user]" +./perf_case_b 1 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-B , Leader fd : YES , exclude: kernel]" +./perf_case_b 2 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./lnx_user_val.txt +echo"" +echo "** McKernel's result *************************************" +echo "[ CASE-B , Leader fd : YES , exclude: none]" +${MCEXEC} ./perf_case_b 0 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-B , Leader fd : YES , exclude: user]" +${MCEXEC} ./perf_case_b 1 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[ CASE-B , Leader fd : YES , exclude: kernel]" +${MCEXEC} ./perf_case_b 2 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | grep -o [0-9]*` +echo -n "check user val:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? +if [ $ng -eq 0 ]; then + echo "** C1025T03 PASSED" +else + echo "** C1025T03 FAILED" +fi +echo "" + +ng=0 +echo "*** C1025T04 ******************************************" +echo "** Linux's result *************************************" +echo "[ CASE-C , Leader fd : YES , exclude: none]" +./perf_case_c 0 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-C , Leader fd : YES , exclude: user]" +./perf_case_c 1 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-C , Leader fd : YES , exclude: kernel]" +./perf_case_c 2 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./lnx_user_val.txt +echo"" +echo "** McKernel's result *************************************" +echo "[ CASE-C , Leader fd : YES , exclude: none]" +${MCEXEC} ./perf_case_c 0 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-C , Leader fd : YES , exclude: user]" +${MCEXEC} ./perf_case_c 1 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[ CASE-C , Leader fd : YES , exclude: kernel]" +${MCEXEC} ./perf_case_c 2 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | grep -o [0-9]*` +echo -n "check user val:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? +if [ $ng -eq 0 ]; then + echo "** C1025T04 PASSED" +else + echo "** C1025T04 FAILED" +fi +echo "" + +ng=0 +echo "*** C1025T05 ******************************************" +echo "** Linux's result *************************************" +echo "[ CASE-D , Leader fd : YES , exclude: none]" +./perf_case_d 0 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-D , Leader fd : YES , exclude: user]" +./perf_case_d 1 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-D , Leader fd : YES , exclude: kernel]" +./perf_case_d 2 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./lnx_user_val.txt +echo"" +echo "** McKernel's result *************************************" +echo "[ CASE-D , Leader fd : YES , exclude: none]" +${MCEXEC} ./perf_case_d 0 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-D , Leader fd : YES , exclude: user]" +${MCEXEC} ./perf_case_d 1 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[ CASE-D , Leader fd : YES , exclude: kernel]" +${MCEXEC} ./perf_case_d 2 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | head -n1 | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | head -n1 | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | head -n1 | grep -o [0-9]*` +echo -n "check user val 1st:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val 1st:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | tail -n1 | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | tail -n1 | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | tail -n1 |grep -o [0-9]*` +echo -n "check user val 2nd:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val 2nd:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? +if [ $ng -eq 0 ]; then + echo "** C1025T05 PASSED" +else + echo "** C1025T05 FAILED" +fi +echo "" + +ng=0 +echo "*** C1025T06 ******************************************" +echo "** Linux's result *************************************" +echo "[ CASE-E , Leader fd : YES , exclude: none]" +./perf_case_e 0 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-E , Leader fd : YES , exclude: user]" +./perf_case_e 1 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-E , Leader fd : YES , exclude: kernel]" +./perf_case_e 2 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./lnx_user_val.txt +echo"" +echo "** McKernel's result *************************************" +echo "[ CASE-E , Leader fd : YES , exclude: none]" +${MCEXEC} ./perf_case_e 0 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-E , Leader fd : YES , exclude: user]" +${MCEXEC} ./perf_case_e 1 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[ CASE-E , Leader fd : YES , exclude: kernel]" +${MCEXEC} ./perf_case_e 2 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | grep -o [0-9]*` +echo -n "check user val:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? +if [ $ng -eq 0 ]; then + echo "** C1025T06 PASSED" +else + echo "** C1025T06 FAILED" +fi +echo "" + +ng=0 +echo "*** C1025T07 ******************************************" +echo "** Linux's result *************************************" +echo "[ CASE-F , Leader fd : YES , exclude: none]" +./perf_case_f 0 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-F , Leader fd : YES , exclude: user]" +./perf_case_f 1 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-F , Leader fd : YES , exclude: kernel]" +./perf_case_f 2 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./lnx_user_val.txt +echo"" +echo "** McKernel's result *************************************" +echo "[ CASE-F , Leader fd : YES , exclude: none]" +${MCEXEC} ./perf_case_f 0 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} + +echo "[ CASE-F , Leader fd : YES , exclude: user]" +${MCEXEC} ./perf_case_f 1 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[ CASE-F , Leader fd : YES , exclude: kernel]" +${MCEXEC} ./perf_case_f 2 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | grep -o [0-9]*` +echo -n "check user val:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? +if [ $ng -eq 0 ]; then + echo "** C1025T07 PASSED" +else + echo "** C1025T07 FAILED" +fi +echo "" + +ng=0 +echo "*** C1025T08 ******************************************" +echo "** Linux's result *************************************" +echo "[ CASE-A , Leader fd : NO , exclude: none]" +./perf_case_a 0 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-A , Leader fd : NO , exclude: user]" +./perf_case_a 1 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-A , Leader fd : NO , exclude: kernel]" +./perf_case_a 2 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./lnx_user_val.txt +echo"" +echo "** McKernel's result *************************************" +echo "[ CASE-A , Leader fd : NO , exclude: none]" +${MCEXEC} ./perf_case_a 0 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-A , Leader fd : NO , exclude: user]" +${MCEXEC} ./perf_case_a 1 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[ CASE-A , Leader fd : NO , exclude: kernel]" +${MCEXEC} ./perf_case_a 2 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | grep -o [0-9]*` +echo -n "check user val:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? +if [ $ng -eq 0 ]; then + echo "** C1025T08 PASSED" +else + echo "** C1025T08 FAILED" +fi +echo "" + +ng=0 +echo "*** C1025T09 ******************************************" +echo "** Linux's result *************************************" +echo "[ CASE-B , Leader fd : NO , exclude: none]" +./perf_case_b 0 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-B , Leader fd : NO , exclude: user]" +./perf_case_b 1 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-B , Leader fd : NO , exclude: kernel]" +./perf_case_b 2 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./lnx_user_val.txt +echo"" +echo "** McKernel's result *************************************" +echo "[ CASE-B , Leader fd : NO , exclude: none]" +${MCEXEC} ./perf_case_b 0 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-B , Leader fd : NO , exclude: user]" +${MCEXEC} ./perf_case_b 1 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[ CASE-B , Leader fd : NO , exclude: kernel]" +${MCEXEC} ./perf_case_b 2 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | grep -o [0-9]*` +echo -n "check user val:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? +if [ $ng -eq 0 ]; then + echo "** C1025T09 PASSED" +else + echo "** C1025T09 FAILED" +fi +echo "" + +ng=0 +echo "*** C1025T10 ******************************************" +echo "** Linux's result *************************************" +echo "[ CASE-C , Leader fd : NO , exclude: none]" +./perf_case_c 0 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-C , Leader fd : NO , exclude: user]" +./perf_case_c 1 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-C , Leader fd : NO , exclude: kernel]" +./perf_case_c 2 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./lnx_user_val.txt +echo"" +echo "** McKernel's result *************************************" +echo "[ CASE-C , Leader fd : NO , exclude: none]" +${MCEXEC} ./perf_case_c 0 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-C , Leader fd : NO , exclude: user]" +${MCEXEC} ./perf_case_c 1 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[ CASE-C , Leader fd : NO , exclude: kernel]" +${MCEXEC} ./perf_case_c 2 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | grep -o [0-9]*` +echo -n "check user val:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? +if [ $ng -eq 0 ]; then + echo "** C1025T10 PASSED" +else + echo "** C1025T10 FAILED" +fi +echo "" + +ng=0 +echo "*** C1025T11 ******************************************" +echo "** Linux's result *************************************" +echo "[ CASE-D , Leader fd : NO , exclude: none]" +./perf_case_d 0 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-D , Leader fd : NO , exclude: user]" +./perf_case_d 1 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-D , Leader fd : NO , exclude: kernel]" +./perf_case_d 2 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./lnx_user_val.txt +echo"" +echo "** McKernel's result *************************************" +echo "[ CASE-D , Leader fd : NO , exclude: none]" +${MCEXEC} ./perf_case_d 0 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-D , Leader fd : NO , exclude: user]" +${MCEXEC} ./perf_case_d 1 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[ CASE-D , Leader fd : NO , exclude: kernel]" +${MCEXEC} ./perf_case_d 2 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | head -n1 | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | head -n1 | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | head -n1 | grep -o [0-9]*` +echo -n "check user val 1st:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val 1st:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | tail -n1 | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | tail -n1 | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | tail -n1 |grep -o [0-9]*` +echo -n "check user val 2nd:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val 2nd:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? +if [ $ng -eq 0 ]; then + echo "** C1025T11 PASSED" +else + echo "** C1025T11 FAILED" +fi +echo "" + +ng=0 +echo "*** C1025T12 ******************************************" +echo "** Linux's result *************************************" +echo "[ CASE-E , Leader fd : NO , exclude: none]" +./perf_case_e 0 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-E , Leader fd : NO , exclude: user]" +./perf_case_e 1 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-E , Leader fd : NO , exclude: kernel]" +./perf_case_e 2 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./lnx_user_val.txt +echo"" +echo "** McKernel's result *************************************" +echo "[ CASE-E , Leader fd : NO , exclude: none]" +${MCEXEC} ./perf_case_e 0 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-E , Leader fd : NO , exclude: user]" +${MCEXEC} ./perf_case_e 1 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[ CASE-E , Leader fd : NO , exclude: kernel]" +${MCEXEC} ./perf_case_e 2 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | grep -o [0-9]*` +echo -n "check user val:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? +if [ $ng -eq 0 ]; then + echo "** C1025T12 PASSED" +else + echo "** C1025T12 FAILED" +fi +echo "" + +ng=0 +echo "*** C1025T13 ******************************************" +echo "** Linux's result *************************************" +echo "[ CASE-F , Leader fd : NO , exclude: none]" +./perf_case_f 0 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-F , Leader fd : NO , exclude: user]" +./perf_case_f 1 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-F , Leader fd : NO , exclude: kernel]" +./perf_case_f 2 2 ${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./lnx_user_val.txt +echo"" +echo "** McKernel's result *************************************" +echo "[ CASE-F , Leader fd : NO , exclude: none]" +${MCEXEC} ./perf_case_f 0 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} + +echo "[ CASE-F , Leader fd : NO , exclude: user]" +${MCEXEC} ./perf_case_f 1 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_kernel_val.txt + +echo "[ CASE-F , Leader fd : NO , exclude: kernel]" +${MCEXEC} ./perf_case_f 2 2 \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_CPU_CYCLES} \ +${PERF_TYPE_HARDWARE} ${PERF_COUNT_HW_REF_CPU_CYCLES} \ +| tee ./mck_user_val.txt + +lnx_user_val=`grep "REF_CPU" ./lnx_user_val.txt | grep -o [0-9]*` +mck_user_val=`grep "REF_CPU" ./mck_user_val.txt | grep -o [0-9]*` +mck_kernel_val=`grep "REF_CPU" ./mck_kernel_val.txt | grep -o [0-9]*` +echo -n "check user val:" +./check_val.sh ${lnx_user_val} ${mck_user_val} 0.9 1.1 +ng+=$? +echo -n "check kernel val:" +./check_val.sh ${mck_user_val} ${mck_kernel_val} 0 0.01 +ng+=$? +if [ $ng -eq 0 ]; then + echo "** C1025T13 PASSED" +else + echo "** C1025T13 FAILED" +fi diff --git a/test/issues/1025/Makefile b/test/issues/1025/Makefile new file mode 100644 index 00000000..4d35afac --- /dev/null +++ b/test/issues/1025/Makefile @@ -0,0 +1,39 @@ +CC = gcc +TARGET=perf_test perf_case_a perf_case_b perf_case_c perf_case_d perf_case_e perf_case_f + +CPPFLAGS = +LDFLAGS = + +ARCH=$(shell uname -p) + +all: $(TARGET) + +perf_tool.o: perftool.c perftool.h + +perf_test: perf_test.c perftool.o + $(CC) -o $@ $^ $(LDFLAGS) + +perf_case_a: perf_case_a.c perftool.o + $(CC) -o $@ $^ $(LDFLAGS) + +perf_case_b: perf_case_b.c perftool.o + $(CC) -o $@ $^ $(LDFLAGS) + +perf_case_c: perf_case_c.c perftool.o + $(CC) -o $@ $^ $(LDFLAGS) + +perf_case_d: perf_case_d.c perftool.o + $(CC) -o $@ $^ $(LDFLAGS) + +perf_case_e: perf_case_e.c perftool.o + $(CC) -o $@ $^ $(LDFLAGS) + +perf_case_f: perf_case_f.c perftool.o + $(CC) -o $@ $^ $(LDFLAGS) + +test: all + @sh ./C1025_$(ARCH).sh + +clean: + rm -f $(TARGET) *.o *.txt + diff --git a/test/issues/1025/README b/test/issues/1025/README new file mode 100644 index 00000000..733a423e --- /dev/null +++ b/test/issues/1025/README @@ -0,0 +1,77 @@ +【Issue#1025 動作確認】 +□ 前提 +PERF_COUNT_HW_REF_CPU_CYCLESイベントの計測は、aarch64アーキテクチャの +Linuxではサポートされていない。 +しかし、本件の機能追加ではMcKernelのthreadが持つuser_tsc, system_tsc を +用いて計測する方式で実装したため、アーキテクチャによらず計測が可能である。 + +□ テスト内容 +1. Issueで報告された再現プログラムでの確認 +C1025T01: PERF_COUNT_HW_REF_CPU_CYCLES 指定での計測 + 除外なし、ユーザモード除外、カーネルモード除外の3パターンを用いて + PERF_COUNT_HW_REF_CPU_CYCLES の計測を行う + +それぞれの計測において、PERF_COUNT_HW_REF_CPU_CYCLESの計測値が +アーキテクチャごとの以下の条件を満たした場合にPASSとする +[x86_64] + - ユーザ時間 :Linuxでのユーザ時間計測値の90% ~ 110% + - カーネル時間:McKernelでのユーザ時間計測結果の1% 未満 + +[aarch64] +LinuxでのPERF_COUNT_HW_REF_CPUの計測が行えないため、 +計測値が取得できた場合にPASSとする + +2. 計測の基本機能の確認 (x86_64 でのみ実施) +perf_event_openでの基本機能の確認として、計測対象の演算処理と、 +Start, Stop, Reset, Readを以下のフローで実施する + CASE-A: 基本計測の確認 + Start -> 演算 -> Stop -> Read + CASE-B: Stop機能の確認 + Start -> 演算 -> Stop -> 演算 -> Read + CASE-C: Reset機能の確認 + Start -> 演算 -> Stop -> Reset -> Read + CASE-D: Read機能の確認 + Start -> 演算 -> Read -> 演算 -> Read + CASE-E: Stop後の再Start機能の確認 + Start -> 演算 -> Stop -> 演算 -> Start-> 演算 -> Stop -> Read + CASE-F: Start後の再Start機能の確認 + Start -> 演算 -> Start -> 演算 -> Stop -> Read + +また、本テストでは、perf_event_openで取得したfdをグループ化し、 +グループ内のリーダーとなるfdへの操作でグループ全体の操作が可能な +PERF_FORMAT_GROUP の指定を用いる。 +その上で、PERF_COUNT_HW_REF_CPU_CYCLES の指定を行ったfdがリーダーの場合と +リーダー以外の場合で検証を行う。 +本テストで実行するテストプログラム群(perf_case_X)では、1つ目の計測項目として +指定したものがリーダーとなる。 + + C1025T02: CASE-A でPERF_FORMAT_GROUPのリーダーの場合 + C1025T03: CASE-B でPERF_FORMAT_GROUPのリーダーの場合 + C1025T04: CASE-C でPERF_FORMAT_GROUPのリーダーの場合 + C1025T05: CASE-D でPERF_FORMAT_GROUPのリーダーの場合 + C1025T06: CASE-E でPERF_FORMAT_GROUPのリーダーの場合 + C1025T07: CASE-F でPERF_FORMAT_GROUPのリーダーの場合 + + C1025T08: CASE-A でPERF_FORMAT_GROUPのリーダー以外の場合 + C1025T09: CASE-B でPERF_FORMAT_GROUPのリーダー以外の場合 + C1025T10: CASE-C でPERF_FORMAT_GROUPのリーダー以外の場合 + C1025T11: CASE-D でPERF_FORMAT_GROUPのリーダー以外の場合 + C1025T12: CASE-E でPERF_FORMAT_GROUPのリーダー以外の場合 + C1025T13: CASE-F でPERF_FORMAT_GROUPのリーダー以外の場合 + +それぞれの計測において、PERF_COUNT_HW_REF_CPU_CYCLESの計測値が +以下の条件を満たした場合にPASSとする + - ユーザ時間 :Linuxでのユーザ時間計測値の90% ~ 110% + - カーネル時間:McKernelでのユーザ時間計測結果の1% 未満 + +□ 実行手順 +$ make test + +McKernelのインストール先や、OSTEST, LTPの配置場所は、 +$HOME/.mck_test_config を参照している +.mck_test_config は、McKernelをビルドした際に生成されるmck_test_config.sample ファイルを +$HOMEにコピーし、適宜編集する + +□ 実行結果 +x86_64_result.log aarch64_result.log 参照 +すべての項目で、PASSしていることを確認した diff --git a/test/issues/1025/aarch64_result.log b/test/issues/1025/aarch64_result.log new file mode 100644 index 00000000..48c23a29 --- /dev/null +++ b/test/issues/1025/aarch64_result.log @@ -0,0 +1,16 @@ +*** C1025T01 ****************************************** +** Linux's result ************************************* +* REF_CPU_CYCLES event is NOT supported Linux on aarch64 + +** McKernel's result ************************************* +[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: none] +fd: 8 +REF_CPU_CYCLES : 6641022 +[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: user] +fd: 8 +REF_CPU_CYCLES : 97 +[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: kernel] +fd: 8 +REF_CPU_CYCLES : 6644473 +** C1025T01 PASSED + diff --git a/test/issues/1025/check_val.sh b/test/issues/1025/check_val.sh new file mode 100755 index 00000000..3e32e1ee --- /dev/null +++ b/test/issues/1025/check_val.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +if [ $# -lt 4 ]; then + echo "usage: $(basename $0) \ + " + exit 1 +fi + +base_val=$1 +tgt_val=$2 +l_coef=$3 +u_coef=$4 + +lower=`echo "scale=1; ${base_val} * ${l_coef}" | bc` +upper=`echo "scale=1; ${base_val} * ${u_coef}" | bc` + +if [ "$(echo "${tgt_val} > ${lower}" | bc)" -eq 1 -a \ + "$(echo "${tgt_val} < ${upper}" | bc)" -eq 1 ] || + [ ${base_val} -eq ${tgt_val} ]; then + echo " ${tgt_val} is IN ${lower} - ${upper} [OK]" + exit 0 +else + echo " ${tgt_val} is OUT ${lower} - ${upper} [NG]" + exit 1 +fi diff --git a/test/issues/1025/perf_case_a.c b/test/issues/1025/perf_case_a.c new file mode 100644 index 00000000..80a66079 --- /dev/null +++ b/test/issues/1025/perf_case_a.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include + +#include "perftool.h" + +#define IS_GROUP 1 + +/* perf flow: Start -> calc -> Stop -> Read */ + +void +usage() +{ + printf("Usage: perf_case_a mode cntr_num [ ]...\n"); + exit(1); +} + +int +main(int argc, char **argv) +{ + long fds[PERF_CNTR_NUM]; + long long counts[PERF_CNTR_NUM + 1]; + int types[PERF_CNTR_NUM]; + int configs[PERF_CNTR_NUM]; + int group_fd = -1; + + int cntr_num; + int mode; + int i; + + if (argc < 3) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + mode = atoi(argv[1]); + cntr_num = atoi(argv[2]); + + /* perse args */ + if (argc < cntr_num * 2 + 2) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + for (i = 0; i < cntr_num; i++) { + types[i] = atoi(argv[i * 2 + 3]); + configs[i] = atoi(argv[i * 2 + 4]); + } + + /* perf_event_open */ + for (i = 0; i < cntr_num; i++) { + fds[i] = pe_opener(group_fd, mode, + types[i], configs[i], IS_GROUP); + if (group_fd == -1) { + group_fd = fds[i]; + } + } + + /* perf_start */ + PERF_BEGIN(group_fd, PERF_IOC_FLAG_GROUP); + + /* calc */ + calc_task(); + + /* perf_end and read */ + PERF_END(group_fd, PERF_IOC_FLAG_GROUP); + PERF_READ(group_fd, counts, sizeof(counts)); + + for (i = 0; i < cntr_num; i++) { + close(fds[i]); + } + + /* print result */ + for (i = 0; i < counts[0]; i++) { + if (types[i] == PERF_TYPE_HARDWARE) { + printf("%s: %16ld\n", + hw_event_names[configs[i]], counts[i + 1]); + } + else if (types[i] == PERF_TYPE_HW_CACHE) { + printf("%s_%s_%s: %16ld\n", + id_names[(configs[i] >> 0) & 0xff], + op_id_names[(configs[i] >> 8) & 0xff], + result_names[(configs[i] >> 16) & 0xff], + counts[i + 1]); + } + } + + return 0; +} diff --git a/test/issues/1025/perf_case_b.c b/test/issues/1025/perf_case_b.c new file mode 100644 index 00000000..f093cdd1 --- /dev/null +++ b/test/issues/1025/perf_case_b.c @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include + +#include "perftool.h" + +#define IS_GROUP 1 + +/* perf flow: Start -> calc -> Stop -> calc -> Read */ + +void +usage() +{ + printf("Usage: perf_case_b mode cntr_num [ ]...\n"); + exit(1); +} + +int +main(int argc, char **argv) +{ + long fds[PERF_CNTR_NUM]; + long long counts[PERF_CNTR_NUM + 1]; + int types[PERF_CNTR_NUM]; + int configs[PERF_CNTR_NUM]; + int group_fd = -1; + + int cntr_num; + int mode; + int i; + + if (argc < 3) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + mode = atoi(argv[1]); + cntr_num = atoi(argv[2]); + + /* perse args */ + if (argc < cntr_num * 2 + 2) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + for (i = 0; i < cntr_num; i++) { + types[i] = atoi(argv[i * 2 + 3]); + configs[i] = atoi(argv[i * 2 + 4]); + } + + /* perf_event_open */ + for (i = 0; i < cntr_num; i++) { + fds[i] = pe_opener(group_fd, mode, + types[i], configs[i], IS_GROUP); + if (group_fd == -1) { + group_fd = fds[i]; + } + } + + /* perf_start */ + PERF_BEGIN(group_fd, PERF_IOC_FLAG_GROUP); + + /* 1st calc */ + calc_task(); + + /* perf end */ + PERF_END(group_fd, PERF_IOC_FLAG_GROUP); + + /* 2nd calc */ + calc_task(); + + /* perf read */ + PERF_READ(group_fd, counts, sizeof(counts)); + + for (i = 0; i < cntr_num; i++) { + close(fds[i]); + } + + /* print result */ + for (i = 0; i < counts[0]; i++) { + if (types[i] == PERF_TYPE_HARDWARE) { + printf("%s: %16ld\n", + hw_event_names[configs[i]], counts[i + 1]); + } + else if (types[i] == PERF_TYPE_HW_CACHE) { + printf("%s_%s_%s: %16ld\n", + id_names[(configs[i] >> 0) & 0xff], + op_id_names[(configs[i] >> 8) & 0xff], + result_names[(configs[i] >> 16) & 0xff], + counts[i + 1]); + } + } + + return 0; +} diff --git a/test/issues/1025/perf_case_c.c b/test/issues/1025/perf_case_c.c new file mode 100644 index 00000000..bf2d04b7 --- /dev/null +++ b/test/issues/1025/perf_case_c.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include + +#include "perftool.h" + +#define IS_GROUP 1 + +/* perf flow: Start -> calc -> Stop -> Reset -> Read */ + +void +usage() +{ + printf("Usage: perf_case_c mode cntr_num [ ]...\n"); + exit(1); +} + +int +main(int argc, char **argv) +{ + long fds[PERF_CNTR_NUM]; + long long counts[PERF_CNTR_NUM + 1]; + int types[PERF_CNTR_NUM]; + int configs[PERF_CNTR_NUM]; + int group_fd = -1; + + int cntr_num; + int mode; + int i; + + if (argc < 3) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + mode = atoi(argv[1]); + cntr_num = atoi(argv[2]); + + /* perse args */ + if (argc < cntr_num * 2 + 2) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + for (i = 0; i < cntr_num; i++) { + types[i] = atoi(argv[i * 2 + 3]); + configs[i] = atoi(argv[i * 2 + 4]); + } + + /* perf_event_open */ + for (i = 0; i < cntr_num; i++) { + fds[i] = pe_opener(group_fd, mode, + types[i], configs[i], IS_GROUP); + if (group_fd == -1) { + group_fd = fds[i]; + } + } + + /* perf_start */ + PERF_BEGIN(group_fd, PERF_IOC_FLAG_GROUP); + + /* calc */ + calc_task(); + + /* perf end and reset */ + PERF_END(group_fd, PERF_IOC_FLAG_GROUP); + PERF_RESET(group_fd, PERF_IOC_FLAG_GROUP); + + /* perf read */ + PERF_READ(group_fd, counts, sizeof(counts)); + + for (i = 0; i < cntr_num; i++) { + close(fds[i]); + } + + /* print result */ + for (i = 0; i < counts[0]; i++) { + if (types[i] == PERF_TYPE_HARDWARE) { + printf("%s: %16ld\n", + hw_event_names[configs[i]], counts[i + 1]); + } + else if (types[i] == PERF_TYPE_HW_CACHE) { + printf("%s_%s_%s: %16ld\n", + id_names[(configs[i] >> 0) & 0xff], + op_id_names[(configs[i] >> 8) & 0xff], + result_names[(configs[i] >> 16) & 0xff], + counts[i + 1]); + } + } + + return 0; +} diff --git a/test/issues/1025/perf_case_d.c b/test/issues/1025/perf_case_d.c new file mode 100644 index 00000000..916ab9dd --- /dev/null +++ b/test/issues/1025/perf_case_d.c @@ -0,0 +1,116 @@ +#include +#include +#include +#include +#include + +#include "perftool.h" + +#define IS_GROUP 1 + +/* perf flow: Start -> calc -> Stop -> calc -> Read */ + +void +usage() +{ + printf("Usage: perf_case_b mode cntr_num [ ]...\n"); + exit(1); +} + +int +main(int argc, char **argv) +{ + long fds[PERF_CNTR_NUM]; + long long counts[PERF_CNTR_NUM + 1]; + long long counts2[PERF_CNTR_NUM + 1]; + int types[PERF_CNTR_NUM]; + int configs[PERF_CNTR_NUM]; + int group_fd = -1; + + int cntr_num; + int mode; + int i; + + if (argc < 3) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + mode = atoi(argv[1]); + cntr_num = atoi(argv[2]); + + /* perse args */ + if (argc < cntr_num * 2 + 2) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + for (i = 0; i < cntr_num; i++) { + types[i] = atoi(argv[i * 2 + 3]); + configs[i] = atoi(argv[i * 2 + 4]); + } + + /* perf_event_open */ + for (i = 0; i < cntr_num; i++) { + fds[i] = pe_opener(group_fd, mode, + types[i], configs[i], IS_GROUP); + if (group_fd == -1) { + group_fd = fds[i]; + } + } + + /* perf_start */ + PERF_BEGIN(group_fd, PERF_IOC_FLAG_GROUP); + + /* 1st calc */ + calc_task(); + + /* 1st perf read */ + PERF_READ(group_fd, counts, sizeof(counts)); + + /* 2nd calc */ + calc_task(); + + /* 2nd perf read */ + PERF_READ(group_fd, counts2, sizeof(counts2)); + + /* perf end */ + PERF_END(group_fd, PERF_IOC_FLAG_GROUP); + + for (i = 0; i < cntr_num; i++) { + close(fds[i]); + } + + /* print result 1 */ + printf("** Result of 1st read\n"); + for (i = 0; i < counts[0]; i++) { + if (types[i] == PERF_TYPE_HARDWARE) { + printf("%s: %16ld\n", + hw_event_names[configs[i]], counts[i + 1]); + } + else if (types[i] == PERF_TYPE_HW_CACHE) { + printf("%s_%s_%s: %16ld\n", + id_names[(configs[i] >> 0) & 0xff], + op_id_names[(configs[i] >> 8) & 0xff], + result_names[(configs[i] >> 16) & 0xff], + counts[i + 1]); + } + } + + printf("** Result of 2nd read\n"); + for (i = 0; i < counts2[0]; i++) { + if (types[i] == PERF_TYPE_HARDWARE) { + printf("%s: %16ld\n", + hw_event_names[configs[i]], counts2[i + 1]); + } + else if (types[i] == PERF_TYPE_HW_CACHE) { + printf("%s_%s_%s: %16ld\n", + id_names[(configs[i] >> 0) & 0xff], + op_id_names[(configs[i] >> 8) & 0xff], + result_names[(configs[i] >> 16) & 0xff], + counts2[i + 1]); + } + } + + return 0; +} diff --git a/test/issues/1025/perf_case_e.c b/test/issues/1025/perf_case_e.c new file mode 100644 index 00000000..ec387566 --- /dev/null +++ b/test/issues/1025/perf_case_e.c @@ -0,0 +1,103 @@ +#include +#include +#include +#include +#include + +#include "perftool.h" + +#define IS_GROUP 1 + +/* perf flow: Start -> calc -> Stop -> Read */ + +void +usage() +{ + printf("Usage: perf_case_a mode cntr_num [ ]...\n"); + exit(1); +} + +int +main(int argc, char **argv) +{ + long fds[PERF_CNTR_NUM]; + long long counts[PERF_CNTR_NUM + 1]; + int types[PERF_CNTR_NUM]; + int configs[PERF_CNTR_NUM]; + int group_fd = -1; + + int cntr_num; + int mode; + int i; + + if (argc < 3) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + mode = atoi(argv[1]); + cntr_num = atoi(argv[2]); + + /* perse args */ + if (argc < cntr_num * 2 + 2) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + for (i = 0; i < cntr_num; i++) { + types[i] = atoi(argv[i * 2 + 3]); + configs[i] = atoi(argv[i * 2 + 4]); + } + + /* perf_event_open */ + for (i = 0; i < cntr_num; i++) { + fds[i] = pe_opener(group_fd, mode, + types[i], configs[i], IS_GROUP); + if (group_fd == -1) { + group_fd = fds[i]; + } + } + + /* perf_start */ + PERF_BEGIN(group_fd, PERF_IOC_FLAG_GROUP); + + /* calc */ + calc_task(); + + /* perf_end */ + PERF_END(group_fd, PERF_IOC_FLAG_GROUP); + + /* calc (not counted) */ + calc_task(); + + /* perf_restart */ + PERF_START(group_fd, PERF_IOC_FLAG_GROUP); + + /* calc */ + calc_task(); + + /* perf_end and read */ + PERF_END(group_fd, PERF_IOC_FLAG_GROUP); + PERF_READ(group_fd, counts, sizeof(counts)); + + for (i = 0; i < cntr_num; i++) { + close(fds[i]); + } + + /* print result */ + for (i = 0; i < counts[0]; i++) { + if (types[i] == PERF_TYPE_HARDWARE) { + printf("%s: %16ld\n", + hw_event_names[configs[i]], counts[i + 1]); + } + else if (types[i] == PERF_TYPE_HW_CACHE) { + printf("%s_%s_%s: %16ld\n", + id_names[(configs[i] >> 0) & 0xff], + op_id_names[(configs[i] >> 8) & 0xff], + result_names[(configs[i] >> 16) & 0xff], + counts[i + 1]); + } + } + + return 0; +} diff --git a/test/issues/1025/perf_case_f.c b/test/issues/1025/perf_case_f.c new file mode 100644 index 00000000..c14b6a0e --- /dev/null +++ b/test/issues/1025/perf_case_f.c @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include + +#include "perftool.h" + +#define IS_GROUP 1 + +/* perf flow: Start -> calc -> Stop -> calc -> Read */ + +void +usage() +{ + printf("Usage: perf_case_f mode cntr_num [ ]...\n"); + exit(1); +} + +int +main(int argc, char **argv) +{ + long fds[PERF_CNTR_NUM]; + long long counts[PERF_CNTR_NUM + 1]; + int types[PERF_CNTR_NUM]; + int configs[PERF_CNTR_NUM]; + int group_fd = -1; + + int cntr_num; + int mode; + int i; + + if (argc < 3) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + mode = atoi(argv[1]); + cntr_num = atoi(argv[2]); + + /* perse args */ + if (argc < cntr_num * 2 + 2) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + for (i = 0; i < cntr_num; i++) { + types[i] = atoi(argv[i * 2 + 3]); + configs[i] = atoi(argv[i * 2 + 4]); + } + + /* perf_event_open */ + for (i = 0; i < cntr_num; i++) { + fds[i] = pe_opener(group_fd, mode, + types[i], configs[i], IS_GROUP); + if (group_fd == -1) { + group_fd = fds[i]; + } + } + + /* perf_start */ + PERF_BEGIN(group_fd, PERF_IOC_FLAG_GROUP); + + /* 1st calc */ + calc_task(); + + /* perf restart */ + PERF_START(group_fd, PERF_IOC_FLAG_GROUP); + + /* 2nd calc */ + calc_task(); + + /* perf read */ + PERF_READ(group_fd, counts, sizeof(counts)); + + for (i = 0; i < cntr_num; i++) { + close(fds[i]); + } + + /* print result */ + for (i = 0; i < counts[0]; i++) { + if (types[i] == PERF_TYPE_HARDWARE) { + printf("%s: %16ld\n", + hw_event_names[configs[i]], counts[i + 1]); + } + else if (types[i] == PERF_TYPE_HW_CACHE) { + printf("%s_%s_%s: %16ld\n", + id_names[(configs[i] >> 0) & 0xff], + op_id_names[(configs[i] >> 8) & 0xff], + result_names[(configs[i] >> 16) & 0xff], + counts[i + 1]); + } + } + + return 0; +} diff --git a/test/issues/1025/perf_test.c b/test/issues/1025/perf_test.c new file mode 100644 index 00000000..3abdeae2 --- /dev/null +++ b/test/issues/1025/perf_test.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include + +#include "perftool.h" + +void +usage() +{ + printf("Usage: perf_test mode cntr_num [ ]...\n"); + exit(1); +} + +int +main(int argc, char **argv) +{ + long fds[PERF_CNTR_NUM]; + long long counts[PERF_CNTR_NUM]; + int types[PERF_CNTR_NUM]; + int configs[PERF_CNTR_NUM]; + + int cntr_num; + int mode; + int i; + + if (argc < 3) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + mode = atoi(argv[1]); + cntr_num = atoi(argv[2]); + + /* perse args */ + if (argc < cntr_num * 2 + 2) { + printf("ERROR: Too few arguments.\n"); + usage(); + } + + for (i = 0; i < cntr_num; i++) { + types[i] = atoi(argv[i * 2 + 3]); + configs[i] = atoi(argv[i * 2 + 4]); + } + + /* perf_event_open */ + for (i = 0; i < cntr_num; i++) { + fds[i] = pe_opener(-1, mode, types[i], configs[i], 0); + } + + + /* perf_start */ + for (i = 0; i < cntr_num; i++) { + PERF_BEGIN(fds[i], 0); + } + + calc_task(); + + /* perf_end and read */ + for (i = 0; i < cntr_num; i++) { + PERF_END(fds[i], 0); + PERF_READ(fds[i], &counts[i], sizeof(long long)); + close(fds[i]); + } + + /* print result */ + for (i = 0; i < cntr_num; i++) { + if (types[i] == PERF_TYPE_HARDWARE) { + printf("%s: %16ld\n", + hw_event_names[configs[i]], counts[i]); + } + else if (types[i] == PERF_TYPE_HW_CACHE) { + printf("%s_%s_%s: %16ld\n", + id_names[(configs[i] >> 0) & 0xff], + op_id_names[(configs[i] >> 8) & 0xff], + result_names[(configs[i] >> 16) & 0xff], + counts[i]); + } + } + return 0; +} diff --git a/test/issues/1025/perftool.c b/test/issues/1025/perftool.c new file mode 100644 index 00000000..bc20c967 --- /dev/null +++ b/test/issues/1025/perftool.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include +#include +#include +#include + +//#include "perftool.h" + +#define WORKSIZE (1024 * 1024 * 32) +#define LOOPSIZE 1000000 +#define REP 1000 + +long +perf_event_open(struct perf_event_attr *hw_event, pid_t pid, + int cpu, int group_fd, unsigned long flags) +{ + int ret; + + ret = syscall(__NR_perf_event_open, hw_event, pid, cpu, + group_fd, flags); + return ret; +} + +long +pe_opener(long group_fd, int mode, int type, unsigned long config, int is_group) +{ + struct perf_event_attr pe; + int fd; + long long perf_hw_cache_id; + long long perf_hw_cache_op_id; + long long perf_hw_cache_op_result_id; + + memset(&pe, 0, sizeof(struct perf_event_attr)); + pe.type = type; + pe.size = sizeof(struct perf_event_attr); + pe.config = config; + pe.disabled = 1; + if (mode & 0x01) { + // EXCLUDE EVENTS THAT HAPPEN IN USER-SPACE + pe.exclude_user = 1; + } else { + // INCLUDE EVENTS THAT HAPPEN IN USER-SPACE + pe.exclude_user = 0; + } + if (mode & 0x02) { + // EXCUDE EVENTS THAT HAPPEN IN KERNEL-SPACE + pe.exclude_kernel = 1; + } else { + // INCUDE EVENTS THAT HAPPEN IN KERNEL-SPACE + pe.exclude_kernel = 0; + } + pe.exclude_hv = 1; + if (is_group) { + pe.read_format = PERF_FORMAT_GROUP; + } + + fd = perf_event_open(&pe, 0, -1, group_fd, 0); + + return fd; +} + +long long +hw_cache_build(long long id, long long op_id, long long op_result_id) +{ + return (id) | (op_id << 8) | (op_result_id << 16); +} + +void +memory_task() +{ + char *work = malloc(WORKSIZE); + char *fromaddr; + char *toaddr; + double r; + int offset; + int i; + + for (i = 0; i < LOOPSIZE; i++) { + r = drand48(); + offset = (int)(r * (double)WORKSIZE); + fromaddr = work + offset; + r = drand48(); + offset = (int)(r * (double)WORKSIZE); + toaddr = work + offset; + *toaddr = *fromaddr; + } +} + +void +calc_task() +{ + int i, j; + double tmp; + + for (i = 0; i < REP; i++) { + for (j = 0; j < REP; j++) { + tmp = drand48() * drand48(); + } + } +} diff --git a/test/issues/1025/perftool.h b/test/issues/1025/perftool.h new file mode 100644 index 00000000..baa32cdf --- /dev/null +++ b/test/issues/1025/perftool.h @@ -0,0 +1,118 @@ +#ifndef __PERFTOOL_H__ +#define __PERFTOOL_H__ + +#include +#include +#include +#include + +long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, + int cpu, int group_fd, unsigned long flags); + +long perf_instructions(void); +long perf_count_hw_cache_l1d_read_miss(void); +long perf_count_hw_cache_dtlb_read_miss(void); +long pe_opener(long group_fd, int mode, int type, + unsigned long config, int is_group); +long long hw_cache_build(long long id, long long op_id, + long long op_result_id); +void memory_task(void); +void calc_task(void); + +#define PERF_CNTR_NUM 4 + +#define PERF_BEGIN(fd, opt) do { \ + if (fd > 0) \ + ioctl(fd, PERF_EVENT_IOC_RESET, opt); \ + if (fd > 0) \ + ioctl(fd, PERF_EVENT_IOC_ENABLE, opt); \ +} while (0) + +#define PERF_END(fd, opt) do { \ + if (fd > 0) \ + ioctl(fd, PERF_EVENT_IOC_DISABLE, opt); \ +} while (0) + +#define PERF_START(fd, opt) do { \ + if (fd > 0) \ + ioctl(fd, PERF_EVENT_IOC_ENABLE, opt); \ +} while (0) + +#define PERF_RESET(fd, opt) do { \ + if (fd > 0) \ + ioctl(fd, PERF_EVENT_IOC_RESET, opt); \ +} while (0) + +#define PERF_READ(fd, count, size) do { \ + if (fd > 0) \ + read(fd, count, size); \ +} while (0) + +char *hw_event_names[] = { + "CPU_CYCLES ", + "INSTRUCTIONS ", + "CACHE_REFERENCES ", + "CACHE_MISSES ", + "BRANCH_INSTRUCTIONS ", + "BRANCH_MISSES ", + "BUS_CYCLES ", + "STALLED_CYCLES_FRONTEND", + "STALLED_CYCLES_BACKEND ", + "REF_CPU_CYCLES ", +}; + +char *id_names[] = { + "L1D ", + "L1I ", + "LL ", + "DTLB", + "ITLB", + "BPU ", + "NODE", +}; + +char *op_id_names[] = { + "OP_READ ", + "OP_WRITE ", + "OP_PREFETCH", +}; + +char *result_names[] = { + "ACCESS", + "MISS ", +}; + +long long ids[] = { + PERF_COUNT_HW_CACHE_L1D, + PERF_COUNT_HW_CACHE_L1I, + PERF_COUNT_HW_CACHE_LL, + PERF_COUNT_HW_CACHE_DTLB, + PERF_COUNT_HW_CACHE_ITLB, + PERF_COUNT_HW_CACHE_BPU, + PERF_COUNT_HW_CACHE_NODE, +}; + +long long op_ids[] = { + PERF_COUNT_HW_CACHE_OP_READ, + PERF_COUNT_HW_CACHE_OP_WRITE, + PERF_COUNT_HW_CACHE_OP_PREFETCH, +}; + +long long result_ids[] = { + PERF_COUNT_HW_CACHE_RESULT_ACCESS, + PERF_COUNT_HW_CACHE_RESULT_MISS, +}; + +int hw_configs[] = { + PERF_COUNT_HW_CPU_CYCLES, + PERF_COUNT_HW_INSTRUCTIONS, + PERF_COUNT_HW_CACHE_REFERENCES, + PERF_COUNT_HW_CACHE_MISSES, + PERF_COUNT_HW_BRANCH_INSTRUCTIONS, + PERF_COUNT_HW_BRANCH_MISSES, + PERF_COUNT_HW_BUS_CYCLES, + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND, + PERF_COUNT_HW_STALLED_CYCLES_BACKEND, + PERF_COUNT_HW_REF_CPU_CYCLES, +}; +#endif diff --git a/test/issues/1025/x86_64_result.log b/test/issues/1025/x86_64_result.log new file mode 100644 index 00000000..26f754cb --- /dev/null +++ b/test/issues/1025/x86_64_result.log @@ -0,0 +1,384 @@ +*** C1025T01 ****************************************** +** Linux's result ************************************* +[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: none] +REF_CPU_CYCLES : 48755980 +[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: user] +REF_CPU_CYCLES : 153686 +[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: kernel] +REF_CPU_CYCLES : 48527830 + +** McKernel's result ************************************* +[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: none] +REF_CPU_CYCLES : 48341332 +[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: user] +REF_CPU_CYCLES : 32584 +[type: HARDWARE, counter: HW_REF_CPU_CYCLES, exclude: kernel] +REF_CPU_CYCLES : 48403544 +check user val: 48403544 is IN 43675047.0 - 53380613.0 [OK] +check kernel val: 32584 is IN 0 - 484035.44 [OK] +** C1025T01 PASSED + +*** C1025T02 ****************************************** +** Linux's result ************************************* +[ CASE-A , Leader fd : YES , exclude: none] +REF_CPU_CYCLES : 48236994 +CPU_CYCLES : 48235903 +[ CASE-A , Leader fd : YES , exclude: user] +REF_CPU_CYCLES : 164606 +CPU_CYCLES : 163696 +[ CASE-A , Leader fd : YES , exclude: kernel] +REF_CPU_CYCLES : 48176180 +CPU_CYCLES : 48176171 + +** McKernel's result ************************************* +[ CASE-A , Leader fd : YES , exclude: none] +REF_CPU_CYCLES : 48159124 +CPU_CYCLES : 48158854 +[ CASE-A , Leader fd : YES , exclude: user] +REF_CPU_CYCLES : 33256 +CPU_CYCLES : 34166 +[ CASE-A , Leader fd : YES , exclude: kernel] +REF_CPU_CYCLES : 48114404 +CPU_CYCLES : 48113129 +check user val: 48114404 is IN 43358562.0 - 52993798.0 [OK] +check kernel val: 33256 is IN 0 - 481144.04 [OK] +** C1025T02 PASSED + +*** C1025T03 ****************************************** +** Linux's result ************************************* +[ CASE-B , Leader fd : YES , exclude: none] +REF_CPU_CYCLES : 48421568 +CPU_CYCLES : 48420573 +[ CASE-B , Leader fd : YES , exclude: user] +REF_CPU_CYCLES : 150592 +CPU_CYCLES : 149560 +[ CASE-B , Leader fd : YES , exclude: kernel] +REF_CPU_CYCLES : 48131044 +CPU_CYCLES : 48131051 + +** McKernel's result ************************************* +[ CASE-B , Leader fd : YES , exclude: none] +REF_CPU_CYCLES : 48218332 +CPU_CYCLES : 48217927 +[ CASE-B , Leader fd : YES , exclude: user] +REF_CPU_CYCLES : 26588 +CPU_CYCLES : 27440 +[ CASE-B , Leader fd : YES , exclude: kernel] +REF_CPU_CYCLES : 48184988 +CPU_CYCLES : 48183719 +check user val: 48184988 is IN 43317939.6 - 52944148.4 [OK] +check kernel val: 26588 is IN 0 - 481849.88 [OK] +** C1025T03 PASSED + +*** C1025T04 ****************************************** +** Linux's result ************************************* +[ CASE-C , Leader fd : YES , exclude: none] +REF_CPU_CYCLES : 0 +CPU_CYCLES : 0 +[ CASE-C , Leader fd : YES , exclude: user] +REF_CPU_CYCLES : 0 +CPU_CYCLES : 0 +[ CASE-C , Leader fd : YES , exclude: kernel] +REF_CPU_CYCLES : 0 +CPU_CYCLES : 0 + +** McKernel's result ************************************* +[ CASE-C , Leader fd : YES , exclude: none] +REF_CPU_CYCLES : 0 +CPU_CYCLES : 0 +[ CASE-C , Leader fd : YES , exclude: user] +REF_CPU_CYCLES : 0 +CPU_CYCLES : 0 +[ CASE-C , Leader fd : YES , exclude: kernel] +REF_CPU_CYCLES : 0 +CPU_CYCLES : 0 +check user val: 0 is IN 0 - 0 [OK] +check kernel val: 0 is IN 0 - 0 [OK] +** C1025T04 PASSED + +*** C1025T05 ****************************************** +** Linux's result ************************************* +[ CASE-D , Leader fd : YES , exclude: none] +** Result of 1st read +REF_CPU_CYCLES : 48435452 +CPU_CYCLES : 48434766 +** Result of 2nd read +REF_CPU_CYCLES : 96713214 +CPU_CYCLES : 96712309 +[ CASE-D , Leader fd : YES , exclude: user] +** Result of 1st read +REF_CPU_CYCLES : 167726 +CPU_CYCLES : 167090 +** Result of 2nd read +REF_CPU_CYCLES : 218972 +CPU_CYCLES : 217925 +[ CASE-D , Leader fd : YES , exclude: kernel] +** Result of 1st read +REF_CPU_CYCLES : 48358310 +CPU_CYCLES : 48358416 +** Result of 2nd read +REF_CPU_CYCLES : 96665374 +CPU_CYCLES : 96665155 + +** McKernel's result ************************************* +[ CASE-D , Leader fd : YES , exclude: none] +** Result of 1st read +REF_CPU_CYCLES : 48349424 +CPU_CYCLES : 48350565 +** Result of 2nd read +REF_CPU_CYCLES : 96533776 +CPU_CYCLES : 96534029 +[ CASE-D , Leader fd : YES , exclude: user] +** Result of 1st read +REF_CPU_CYCLES : 120252 +CPU_CYCLES : 123202 +** Result of 2nd read +REF_CPU_CYCLES : 124820 +CPU_CYCLES : 127588 +[ CASE-D , Leader fd : YES , exclude: kernel] +** Result of 1st read +REF_CPU_CYCLES : 48220612 +CPU_CYCLES : 48218625 +** Result of 2nd read +REF_CPU_CYCLES : 96400228 +CPU_CYCLES : 96397658 +check user val 1st: 48220612 is IN 43522479.0 - 53194141.0 [OK] +check kernel val 1st: 120252 is IN 0 - 482206.12 [OK] +check user val 2nd: 96400228 is IN 86998836.6 - 106331911.4 [OK] +check kernel val 2nd: 124820 is IN 0 - 964002.28 [OK] +** C1025T05 PASSED + +*** C1025T06 ****************************************** +** Linux's result ************************************* +[ CASE-E , Leader fd : YES , exclude: none] +REF_CPU_CYCLES : 96772780 +CPU_CYCLES : 96770849 +[ CASE-E , Leader fd : YES , exclude: user] +REF_CPU_CYCLES : 266708 +CPU_CYCLES : 264912 +[ CASE-E , Leader fd : YES , exclude: kernel] +REF_CPU_CYCLES : 96471518 +CPU_CYCLES : 96471732 + +** McKernel's result ************************************* +[ CASE-E , Leader fd : YES , exclude: none] +REF_CPU_CYCLES : 96521304 +CPU_CYCLES : 96520373 +[ CASE-E , Leader fd : YES , exclude: user] +REF_CPU_CYCLES : 28396 +CPU_CYCLES : 29419 +[ CASE-E , Leader fd : YES , exclude: kernel] +REF_CPU_CYCLES : 96486100 +CPU_CYCLES : 96484240 +check user val: 96486100 is IN 86824366.2 - 106118669.8 [OK] +check kernel val: 28396 is IN 0 - 964861.00 [OK] +** C1025T06 PASSED + +*** C1025T07 ****************************************** +** Linux's result ************************************* +[ CASE-F , Leader fd : YES , exclude: none] +REF_CPU_CYCLES : 97312774 +CPU_CYCLES : 97311964 +[ CASE-F , Leader fd : YES , exclude: user] +REF_CPU_CYCLES : 217334 +CPU_CYCLES : 216399 +[ CASE-F , Leader fd : YES , exclude: kernel] +REF_CPU_CYCLES : 96420454 +CPU_CYCLES : 96420276 + +** McKernel's result ************************************* +[ CASE-F , Leader fd : YES , exclude: none] +REF_CPU_CYCLES : 96623504 +CPU_CYCLES : 96624703 +[ CASE-F , Leader fd : YES , exclude: user] +REF_CPU_CYCLES : 122824 +CPU_CYCLES : 129819 +[ CASE-F , Leader fd : YES , exclude: kernel] +REF_CPU_CYCLES : 96483264 +CPU_CYCLES : 96483351 +check user val: 96483264 is IN 86778408.6 - 106062499.4 [OK] +check kernel val: 122824 is IN 0 - 964832.64 [OK] +** C1025T07 PASSED + +*** C1025T08 ****************************************** +** Linux's result ************************************* +[ CASE-A , Leader fd : NO , exclude: none] +CPU_CYCLES : 48327271 +REF_CPU_CYCLES : 48326278 +[ CASE-A , Leader fd : NO , exclude: user] +CPU_CYCLES : 181571 +REF_CPU_CYCLES : 180544 +[ CASE-A , Leader fd : NO , exclude: kernel] +CPU_CYCLES : 48163955 +REF_CPU_CYCLES : 48163934 + +** McKernel's result ************************************* +[ CASE-A , Leader fd : NO , exclude: none] +CPU_CYCLES : 48155129 +REF_CPU_CYCLES : 48155124 +[ CASE-A , Leader fd : NO , exclude: user] +CPU_CYCLES : 35583 +REF_CPU_CYCLES : 34760 +[ CASE-A , Leader fd : NO , exclude: kernel] +CPU_CYCLES : 48127029 +REF_CPU_CYCLES : 48128300 +check user val: 48128300 is IN 43347540.6 - 52980327.4 [OK] +check kernel val: 34760 is IN 0 - 481283.00 [OK] +** C1025T08 PASSED + +*** C1025T09 ****************************************** +** Linux's result ************************************* +[ CASE-B , Leader fd : NO , exclude: none] +CPU_CYCLES : 48449221 +REF_CPU_CYCLES : 48448270 +[ CASE-B , Leader fd : NO , exclude: user] +CPU_CYCLES : 155589 +REF_CPU_CYCLES : 154544 +[ CASE-B , Leader fd : NO , exclude: kernel] +CPU_CYCLES : 48160727 +REF_CPU_CYCLES : 48160710 + +** McKernel's result ************************************* +[ CASE-B , Leader fd : NO , exclude: none] +CPU_CYCLES : 48217557 +REF_CPU_CYCLES : 48218028 +[ CASE-B , Leader fd : NO , exclude: user] +CPU_CYCLES : 31206 +REF_CPU_CYCLES : 30500 +[ CASE-B , Leader fd : NO , exclude: kernel] +CPU_CYCLES : 48185577 +REF_CPU_CYCLES : 48186852 +check user val: 48186852 is IN 43344639.0 - 52976781.0 [OK] +check kernel val: 30500 is IN 0 - 481868.52 [OK] +** C1025T09 PASSED + +*** C1025T10 ****************************************** +** Linux's result ************************************* +[ CASE-C , Leader fd : NO , exclude: none] +CPU_CYCLES : 0 +REF_CPU_CYCLES : 0 +[ CASE-C , Leader fd : NO , exclude: user] +CPU_CYCLES : 0 +REF_CPU_CYCLES : 0 +[ CASE-C , Leader fd : NO , exclude: kernel] +CPU_CYCLES : 0 +REF_CPU_CYCLES : 0 + +** McKernel's result ************************************* +[ CASE-C , Leader fd : NO , exclude: none] +CPU_CYCLES : 0 +REF_CPU_CYCLES : 0 +[ CASE-C , Leader fd : NO , exclude: user] +CPU_CYCLES : 0 +REF_CPU_CYCLES : 0 +[ CASE-C , Leader fd : NO , exclude: kernel] +CPU_CYCLES : 0 +REF_CPU_CYCLES : 0 +check user val: 0 is IN 0 - 0 [OK] +check kernel val: 0 is IN 0 - 0 [OK] +** C1025T10 PASSED + +*** C1025T11 ****************************************** +** Linux's result ************************************* +[ CASE-D , Leader fd : NO , exclude: none] +** Result of 1st read +CPU_CYCLES : 48495513 +REF_CPU_CYCLES : 48494706 +** Result of 2nd read +CPU_CYCLES : 96769906 +REF_CPU_CYCLES : 96768906 +[ CASE-D , Leader fd : NO , exclude: user] +** Result of 1st read +CPU_CYCLES : 167295 +REF_CPU_CYCLES : 166634 +** Result of 2nd read +CPU_CYCLES : 218489 +REF_CPU_CYCLES : 217958 +[ CASE-D , Leader fd : NO , exclude: kernel] +** Result of 1st read +CPU_CYCLES : 48240264 +REF_CPU_CYCLES : 48240270 +** Result of 2nd read +CPU_CYCLES : 96429199 +REF_CPU_CYCLES : 96429060 + +** McKernel's result ************************************* +[ CASE-D , Leader fd : NO , exclude: none] +** Result of 1st read +CPU_CYCLES : 48432773 +REF_CPU_CYCLES : 48433336 +** Result of 2nd read +CPU_CYCLES : 96650562 +REF_CPU_CYCLES : 96651624 +[ CASE-D , Leader fd : NO , exclude: user] +** Result of 1st read +CPU_CYCLES : 134833 +REF_CPU_CYCLES : 133472 +** Result of 2nd read +CPU_CYCLES : 139726 +REF_CPU_CYCLES : 138260 +[ CASE-D , Leader fd : NO , exclude: kernel] +** Result of 1st read +CPU_CYCLES : 48218540 +REF_CPU_CYCLES : 48220536 +** Result of 2nd read +CPU_CYCLES : 96397701 +REF_CPU_CYCLES : 96400280 +check user val 1st: 48220536 is IN 43416243.0 - 53064297.0 [OK] +check kernel val 1st: 133472 is IN 0 - 482205.36 [OK] +check user val 2nd: 96400280 is IN 86786154.0 - 106071966.0 [OK] +check kernel val 2nd: 138260 is IN 0 - 964002.80 [OK] +** C1025T11 PASSED + +*** C1025T12 ****************************************** +** Linux's result ************************************* +[ CASE-E , Leader fd : NO , exclude: none] +CPU_CYCLES : 97011286 +REF_CPU_CYCLES : 97009406 +[ CASE-E , Leader fd : NO , exclude: user] +CPU_CYCLES : 218390 +REF_CPU_CYCLES : 216502 +[ CASE-E , Leader fd : NO , exclude: kernel] +CPU_CYCLES : 96375684 +REF_CPU_CYCLES : 96375526 + +** McKernel's result ************************************* +[ CASE-E , Leader fd : NO , exclude: none] +CPU_CYCLES : 96511772 +REF_CPU_CYCLES : 96512684 +[ CASE-E , Leader fd : NO , exclude: user] +CPU_CYCLES : 28379 +REF_CPU_CYCLES : 27540 +[ CASE-E , Leader fd : NO , exclude: kernel] +CPU_CYCLES : 96484648 +REF_CPU_CYCLES : 96486504 +check user val: 96486504 is IN 86737973.4 - 106013078.6 [OK] +check kernel val: 27540 is IN 0 - 964865.04 [OK] +** C1025T12 PASSED + +*** C1025T13 ****************************************** +** Linux's result ************************************* +[ CASE-F , Leader fd : NO , exclude: none] +CPU_CYCLES : 96528511 +REF_CPU_CYCLES : 96527652 +[ CASE-F , Leader fd : NO , exclude: user] +CPU_CYCLES : 209363 +REF_CPU_CYCLES : 208832 +[ CASE-F , Leader fd : NO , exclude: kernel] +CPU_CYCLES : 96227150 +REF_CPU_CYCLES : 96226858 + +** McKernel's result ************************************* +[ CASE-F , Leader fd : NO , exclude: none] +CPU_CYCLES : 96505364 +REF_CPU_CYCLES : 96505988 +[ CASE-F , Leader fd : NO , exclude: user] +CPU_CYCLES : 80671 +REF_CPU_CYCLES : 75140 +[ CASE-F , Leader fd : NO , exclude: kernel] +CPU_CYCLES : 96369863 +REF_CPU_CYCLES : 96369692 +check user val: 96369692 is IN 86604172.2 - 105849543.8 [OK] +check kernel val: 75140 is IN 0 - 963696.92 [OK] +** C1025T13 PASSED +