eal: calibrate TSC only in primary process
This ensures secondary processes never have to calculate the TSC rate themselves, which can be noticeable in VMs that don't have access to arch-specific detection mechanism (such as CPUID leaf 0x15 or MSR 0xCE on x86). Since rte_mem_config is now internal to the EAL library, we can add tsc_hz without ABI breakage concerns. Reduces rte_eal_init() execution time in a secondary process from 165ms to 66ms on my test system. Signed-off-by: Jim Harris <james.r.harris@intel.com> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
This commit is contained in:
parent
b36f587f01
commit
b30b134f82
@ -15,8 +15,10 @@
|
|||||||
#include <rte_log.h>
|
#include <rte_log.h>
|
||||||
#include <rte_cycles.h>
|
#include <rte_cycles.h>
|
||||||
#include <rte_pause.h>
|
#include <rte_pause.h>
|
||||||
|
#include <rte_eal.h>
|
||||||
|
|
||||||
#include "eal_private.h"
|
#include "eal_private.h"
|
||||||
|
#include "eal_memcfg.h"
|
||||||
|
|
||||||
/* The frequency of the RDTSC timer resolution */
|
/* The frequency of the RDTSC timer resolution */
|
||||||
static uint64_t eal_tsc_resolution_hz;
|
static uint64_t eal_tsc_resolution_hz;
|
||||||
@ -77,8 +79,20 @@ estimate_tsc_freq(void)
|
|||||||
void
|
void
|
||||||
set_tsc_freq(void)
|
set_tsc_freq(void)
|
||||||
{
|
{
|
||||||
|
struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
|
||||||
uint64_t freq;
|
uint64_t freq;
|
||||||
|
|
||||||
|
if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
|
||||||
|
/*
|
||||||
|
* Just use the primary process calculated TSC rate in any
|
||||||
|
* secondary process. It avoids any unnecessary overhead on
|
||||||
|
* systems where arch-specific frequency detection is not
|
||||||
|
* available.
|
||||||
|
*/
|
||||||
|
eal_tsc_resolution_hz = mcfg->tsc_hz;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
freq = get_tsc_freq_arch();
|
freq = get_tsc_freq_arch();
|
||||||
if (!freq)
|
if (!freq)
|
||||||
freq = get_tsc_freq();
|
freq = get_tsc_freq();
|
||||||
@ -87,6 +101,7 @@ set_tsc_freq(void)
|
|||||||
|
|
||||||
RTE_LOG(DEBUG, EAL, "TSC frequency is ~%" PRIu64 " KHz\n", freq / 1000);
|
RTE_LOG(DEBUG, EAL, "TSC frequency is ~%" PRIu64 " KHz\n", freq / 1000);
|
||||||
eal_tsc_resolution_hz = freq;
|
eal_tsc_resolution_hz = freq;
|
||||||
|
mcfg->tsc_hz = freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rte_delay_us_callback_register(void (*userfunc)(unsigned int))
|
void rte_delay_us_callback_register(void (*userfunc)(unsigned int))
|
||||||
|
@ -69,6 +69,9 @@ struct rte_mem_config {
|
|||||||
uint32_t single_file_segments;
|
uint32_t single_file_segments;
|
||||||
/**< stored single file segments parameter. */
|
/**< stored single file segments parameter. */
|
||||||
|
|
||||||
|
uint64_t tsc_hz;
|
||||||
|
/**< TSC rate */
|
||||||
|
|
||||||
uint8_t dma_maskbits; /**< Keeps the more restricted dma mask. */
|
uint8_t dma_maskbits; /**< Keeps the more restricted dma mask. */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user