diff mbox

[v6] validation: system: add validation tests for odp_cpu_cycles_* calls

Message ID 1453122974-8664-1-git-send-email-ivan.khoronzhuk@linaro.org
State Accepted
Commit 8ce30189ae54cc86b2186d807fe8572a642c58e4
Headers show

Commit Message

Ivan Khoronzhuk Jan. 18, 2016, 1:16 p.m. UTC
https://bugs.linaro.org/show_bug.cgi?id=1906

Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@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(+)

Comments

Maxim Uvarov Jan. 18, 2016, 4:02 p.m. UTC | #1
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.savolainen@nokia.com>
>
>
>
>> -----Original Message-----
>> From: EXT Ivan Khoronzhuk [mailto:ivan.khoronzhuk@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.khoronzhuk@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
diff mbox

Patch

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[];