From 80c90ac3a4dc8c8e50526530cadecb8ae686369d Mon Sep 17 00:00:00 2001 From: Jeffrey Townsend Date: Mon, 19 Sep 2016 20:12:44 +0000 Subject: [PATCH] Support optional API profiling. --- .../any/onlp/src/onlp/module/auto/onlp.yml | 3 + .../src/onlp/module/inc/onlp/onlp_config.h | 10 ++ .../onlp/src/onlp/module/src/onlp_config.c | 5 + .../any/onlp/src/onlp/module/src/onlp_locks.h | 167 ++++++++++++------ 4 files changed, 132 insertions(+), 53 deletions(-) diff --git a/packages/base/any/onlp/src/onlp/module/auto/onlp.yml b/packages/base/any/onlp/src/onlp/module/auto/onlp.yml index 537f00b9..daaff3a3 100644 --- a/packages/base/any/onlp/src/onlp/module/auto/onlp.yml +++ b/packages/base/any/onlp/src/onlp/module/auto/onlp.yml @@ -84,6 +84,9 @@ cdefs: &cdefs - ONLP_CONFIG_INCLUDE_THERMAL_THRESHOLDS: doc: "Include thermal threshold reporting." default: 0 +- ONLP_CONFIG_INCLUDE_API_PROFILING: + doc: "Include API timing profiles." + default: 0 # Error codes onlp_status: &onlp_status diff --git a/packages/base/any/onlp/src/onlp/module/inc/onlp/onlp_config.h b/packages/base/any/onlp/src/onlp/module/inc/onlp/onlp_config.h index 1c7bd70b..c6581f75 100644 --- a/packages/base/any/onlp/src/onlp/module/inc/onlp/onlp_config.h +++ b/packages/base/any/onlp/src/onlp/module/inc/onlp/onlp_config.h @@ -244,6 +244,16 @@ #define ONLP_CONFIG_INCLUDE_THERMAL_THRESHOLDS 0 #endif +/** + * ONLP_CONFIG_INCLUDE_API_PROFILING + * + * Include API timing profiles. */ + + +#ifndef ONLP_CONFIG_INCLUDE_API_PROFILING +#define ONLP_CONFIG_INCLUDE_API_PROFILING 0 +#endif + /** diff --git a/packages/base/any/onlp/src/onlp/module/src/onlp_config.c b/packages/base/any/onlp/src/onlp/module/src/onlp_config.c index 06942b09..7b90cf44 100644 --- a/packages/base/any/onlp/src/onlp/module/src/onlp_config.c +++ b/packages/base/any/onlp/src/onlp/module/src/onlp_config.c @@ -129,6 +129,11 @@ onlp_config_settings_t onlp_config_settings[] = { __onlp_config_STRINGIFY_NAME(ONLP_CONFIG_INCLUDE_THERMAL_THRESHOLDS), __onlp_config_STRINGIFY_VALUE(ONLP_CONFIG_INCLUDE_THERMAL_THRESHOLDS) }, #else { ONLP_CONFIG_INCLUDE_THERMAL_THRESHOLDS(__onlp_config_STRINGIFY_NAME), "__undefined__" }, +#endif +#ifdef ONLP_CONFIG_INCLUDE_API_PROFILING + { __onlp_config_STRINGIFY_NAME(ONLP_CONFIG_INCLUDE_API_PROFILING), __onlp_config_STRINGIFY_VALUE(ONLP_CONFIG_INCLUDE_API_PROFILING) }, +#else +{ ONLP_CONFIG_INCLUDE_API_PROFILING(__onlp_config_STRINGIFY_NAME), "__undefined__" }, #endif { NULL, NULL } }; diff --git a/packages/base/any/onlp/src/onlp/module/src/onlp_locks.h b/packages/base/any/onlp/src/onlp/module/src/onlp_locks.h index dbb0e5e5..0ea6dc13 100644 --- a/packages/base/any/onlp/src/onlp/module/src/onlp_locks.h +++ b/packages/base/any/onlp/src/onlp/module/src/onlp_locks.h @@ -1,21 +1,21 @@ /************************************************************ * - * - * Copyright 2014, 2015 Big Switch Networks, Inc. - * + * + * Copyright 2014, 2015 Big Switch Networks, Inc. + * * Licensed under the Eclipse Public License, Version 1.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.eclipse.org/legal/epl-v10.html - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific * language governing permissions and limitations under the * License. - * + * * ************************************************************ * @@ -64,109 +64,170 @@ void onlp_api_unlock(void); * ONLP API entry points. * ***************************************************************************/ +#include +#include +#include "onlp_log.h" #define ONLP_LOCKED_API_NAME(_name) _name##_locked__ -#define ONLP_LOCKED_API0(_name) \ - int _name (void) \ - { \ - ONLP_API_LOCK(#_name); \ - int _rv = ONLP_LOCKED_API_NAME(_name)(); \ - ONLP_API_UNLOCK(); \ - return _rv; \ +#if ONLP_CONFIG_INCLUDE_API_PROFILING == 1 + +#define ONLP_API_T0(_name) \ + uint64_t t0, t1, t2; t0 = aim_time_monotonic() + +#define ONLP_API_T1(_name) \ + t1 = aim_time_monotonic(); + +#define ONLP_API_T2(_name) \ + do { \ + t2 = aim_time_monotonic(); \ + AIM_LOG_MSG("API '%s' : (total=%"PRId64", ltime=%"PRId64" ftime=%"PRId64")", #_name, t2-t0, t1-t0, t2-t1); \ + } while(0) + +#else + +#define ONLP_API_T0(_name) +#define ONLP_API_T1(_name) +#define ONLP_API_T2(_name) + +#endif + +#define ONLP_LOCKED_API0(_name) \ + int _name (void) \ + { \ + ONLP_API_T0(_name); \ + ONLP_API_LOCK(#_name); \ + ONLP_API_T1(_name); \ + int _rv = ONLP_LOCKED_API_NAME(_name)(); \ + ONLP_API_UNLOCK(); \ + ONLP_API_T2(_name); \ + return _rv; \ } -#define ONLP_LOCKED_API1(_name, _t, _v) \ - int _name (_t _v) \ - { \ - ONLP_API_LOCK(#_name); \ - int _rv = ONLP_LOCKED_API_NAME(_name)(_v); \ - ONLP_API_UNLOCK(); \ - return _rv; \ +#define ONLP_LOCKED_API1(_name, _t, _v) \ + int _name (_t _v) \ + { \ + ONLP_API_T0(_name); \ + ONLP_API_LOCK(#_name); \ + ONLP_API_T1(_name); \ + int _rv = ONLP_LOCKED_API_NAME(_name)(_v); \ + ONLP_API_UNLOCK(); \ + ONLP_API_T2(_name); \ + return _rv; \ } -#define ONLP_LOCKED_API2(_name, _t1, _v1, _t2, _v2) \ - int _name (_t1 _v1, _t2 _v2) \ - { \ - ONLP_API_LOCK(#_name); \ - int _rv = ONLP_LOCKED_API_NAME(_name) (_v1, _v2); \ - ONLP_API_UNLOCK(); \ - return _rv; \ +#define ONLP_LOCKED_API2(_name, _t1, _v1, _t2, _v2) \ + int _name (_t1 _v1, _t2 _v2) \ + { \ + ONLP_API_T0(_name); \ + ONLP_API_LOCK(#_name); \ + ONLP_API_T1(_name); \ + int _rv = ONLP_LOCKED_API_NAME(_name) (_v1, _v2); \ + ONLP_API_UNLOCK(); \ + ONLP_API_T2(_name); \ + return _rv; \ } #define ONLP_LOCKED_API3(_name, _t1, _v1, _t2, _v2, _t3, _v3) \ int _name (_t1 _v1, _t2 _v2, _t3 _v3) \ { \ - ONLP_API_LOCK(#_name); \ + ONLP_API_T0(_name); \ + ONLP_API_LOCK(#_name); \ + ONLP_API_T1(_name); \ int _rv = ONLP_LOCKED_API_NAME(_name) (_v1, _v2, _v3); \ ONLP_API_UNLOCK(); \ + ONLP_API_T2(_name); \ return _rv; \ } #define ONLP_LOCKED_API4(_name, _t1, _v1, _t2, _v2, _t3, _v3, _t4, _v4) \ int _name (_t1 _v1, _t2 _v2, _t3 _v3, _t4 _v4) \ { \ - ONLP_API_LOCK(#_name); \ + ONLP_API_T0(_name); \ + ONLP_API_LOCK(#_name); \ + ONLP_API_T1(_name); \ int _rv = ONLP_LOCKED_API_NAME(_name) (_v1, _v2, _v3, _v4); \ ONLP_API_UNLOCK(); \ + ONLP_API_T2(_name); \ return _rv; \ } #define ONLP_LOCKED_API5(_name, _t1, _v1, _t2, _v2, _t3, _v3, _t4, _v4, _t5, _v5) \ int _name (_t1 _v1, _t2 _v2, _t3 _v3, _t4 _v4, _t5 _v5) \ { \ - ONLP_API_LOCK(#_name); \ + ONLP_API_T0(_name); \ + ONLP_API_LOCK(#_name); \ + ONLP_API_T1(_name); \ int _rv = ONLP_LOCKED_API_NAME(_name) (_v1, _v2, _v3, _v4, _v5); \ ONLP_API_UNLOCK(); \ + ONLP_API_T2(_name); \ return _rv; \ } -#define ONLP_LOCKED_VAPI0(_name) \ - void _name (void) \ - { \ - ONLP_API_LOCK(#_name); \ - ONLP_LOCKED_API_NAME(_name)(); \ - ONLP_API_UNLOCK(); \ - } - -#define ONLP_LOCKED_VAPI1(_name, _t, _v) \ - void _name (_t _v) \ - { \ - ONLP_API_LOCK(#_name); \ - ONLP_LOCKED_API_NAME(_name)(_v); \ - ONLP_API_UNLOCK(); \ - } - -#define ONLP_LOCKED_VAPI2(_name, _t1, _v1, _t2, _v2) \ - void _name (_t1 _v1, _t2 _v2) \ +#define ONLP_LOCKED_VAPI0(_name) \ + void _name (void) \ { \ - ONLP_API_LOCK(#_name); \ - ONLP_LOCKED_API_NAME(_name) (_v1, _v2); \ + ONLP_API_T0(_name); \ + ONLP_API_LOCK(#_name); \ + ONLP_API_T1(_name); \ + ONLP_LOCKED_API_NAME(_name)(); \ ONLP_API_UNLOCK(); \ + ONLP_API_T2(_name); \ + } + +#define ONLP_LOCKED_VAPI1(_name, _t, _v) \ + void _name (_t _v) \ + { \ + ONLP_API_T0(_name); \ + ONLP_API_LOCK(#_name); \ + ONLP_API_T1(_name); \ + ONLP_LOCKED_API_NAME(_name)(_v); \ + ONLP_API_UNLOCK(); \ + ONLP_API_T2(_name); \ + } + +#define ONLP_LOCKED_VAPI2(_name, _t1, _v1, _t2, _v2) \ + void _name (_t1 _v1, _t2 _v2) \ + { \ + ONLP_API_T0(_name); \ + ONLP_API_LOCK(#_name); \ + ONLP_API_T1(_name); \ + ONLP_LOCKED_API_NAME(_name) (_v1, _v2); \ + ONLP_API_UNLOCK(); \ + ONLP_API_T2(_name); \ } #define ONLP_LOCKED_VAPI3(_name, _t1, _v1, _t2, _v2, _t3, _v3) \ void _name (_t1 _v1, _t2 _v2, _t3 _v3) \ { \ - ONLP_API_LOCK(#_name); \ + ONLP_API_T0(_name); \ + ONLP_API_LOCK(#_name); \ + ONLP_API_T1(_name); \ ONLP_LOCKED_API_NAME(_name) (_v1, _v2, _v3); \ ONLP_API_UNLOCK(); \ + ONLP_API_T2_(name); \ } #define ONLP_LOCKED_VAPI4(_name, _t1, _v1, _t2, _v2, _t3, _v3, _t4, _v4) \ void _name (_t1 _v1, _t2 _v2, _t3 _v3, _t4 _v4) \ { \ - ONLP_API_LOCK(#_name); \ + ONLP_API_T0(_name); \ + ONLP_API_LOCK(#_name); \ + ONLP_API_T1(_name); \ ONLP_LOCKED_API_NAME(_name) (_v1, _v2, _v3, _v4); \ ONLP_API_UNLOCK(); \ + ONLP_API_T2(_name); \ } #define ONLP_LOCKED_VAPI5(_name, _t1, _v1, _t2, _v2, _t3, _v3, _t4, _v4, _t5, _v5) \ void _name (_t1 _v1, _t2 _v2, _t3 _v3, _t4 _v4, _t5 _v5) \ { \ - ONLP_API_LOCK(#_name); \ + ONLP_API_T0(_name); \ + ONLP_API_LOCK(#_name); \ + ONLP_API_T1(_name); \ ONLP_LOCKED_API_NAME(_name) (_v1, _v2, _v3, _v4, _v5); \ ONLP_API_UNLOCK(); \ + ONLP_API_T2(_name); \ }