Merged.

On 01/18/2016 16:40, Savolainen, Petri (Nokia - FI/Espoo) wrote:
Not sure if "odp_cpu_cycles_*" will cause problems in git log history. May be Maxim can 
remove the '*' from the string during merge (e.g. just "... cpu_cycles calls").
done.

Reviewed-by: Petri Savolainen <petri.savolai...@nokia.com>



-----Original Message-----
From: EXT Ivan Khoronzhuk [mailto:ivan.khoronz...@linaro.org]
Sent: Monday, January 18, 2016 3:16 PM
To: lng-odp@lists.linaro.org
Cc: Savolainen, Petri (Nokia - FI/Espoo); Ivan Khoronzhuk
Subject: [lng-odp] [PATCH v6] validation: system: add validation tests for
odp_cpu_cycles_* calls

https://bugs.linaro.org/show_bug.cgi?id=1906

Signed-off-by: Ivan Khoronzhuk <ivan.khoronz...@linaro.org>
---
Since v5:
- add res instead of "1" while wrap
- get cycle stamps a multiple of res instead direct valuues.
- move resolution test before diff test

Since v3:
- modified log "wrap is not detected"
- increased try num for diff to match 16 seconds
- decreased try num for resolution to match 1 second
- allow resolution to be up to max / 1024
- correct wrap detection for resolution

Since v2:
- added c <= max
- replaced etalon on tmp
- added msg about skip
- handled resolution wrap

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch validation_tests_corrections
# Changes to be committed:
#       modified:   platform/linux-keystone2/odp_crypto.c
#       modified:   test/validation/system/system.c
#
# Changes not staged for commit:
#       modified:   platform/linux-keystone2/odp_schedule.c
#
# Untracked files:
#       .checkpatch-camelcase.git.81a3df4
#       example/traffic_mgmt/
#

  test/validation/system/system.c | 125
++++++++++++++++++++++++++++++++++++++++
  test/validation/system/system.h |   4 ++
  2 files changed, 129 insertions(+)

diff --git a/test/validation/system/system.c
b/test/validation/system/system.c
index 7dc2cc0..7f54338 100644
--- a/test/validation/system/system.c
+++ b/test/validation/system/system.c
@@ -10,6 +10,9 @@
  #include "test_debug.h"
  #include "system.h"

+#define DIFF_TRY_NUM                   160
+#define RES_TRY_NUM                    10
+
  void system_test_odp_version_numbers(void)
  {
        int char_ok = 0;
@@ -40,6 +43,124 @@ void system_test_odp_cpu_count(void)
        CU_ASSERT(0 < cpus);
  }

+void system_test_odp_cpu_cycles(void)
+{
+       uint64_t c2, c1;
+
+       c1 = odp_cpu_cycles();
+       odp_time_wait_ns(100);
+       c2 = odp_cpu_cycles();
+
+       CU_ASSERT(c2 != c1);
+}
+
+void system_test_odp_cpu_cycles_max(void)
+{
+       uint64_t c2, c1;
+       uint64_t max1, max2;
+
+       max1 = odp_cpu_cycles_max();
+       odp_time_wait_ns(100);
+       max2 = odp_cpu_cycles_max();
+
+       CU_ASSERT(max1 >= UINT32_MAX / 2);
+       CU_ASSERT(max1 == max2);
+
+       c1 = odp_cpu_cycles();
+       odp_time_wait_ns(1000);
+       c2 = odp_cpu_cycles();
+
+       CU_ASSERT(c1 <= max1 && c2 <= max1);
+}
+
+void system_test_odp_cpu_cycles_resolution(void)
+{
+       int i;
+       uint64_t res;
+       uint64_t c2, c1, max;
+
+       max = odp_cpu_cycles_max();
+
+       res = odp_cpu_cycles_resolution();
+       CU_ASSERT(res != 0);
+       CU_ASSERT(res < max / 1024);
+
+       for (i = 0; i < RES_TRY_NUM; i++) {
+               c1 = odp_cpu_cycles();
+               odp_time_wait_ns(100 * ODP_TIME_MSEC_IN_NS + i);
+               c2 = odp_cpu_cycles();
+
+               CU_ASSERT(c1 % res == 0);
+               CU_ASSERT(c2 % res == 0);
+       }
+}
+
+void system_test_odp_cpu_cycles_diff(void)
+{
+       int i;
+       uint64_t c2, c1, c3, max;
+       uint64_t tmp, diff, res;
+
+       res = odp_cpu_cycles_resolution();
+       max = odp_cpu_cycles_max();
+
+       /* check resolution for wrap */
+       c1 = max - 2 * res;
+       do
+               c2 = odp_cpu_cycles();
+       while (c1 < c2);
+
+       diff = odp_cpu_cycles_diff(c1, c1);
+       CU_ASSERT(diff == 0);
+
+       /* wrap */
+       tmp = c2 + (max - c1) + res;
+       diff = odp_cpu_cycles_diff(c2, c1);
+       CU_ASSERT(diff == tmp);
+       CU_ASSERT(diff % res == 0);
+
+       /* no wrap, revert args */
+       tmp = c1 - c2;
+       diff = odp_cpu_cycles_diff(c1, c2);
+       CU_ASSERT(diff == tmp);
+       CU_ASSERT(diff % res == 0);
+
+       c3 = odp_cpu_cycles();
+       for (i = 0; i < DIFF_TRY_NUM; i++) {
+               c1 = odp_cpu_cycles();
+               odp_time_wait_ns(100 * ODP_TIME_MSEC_IN_NS + i);
+               c2 = odp_cpu_cycles();
+
+               CU_ASSERT(c2 != c1);
+               CU_ASSERT(c1 % res == 0);
+               CU_ASSERT(c2 % res == 0);
+               CU_ASSERT(c1 <= max && c2 <= max);
+
+               if (c2 > c1)
+                       tmp = c2 - c1;
+               else
+                       tmp = c2 + (max - c1) + res;
+
+               diff = odp_cpu_cycles_diff(c2, c1);
+               CU_ASSERT(diff == tmp);
+               CU_ASSERT(diff % res == 0);
+
+               /* wrap is detected and verified */
+               if (c2 < c1)
+                       break;
+       }
+
+       /* wrap was detected, no need to continue */
+       if (i < DIFF_TRY_NUM)
+               return;
+
+       /* wrap has to be detected if possible */
+       CU_ASSERT(max > UINT32_MAX);
+       CU_ASSERT((max - c3) > UINT32_MAX);
+
+       printf("wrap was not detected...");
+}
+
  void system_test_odp_sys_cache_line_size(void)
  {
        uint64_t cache_size;
@@ -91,6 +212,10 @@ odp_testinfo_t system_suite[] = {
        ODP_TEST_INFO(system_test_odp_sys_page_size),
        ODP_TEST_INFO(system_test_odp_sys_huge_page_size),
        ODP_TEST_INFO(system_test_odp_sys_cpu_hz),
+       ODP_TEST_INFO(system_test_odp_cpu_cycles),
+       ODP_TEST_INFO(system_test_odp_cpu_cycles_max),
+       ODP_TEST_INFO(system_test_odp_cpu_cycles_resolution),
+       ODP_TEST_INFO(system_test_odp_cpu_cycles_diff),
        ODP_TEST_INFO_NULL,
  };

diff --git a/test/validation/system/system.h
b/test/validation/system/system.h
index 869aaff..0c263f2 100644
--- a/test/validation/system/system.h
+++ b/test/validation/system/system.h
@@ -17,6 +17,10 @@ void system_test_odp_sys_cpu_model_str(void);
  void system_test_odp_sys_page_size(void);
  void system_test_odp_sys_huge_page_size(void);
  void system_test_odp_sys_cpu_hz(void);
+void system_test_odp_cpu_cycles_max(void);
+void system_test_odp_cpu_cycles(void);
+void system_test_odp_cpu_cycles_diff(void);
+void system_test_odp_cpu_cycles_resolution(void);

  /* test arrays: */
  extern odp_testinfo_t system_suite[];
--
1.9.1
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to