From: Pavan Nikhilesh Date: Mon, 9 Apr 2018 21:00:29 +0000 (+0530) Subject: event/octeontx: add event timer stats get and reset X-Git-Url: http://git.droids-corp.org/?p=dpdk.git;a=commitdiff_plain;h=d1925c87d0ddadc689d76010f0fa71e060a13aff event/octeontx: add event timer stats get and reset Add functions to get and reset event timer adapter stats. Signed-off-by: Pavan Nikhilesh --- diff --git a/doc/guides/eventdevs/octeontx.rst b/doc/guides/eventdevs/octeontx.rst index 86028652f7..f77bc5c543 100644 --- a/doc/guides/eventdevs/octeontx.rst +++ b/doc/guides/eventdevs/octeontx.rst @@ -99,6 +99,16 @@ The tests are run once the vdev creation is successfully complete. --vdev="event_octeontx,self_test=1" +Enable TIMvf stats +------------------ +TIMvf stats can be enabled by using this option, by default the stats are +disabled. + +.. code-block:: console + + --vdev="event_octeontx,timvf_stats=1" + + Limitations ----------- diff --git a/drivers/event/octeontx/ssovf_evdev.c b/drivers/event/octeontx/ssovf_evdev.c index 34496f114a..2df70b52ab 100644 --- a/drivers/event/octeontx/ssovf_evdev.c +++ b/drivers/event/octeontx/ssovf_evdev.c @@ -21,6 +21,7 @@ #include "timvf_evdev.h" int otx_logtype_ssovf; +static uint8_t timvf_enable_stats; RTE_INIT(otx_ssovf_init_log); static void @@ -606,7 +607,8 @@ static int ssovf_timvf_caps_get(const struct rte_eventdev *dev, uint64_t flags, uint32_t *caps, const struct rte_event_timer_adapter_ops **ops) { - return timvf_timer_adapter_caps_get(dev, flags, caps, ops, 0); + return timvf_timer_adapter_caps_get(dev, flags, caps, ops, + timvf_enable_stats); } /* Initialize and register event driver with DPDK Application */ @@ -654,6 +656,7 @@ ssovf_vdev_probe(struct rte_vdev_device *vdev) static const char *const args[] = { SSOVF_SELFTEST_ARG, + TIMVF_ENABLE_STATS_ARG, NULL }; @@ -681,6 +684,15 @@ ssovf_vdev_probe(struct rte_vdev_device *vdev) rte_kvargs_free(kvlist); return ret; } + + ret = rte_kvargs_process(kvlist, + TIMVF_ENABLE_STATS_ARG, + ssovf_selftest, &timvf_enable_stats); + if (ret != 0) { + ssovf_log_err("%s: Error in timvf stats", name); + rte_kvargs_free(kvlist); + return ret; + } } rte_kvargs_free(kvlist); diff --git a/drivers/event/octeontx/timvf_evdev.c b/drivers/event/octeontx/timvf_evdev.c index 84c6a511ee..c66db437eb 100644 --- a/drivers/event/octeontx/timvf_evdev.c +++ b/drivers/event/octeontx/timvf_evdev.c @@ -268,6 +268,29 @@ timvf_ring_free(struct rte_event_timer_adapter *adptr) return 0; } +static int +timvf_stats_get(const struct rte_event_timer_adapter *adapter, + struct rte_event_timer_adapter_stats *stats) +{ + struct timvf_ring *timr = adapter->data->adapter_priv; + uint64_t bkt_cyc = rte_rdtsc() - timr->ring_start_cyc; + + stats->evtim_exp_count = timr->tim_arm_cnt; + stats->ev_enq_count = timr->tim_arm_cnt; + stats->adapter_tick_count = rte_reciprocal_divide_u64(bkt_cyc, + &timr->fast_div); + return 0; +} + +static int +timvf_stats_reset(const struct rte_event_timer_adapter *adapter) +{ + struct timvf_ring *timr = adapter->data->adapter_priv; + + timr->tim_arm_cnt = 0; + return 0; +} + static struct rte_event_timer_adapter_ops timvf_ops = { .init = timvf_ring_create, .uninit = timvf_ring_free, @@ -283,7 +306,12 @@ timvf_timer_adapter_caps_get(const struct rte_eventdev *dev, uint64_t flags, { RTE_SET_USED(dev); RTE_SET_USED(flags); - RTE_SET_USED(enable_stats); + + if (enable_stats) { + timvf_ops.stats_get = timvf_stats_get; + timvf_ops.stats_reset = timvf_stats_reset; + } + *caps = RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT; *ops = &timvf_ops; return -EINVAL; diff --git a/drivers/event/octeontx/timvf_evdev.h b/drivers/event/octeontx/timvf_evdev.h index 7663dc375f..e89a43531a 100644 --- a/drivers/event/octeontx/timvf_evdev.h +++ b/drivers/event/octeontx/timvf_evdev.h @@ -83,6 +83,8 @@ #define timvf_read64 rte_read64_relaxed #define timvf_write64 rte_write64_relaxed +#define TIMVF_ENABLE_STATS_ARG ("timvf_stats") + extern int otx_logtype_timvf; static const uint16_t nb_chunk_slots = (TIM_CHUNK_SIZE / 16) - 1; @@ -145,6 +147,7 @@ struct timvf_ring { struct tim_mem_bucket *bkt; void *chunk_pool; uint64_t tck_int; + volatile uint64_t tim_arm_cnt; uint64_t tck_nsec; void *vbar0; void *bkt_pos;