[API-NEXT,v3,4/8] linux-generic: sysinfo: clarify the API for max CPU frequency

Message ID 1436438768-4258-5-git-send-email-hongbo.zhang@freescale.com
State New
Headers show

Commit Message

hongbo.zhang@freescale.com July 9, 2015, 10:46 a.m.
From: Hongbo Zhang <hongbo.zhang@linaro.org>

Currently the API to get CPU frequency is vague, it needs to be clarified
whether max or current frequency is returned, and now most use cases want
to get max capacity of CPU in fact, so this patch makes it clear that the
cpu_hz stand for max CPU frequency. (there is no need to store current
instant frequency)

Accordingly the API odp_cpu_hz() is renamed to odp_cpu_hz_max().

While there may still be some use case of acquiring the current CPU
frequency, so the previous odp_cpu_hz() will be re-implemented for this
purpose in the next patch.

As to platforms other than x86, if their cpu_hz's don't stand for max CPU
frequency, they should be changed following up this patch, and then max or
current frequency of CPU should be clear.

Signed-off-by: Hongbo Zhang <hongbo.zhang@linaro.org>
---
 example/classifier/odp_classifier.c          |  2 +-
 example/generator/odp_generator.c            |  2 +-
 example/ipsec/odp_ipsec.c                    |  2 +-
 example/packet/odp_pktio.c                   |  2 +-
 example/timer/odp_timer_test.c               |  4 ++--
 include/odp/api/cpu.h                        |  6 ++++--
 platform/linux-generic/arch/linux/odp_time.c |  2 +-
 platform/linux-generic/odp_system_info.c     | 22 +++++++---------------
 platform/linux-generic/odp_time.c            |  4 ++--
 test/api_test/odp_common.c                   |  2 +-
 test/performance/odp_atomic.c                |  2 +-
 test/performance/odp_l2fwd.c                 |  2 +-
 test/performance/odp_scheduling.c            |  2 +-
 test/validation/ver_abt_log_dbg/odp_system.c |  6 +++---
 14 files changed, 27 insertions(+), 33 deletions(-)

Patch

diff --git a/example/classifier/odp_classifier.c b/example/classifier/odp_classifier.c
index c695741..25670b2 100644
--- a/example/classifier/odp_classifier.c
+++ b/example/classifier/odp_classifier.c
@@ -728,7 +728,7 @@  static void print_info(char *progname, appl_args_t *appl_args)
 			"CPU count:       %i\n"
 			"\n",
 			odp_version_api_str(), odp_cpu_model_str(),
-			odp_cpu_hz(), odp_sys_cache_line_size(),
+			odp_cpu_hz_max(), odp_sys_cache_line_size(),
 			odp_cpu_count());
 
 	printf("Running ODP appl: \"%s\"\n"
diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c
index 8920146..d847008 100644
--- a/example/generator/odp_generator.c
+++ b/example/generator/odp_generator.c
@@ -978,7 +978,7 @@  static void print_info(char *progname, appl_args_t *appl_args)
 	       "Cache line size: %i\n"
 	       "CPU count:       %i\n"
 	       "\n",
-	       odp_version_api_str(), odp_cpu_model_str(), odp_cpu_hz(),
+	       odp_version_api_str(), odp_cpu_model_str(), odp_cpu_hz_max(),
 	       odp_sys_cache_line_size(), odp_cpu_count());
 
 	printf("Running ODP appl: \"%s\"\n"
diff --git a/example/ipsec/odp_ipsec.c b/example/ipsec/odp_ipsec.c
index 5fcc9dd..58ff99a 100644
--- a/example/ipsec/odp_ipsec.c
+++ b/example/ipsec/odp_ipsec.c
@@ -1517,7 +1517,7 @@  static void print_info(char *progname, appl_args_t *appl_args)
 	       "Cache line size: %i\n"
 	       "CPU count:       %i\n"
 	       "\n",
-	       odp_version_api_str(), odp_cpu_model_str(), odp_cpu_hz(),
+	       odp_version_api_str(), odp_cpu_model_str(), odp_cpu_hz_max(),
 	       odp_sys_cache_line_size(), odp_cpu_count());
 
 	printf("Running ODP appl: \"%s\"\n"
diff --git a/example/packet/odp_pktio.c b/example/packet/odp_pktio.c
index d0b6e7c..deaa5a0 100644
--- a/example/packet/odp_pktio.c
+++ b/example/packet/odp_pktio.c
@@ -626,7 +626,7 @@  static void print_info(char *progname, appl_args_t *appl_args)
 	       "Cache line size: %i\n"
 	       "CPU count:       %i\n"
 	       "\n",
-	       odp_version_api_str(), odp_cpu_model_str(), odp_cpu_hz(),
+	       odp_version_api_str(), odp_cpu_model_str(), odp_cpu_hz_max(),
 	       odp_sys_cache_line_size(), odp_cpu_count());
 
 	printf("Running ODP appl: \"%s\"\n"
diff --git a/example/timer/odp_timer_test.c b/example/timer/odp_timer_test.c
index 01abe04..0bd1a7e 100644
--- a/example/timer/odp_timer_test.c
+++ b/example/timer/odp_timer_test.c
@@ -365,7 +365,7 @@  int main(int argc, char *argv[])
 	printf("---------------\n");
 	printf("ODP API version: %s\n",        odp_version_api_str());
 	printf("CPU model:       %s\n",        odp_cpu_model_str());
-	printf("CPU freq (hz):   %"PRIu64"\n", odp_cpu_hz());
+	printf("CPU freq (hz):   %"PRIu64"\n", odp_cpu_hz_max());
 	printf("Cache line size: %i\n",        odp_sys_cache_line_size());
 	printf("Max CPU count:   %i\n",        odp_cpu_count());
 
@@ -463,7 +463,7 @@  int main(int argc, char *argv[])
 		return -1;
 	}
 
-	printf("CPU freq %"PRIu64" Hz\n", odp_cpu_hz());
+	printf("CPU freq %"PRIu64" Hz\n", odp_cpu_hz_max());
 	printf("Cycles vs nanoseconds:\n");
 	ns = 0;
 	cycles = odp_time_ns_to_cycles(ns);
diff --git a/include/odp/api/cpu.h b/include/odp/api/cpu.h
index 7b548ce..56efe14 100644
--- a/include/odp/api/cpu.h
+++ b/include/odp/api/cpu.h
@@ -44,11 +44,13 @@  int odp_cpu_id(void);
 int odp_cpu_count(void);
 
 /**
- * CPU frequency in Hz
+ * Maximum CPU frequency in Hz
+ *
+ * Returns maximum frequency of this CPU
  *
  * @return CPU frequency in Hz
  */
-uint64_t odp_cpu_hz(void);
+uint64_t odp_cpu_hz_max(void);
 
 /**
  * CPU model name
diff --git a/platform/linux-generic/arch/linux/odp_time.c b/platform/linux-generic/arch/linux/odp_time.c
index 3309da0..ed6e560 100644
--- a/platform/linux-generic/arch/linux/odp_time.c
+++ b/platform/linux-generic/arch/linux/odp_time.c
@@ -28,7 +28,7 @@  uint64_t odp_time_cycles(void)
 	if (ret != 0)
 		ODP_ABORT("clock_gettime failed\n");
 
-	hz  = odp_cpu_hz();
+	hz  = odp_cpu_hz_max();
 	sec = (uint64_t) time.tv_sec;
 	ns  = (uint64_t) time.tv_nsec;
 
diff --git a/platform/linux-generic/odp_system_info.c b/platform/linux-generic/odp_system_info.c
index 26fe2c8..225deea 100644
--- a/platform/linux-generic/odp_system_info.c
+++ b/platform/linux-generic/odp_system_info.c
@@ -120,35 +120,27 @@  static int cpuinfo_x86(FILE *file, odp_system_info_t *sysinfo)
 {
 	char str[1024];
 	char *pos;
-	double mhz = 0.0;
+	double ghz = 0.0;
 	int model = 0;
-	int count = 2;
+	int count = 1;
 
 	while (fgets(str, sizeof(str), file) != NULL && count > 0) {
-		if (!mhz) {
-			pos = strstr(str, "cpu MHz");
-			if (pos) {
-				sscanf(pos, "cpu MHz : %lf", &mhz);
-				count--;
-			}
-		}
-
 		if (!model) {
 			pos = strstr(str, "model name");
 			if (pos) {
-				int len;
 				pos = strchr(str, ':');
 				strncpy(sysinfo->model_str[0], pos + 2,
 					sizeof(sysinfo->model_str[0]));
-				len = strlen(sysinfo->model_str[0]);
-				sysinfo->model_str[0][len - 1] = 0;
+				pos = strchr(sysinfo->model_str[0], '@');
+				*(pos - 1) = '\0';
+				sscanf(pos, "@ %lfGHz", &ghz);
 				model = 1;
 				count--;
 			}
 		}
 	}
 
-	sysinfo->cpu_hz[0] = (uint64_t)(mhz * 1000000.0);
+	sysinfo->cpu_hz[0] = (uint64_t)(ghz * 1000000000.0);
 
 	return 0;
 }
@@ -373,7 +365,7 @@  int odp_system_info_init(void)
  * Public access functions
  *************************
  */
-uint64_t odp_cpu_hz(void)
+uint64_t odp_cpu_hz_max(void)
 {
 	return odp_global_data.system_info.cpu_hz[0];
 }
diff --git a/platform/linux-generic/odp_time.c b/platform/linux-generic/odp_time.c
index a137a36..f864ade 100644
--- a/platform/linux-generic/odp_time.c
+++ b/platform/linux-generic/odp_time.c
@@ -23,7 +23,7 @@  uint64_t odp_time_diff_cycles(uint64_t t1, uint64_t t2)
 
 uint64_t odp_time_cycles_to_ns(uint64_t cycles)
 {
-	uint64_t hz = odp_cpu_hz();
+	uint64_t hz = odp_cpu_hz_max();
 
 	if (cycles > (UINT64_MAX / GIGA))
 		return (cycles/hz)*GIGA;
@@ -34,7 +34,7 @@  uint64_t odp_time_cycles_to_ns(uint64_t cycles)
 
 uint64_t odp_time_ns_to_cycles(uint64_t ns)
 {
-	uint64_t hz = odp_cpu_hz();
+	uint64_t hz = odp_cpu_hz_max();
 
 	if (ns > (UINT64_MAX / hz))
 		return (ns/GIGA)*hz;
diff --git a/test/api_test/odp_common.c b/test/api_test/odp_common.c
index 0a2b184..a5f09f2 100644
--- a/test/api_test/odp_common.c
+++ b/test/api_test/odp_common.c
@@ -42,7 +42,7 @@  void odp_print_system_info(void)
 	printf("---------------\n");
 	printf("ODP API version: %s\n",        odp_version_api_str());
 	printf("CPU model:       %s\n",        odp_cpu_model_str());
-	printf("CPU freq (hz):   %"PRIu64"\n", odp_cpu_hz());
+	printf("CPU freq (hz):   %"PRIu64"\n", odp_cpu_hz_max());
 	printf("Cache line size: %i\n",        odp_sys_cache_line_size());
 	printf("CPU count:       %i\n",        odp_cpu_count());
 	printf("CPU mask:        %s\n",        str);
diff --git a/test/performance/odp_atomic.c b/test/performance/odp_atomic.c
index 7fcd0b0..d741d05 100644
--- a/test/performance/odp_atomic.c
+++ b/test/performance/odp_atomic.c
@@ -338,7 +338,7 @@  void odp_print_system_info(void)
 	printf("---------------\n");
 	printf("ODP API version: %s\n",        odp_version_api_str());
 	printf("CPU model:       %s\n",        odp_cpu_model_str());
-	printf("CPU freq (hz):   %"PRIu64"\n", odp_cpu_hz());
+	printf("CPU freq (hz):   %"PRIu64"\n", odp_cpu_hz_max());
 	printf("Cache line size: %i\n",        odp_sys_cache_line_size());
 	printf("CPU count:       %i\n",        odp_cpu_count());
 	printf("CPU mask:        %s\n",        str);
diff --git a/test/performance/odp_l2fwd.c b/test/performance/odp_l2fwd.c
index 877be14..4e83975 100644
--- a/test/performance/odp_l2fwd.c
+++ b/test/performance/odp_l2fwd.c
@@ -639,7 +639,7 @@  static void print_info(char *progname, appl_args_t *appl_args)
 	       "Cache line size: %i\n"
 	       "CPU count:       %i\n"
 	       "\n",
-	       odp_version_api_str(), odp_cpu_model_str(), odp_cpu_hz(),
+	       odp_version_api_str(), odp_cpu_model_str(), odp_cpu_hz_max(),
 	       odp_sys_cache_line_size(), odp_cpu_count());
 
 	printf("Running ODP appl: \"%s\"\n"
diff --git a/test/performance/odp_scheduling.c b/test/performance/odp_scheduling.c
index 69e74f4..bef3172 100644
--- a/test/performance/odp_scheduling.c
+++ b/test/performance/odp_scheduling.c
@@ -870,7 +870,7 @@  int main(int argc, char *argv[])
 	printf("---------------\n");
 	printf("ODP API version: %s\n",        odp_version_api_str());
 	printf("CPU model:       %s\n",        odp_cpu_model_str());
-	printf("CPU freq (hz):   %"PRIu64"\n", odp_cpu_hz());
+	printf("CPU freq (hz):   %"PRIu64"\n", odp_cpu_hz_max());
 	printf("Cache line size: %i\n",        odp_sys_cache_line_size());
 	printf("Max CPU count:   %i\n",        odp_cpu_count());
 
diff --git a/test/validation/ver_abt_log_dbg/odp_system.c b/test/validation/ver_abt_log_dbg/odp_system.c
index 22e8db3..9058c6c 100644
--- a/test/validation/ver_abt_log_dbg/odp_system.c
+++ b/test/validation/ver_abt_log_dbg/odp_system.c
@@ -74,18 +74,18 @@  static void test_odp_sys_huge_page_size(void)
 	CU_ASSERT(0 < page);
 }
 
-static void test_odp_cpu_hz(void)
+static void test_odp_cpu_hz_max(void)
 {
 	uint64_t hz;
 
-	hz = odp_cpu_hz();
+	hz = odp_cpu_hz_max();
 	CU_ASSERT(0 < hz);
 }
 
 CU_TestInfo test_odp_system[] = {
 	{"odp version",  test_odp_version_numbers},
 	{"odp_cpu_count",  test_odp_cpu_count},
-	{"odp_cpu_hz",  test_odp_cpu_hz},
+	{"odp_cpu_hz_max",  test_odp_cpu_hz_max},
 	{"odp_cpu_model_str",  test_odp_cpu_model_str},
 	{"odp_sys_cache_line_size",  test_odp_sys_cache_line_size},
 	{"odp_sys_page_size",  test_odp_sys_page_size},