From patchwork Mon Nov 23 21:20:52 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Khoronzhuk X-Patchwork-Id: 57201 Delivered-To: patch@linaro.org Received: by 10.112.155.196 with SMTP id vy4csp1685129lbb; Mon, 23 Nov 2015 13:23:37 -0800 (PST) X-Received: by 10.55.80.134 with SMTP id e128mr1040119qkb.90.1448313817719; Mon, 23 Nov 2015 13:23:37 -0800 (PST) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id g189si12964802qhd.50.2015.11.23.13.23.37; Mon, 23 Nov 2015 13:23:37 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) client-ip=54.225.227.206; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dkim=neutral (body hash did not verify) header.i=@linaro-org.20150623.gappssmtp.com Received: by lists.linaro.org (Postfix, from userid 109) id 4B0D961CE1; Mon, 23 Nov 2015 21:23:37 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, T_DKIM_INVALID, URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 09B3461CFB; Mon, 23 Nov 2015 21:21:17 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id C2F0161CDE; Mon, 23 Nov 2015 21:21:10 +0000 (UTC) Received: from mail-lf0-f53.google.com (mail-lf0-f53.google.com [209.85.215.53]) by lists.linaro.org (Postfix) with ESMTPS id D293F61CB3 for ; Mon, 23 Nov 2015 21:21:06 +0000 (UTC) Received: by lfaz4 with SMTP id z4so120288500lfa.0 for ; Mon, 23 Nov 2015 13:21:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=i6EPbneTkOy2PXQbqHSdU2Bd6G0RQNKcQ5wJwtt97zE=; b=plNkYOW0fyBIJL5gZvvneupYR/SvnnekPeJ0gjYmfGmL8qf51a7mD/I33DojPVtPUS Y2/AaDf71bNMX7QoefwSyJfD+Gfxe6i9xx3JJN51ye/ocX026YN2xEV1IrM5JfYSA0bg 0yZhjjDitM0r5/IAHekk+ko6lyJLGrnk/zmvt1eh5UweXmBXOJTt+EsknPFgc6y551n7 BH1pJCfyRN7KMV968P5cDlS1gJJJZePRx4xgDnJazBedR/ut2jQ/+Rr2cP5kujoeQ2xn ztJttuoL7/xpl17+EWofTfTAojCKb7r0OXLnHPXiwZLCyUO5YnzdmyTfuYwG+qDn7b39 3hZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=i6EPbneTkOy2PXQbqHSdU2Bd6G0RQNKcQ5wJwtt97zE=; b=h1KEcIwzlGHiWy2wlAyv3P5CVJFVyq8FZSPuL7jq7af8BP5eqOCOD81y3HaiDo6Gvr F0DAQkRjsijpkG6KrcJCYNDkPSLMXwjaqP0ib8WAPAX82ZrgvSwkugHF5ZZEWGfMhhh3 Ror2jybjs62XDsiW7LVHTAoc8zc1uw6qN7cZ95h6UIfSv8xDzl/HcBKX89DJo2/hkAMV Psof1I33rBUruvA2fmwRc6s3DFLS+O8yAw+R6xR0L1bqhARE4PAsoTyTtn3qvVxoxBR2 B+HpjpE5JGGzMqXCXgwBXUNKmVHAKX8hrY9h8KL2VmtDkue7zkAa7DzyHgBgfor1v23C ftgQ== X-Gm-Message-State: ALoCoQl0VlIyVxGs9WhivmgefjgglLirekxYg8KhUF23xB3A0s4NY9Cr4ndOWscNrYg3ExpoP4C3 X-Received: by 10.25.28.70 with SMTP id c67mr9972443lfc.95.1448313665710; Mon, 23 Nov 2015 13:21:05 -0800 (PST) Received: from localhost.localdomain ([212.90.60.8]) by smtp.gmail.com with ESMTPSA id r2sm2122027lfe.28.2015.11.23.13.21.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 23 Nov 2015 13:21:05 -0800 (PST) From: Ivan Khoronzhuk To: lng-odp@lists.linaro.org Date: Mon, 23 Nov 2015 23:20:52 +0200 Message-Id: <1448313655-7949-5-git-send-email-ivan.khoronzhuk@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1448313655-7949-1-git-send-email-ivan.khoronzhuk@linaro.org> References: <1448313655-7949-1-git-send-email-ivan.khoronzhuk@linaro.org> X-Topics: patch Subject: [lng-odp] [API-NEXT PATCH v3 4/7] linux-generic: odp_time: don't use cpu cycle API to get time X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" The linux-generic time API implementation shouldn't depend on cpu cycle API wich is not stable enough to measure time period due to dynamic frequency scaling. Signed-off-by: Ivan Khoronzhuk --- platform/linux-generic/Makefile.am | 1 - .../linux-generic/include/odp/plat/time_types.h | 6 +- platform/linux-generic/include/odp_cpu_internal.h | 29 ------- platform/linux-generic/odp_cpu.c | 6 +- platform/linux-generic/odp_time.c | 99 +++++++++++++--------- 5 files changed, 67 insertions(+), 74 deletions(-) delete mode 100644 platform/linux-generic/include/odp_cpu_internal.h diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am index a6b6029..3a2603f 100644 --- a/platform/linux-generic/Makefile.am +++ b/platform/linux-generic/Makefile.am @@ -147,7 +147,6 @@ noinst_HEADERS = \ ${srcdir}/include/odp_schedule_internal.h \ ${srcdir}/include/odp_spin_internal.h \ ${srcdir}/include/odp_timer_internal.h \ - ${srcdir}/include/odp_cpu_internal.h \ ${srcdir}/Makefile.inc __LIB__libodp_la_SOURCES = \ diff --git a/platform/linux-generic/include/odp/plat/time_types.h b/platform/linux-generic/include/odp/plat/time_types.h index 9ba1508..e5765ec 100644 --- a/platform/linux-generic/include/odp/plat/time_types.h +++ b/platform/linux-generic/include/odp/plat/time_types.h @@ -21,9 +21,11 @@ extern "C" { * @{ **/ -typedef uint64_t odp_time_t; +typedef struct timespec odp_time_t; -#define ODP_TIME_NULL ((odp_time_t)0) +odp_time_t odp_time_null(void); + +#define ODP_TIME_NULL odp_time_null() /** * @} diff --git a/platform/linux-generic/include/odp_cpu_internal.h b/platform/linux-generic/include/odp_cpu_internal.h deleted file mode 100644 index 664e2df..0000000 --- a/platform/linux-generic/include/odp_cpu_internal.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2015, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef ODP_CPU_INTERNAL_H_ -#define ODP_CPU_INTERNAL_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -static inline -uint64_t _odp_cpu_cycles_diff(uint64_t c2, uint64_t c1) -{ - if (odp_likely(c2 >= c1)) - return c2 - c1; - - return c2 + (odp_cpu_cycles_max() - c1) + 1; -} - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/platform/linux-generic/odp_cpu.c b/platform/linux-generic/odp_cpu.c index 636f811..4bd6a9a 100644 --- a/platform/linux-generic/odp_cpu.c +++ b/platform/linux-generic/odp_cpu.c @@ -6,9 +6,11 @@ #include #include -#include uint64_t odp_cpu_cycles_diff(uint64_t c2, uint64_t c1) { - return _odp_cpu_cycles_diff(c2, c1); + if (odp_likely(c2 >= c1)) + return c2 - c1; + + return c2 + (odp_cpu_cycles_max() - c1) + 1; } diff --git a/platform/linux-generic/odp_time.c b/platform/linux-generic/odp_time.c index a2e4046..b725086 100644 --- a/platform/linux-generic/odp_time.c +++ b/platform/linux-generic/odp_time.c @@ -6,81 +6,100 @@ #define _POSIX_C_SOURCE 200809L +#include #include #include -#include -#include -#include +#include -#define GIGA 1000000000 - -static inline -uint64_t time_to_tick(odp_time_t time) +odp_time_t odp_time_local(void) { - return (uint64_t)time; -} + int ret; + struct timespec time; -static inline -odp_time_t tick_to_time(uint64_t tick) -{ - return (odp_time_t)tick; -} + ret = clock_gettime(CLOCK_MONOTONIC_RAW, &time); + if (odp_unlikely(ret != 0)) + ODP_ABORT("clock_gettime failed\n"); -odp_time_t odp_time_local(void) -{ - return tick_to_time(odp_cpu_cycles()); + return time; } odp_time_t odp_time_diff(odp_time_t t2, odp_time_t t1) { - return tick_to_time(_odp_cpu_cycles_diff(t2, t1)); + struct timespec time; + + time.tv_sec = t2.tv_sec - t1.tv_sec; + time.tv_nsec = t2.tv_nsec - t1.tv_nsec; + + if (time.tv_nsec < 0) { + time.tv_nsec += ODP_TIME_SEC_IN_NS; + --time.tv_sec; + } + + return time; } uint64_t odp_time_to_ns(odp_time_t time) { - uint64_t hz = odp_cpu_hz_max(); - uint64_t tick = time_to_tick(time); + uint64_t ns; - if (tick > (UINT64_MAX / GIGA)) - return (tick / hz) * GIGA; + ns = time.tv_sec * ODP_TIME_SEC_IN_NS; + ns += time.tv_nsec; - return (tick * GIGA) / hz; + return ns; } - odp_time_t odp_time_local_from_ns(uint64_t ns) { - uint64_t hz = odp_cpu_hz_max(); + struct timespec time; - if (ns > (UINT64_MAX / hz)) - return tick_to_time((ns / GIGA) * hz); + time.tv_sec = ns / ODP_TIME_SEC_IN_NS; + time.tv_nsec = ns % ODP_TIME_SEC_IN_NS; - return tick_to_time((ns * hz) / GIGA); + return time; } int odp_time_cmp(odp_time_t t2, odp_time_t t1) { - uint64_t tick1 = time_to_tick(t1); - uint64_t tick2 = time_to_tick(t2); + if (t2.tv_sec < t1.tv_sec) + return -1; - if (tick1 < tick2) + if (t2.tv_sec > t1.tv_sec) return 1; - if (tick1 > tick2) - return -1; - - return 0; + return t2.tv_nsec - t1.tv_nsec; } odp_time_t odp_time_sum(odp_time_t t1, odp_time_t t2) { - uint64_t tick1 = time_to_tick(t1); - uint64_t tick2 = time_to_tick(t2); + struct timespec time; + + time.tv_sec = t2.tv_sec + t1.tv_sec; + time.tv_nsec = t2.tv_nsec + t1.tv_nsec; + + if (time.tv_nsec >= (long)ODP_TIME_SEC_IN_NS) { + time.tv_nsec -= ODP_TIME_SEC_IN_NS; + ++time.tv_sec; + } + + return time; +} + +uint64_t odp_time_to_u64(odp_time_t time) +{ + int ret; + struct timespec tres; + uint64_t resolution; + + ret = clock_getres(CLOCK_MONOTONIC_RAW, &tres); + if (odp_unlikely(ret != 0)) + ODP_ABORT("clock_getres failed\n"); + + resolution = (uint64_t)tres.tv_nsec; - return tick_to_time(tick1 + tick2); + return odp_time_to_ns(time) / resolution; } -uint64_t odp_time_to_u64(odp_time_t hdl) +odp_time_t odp_time_null(void) { - return time_to_tick(hdl); + return (struct timespec) {0, 0}; }