cfe3aeb170
We had some inconsistencies between functions prototypes and actual definitions. Let's avoid this by only adding the experimental tag to the prototypes. Tests with gcc and clang show it is enough. git grep -l __rte_experimental |grep \.c$ |while read file; do sed -i -e '/^__rte_experimental$/d' $file; sed -i -e 's/ *__rte_experimental//' $file; sed -i -e 's/__rte_experimental *//' $file; done Signed-off-by: David Marchand <david.marchand@redhat.com> Acked-by: Adrien Mazarguil <adrien.mazarguil@6wind.com> Acked-by: Neil Horman <nhorman@tuxdriver.com>
102 lines
2.1 KiB
C
102 lines
2.1 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2010-2014 Intel Corporation
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <inttypes.h>
|
|
#include <sys/types.h>
|
|
#include <time.h>
|
|
#include <errno.h>
|
|
|
|
#include <rte_common.h>
|
|
#include <rte_compat.h>
|
|
#include <rte_log.h>
|
|
#include <rte_cycles.h>
|
|
#include <rte_pause.h>
|
|
|
|
#include "eal_private.h"
|
|
|
|
/* The frequency of the RDTSC timer resolution */
|
|
static uint64_t eal_tsc_resolution_hz;
|
|
|
|
/* Pointer to user delay function */
|
|
void (*rte_delay_us)(unsigned int) = NULL;
|
|
|
|
void
|
|
rte_delay_us_block(unsigned int us)
|
|
{
|
|
const uint64_t start = rte_get_timer_cycles();
|
|
const uint64_t ticks = (uint64_t)us * rte_get_timer_hz() / 1E6;
|
|
while ((rte_get_timer_cycles() - start) < ticks)
|
|
rte_pause();
|
|
}
|
|
|
|
void
|
|
rte_delay_us_sleep(unsigned int us)
|
|
{
|
|
struct timespec wait[2];
|
|
int ind = 0;
|
|
|
|
wait[0].tv_sec = 0;
|
|
if (us >= US_PER_S) {
|
|
wait[0].tv_sec = us / US_PER_S;
|
|
us -= wait[0].tv_sec * US_PER_S;
|
|
}
|
|
wait[0].tv_nsec = 1000 * us;
|
|
|
|
while (nanosleep(&wait[ind], &wait[1 - ind]) && errno == EINTR) {
|
|
/*
|
|
* Sleep was interrupted. Flip the index, so the 'remainder'
|
|
* will become the 'request' for a next call.
|
|
*/
|
|
ind = 1 - ind;
|
|
}
|
|
}
|
|
|
|
uint64_t
|
|
rte_get_tsc_hz(void)
|
|
{
|
|
return eal_tsc_resolution_hz;
|
|
}
|
|
|
|
static uint64_t
|
|
estimate_tsc_freq(void)
|
|
{
|
|
#define CYC_PER_10MHZ 1E7
|
|
RTE_LOG(WARNING, EAL, "WARNING: TSC frequency estimated roughly"
|
|
" - clock timings may be less accurate.\n");
|
|
/* assume that the sleep(1) will sleep for 1 second */
|
|
uint64_t start = rte_rdtsc();
|
|
sleep(1);
|
|
/* Round up to 10Mhz. 1E7 ~ 10Mhz */
|
|
return RTE_ALIGN_MUL_NEAR(rte_rdtsc() - start, CYC_PER_10MHZ);
|
|
}
|
|
|
|
void
|
|
set_tsc_freq(void)
|
|
{
|
|
uint64_t freq;
|
|
|
|
freq = get_tsc_freq_arch();
|
|
if (!freq)
|
|
freq = get_tsc_freq();
|
|
if (!freq)
|
|
freq = estimate_tsc_freq();
|
|
|
|
RTE_LOG(DEBUG, EAL, "TSC frequency is ~%" PRIu64 " KHz\n", freq / 1000);
|
|
eal_tsc_resolution_hz = freq;
|
|
}
|
|
|
|
void rte_delay_us_callback_register(void (*userfunc)(unsigned int))
|
|
{
|
|
rte_delay_us = userfunc;
|
|
}
|
|
|
|
RTE_INIT(rte_timer_init)
|
|
{
|
|
/* set rte_delay_us_block as a delay function */
|
|
rte_delay_us_callback_register(rte_delay_us_block);
|
|
}
|