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_cycles.h>
|
||||
#include <rte_pause.h>
|
||||
#include <rte_eal.h>
|
||||
|
||||
#include "eal_private.h"
|
||||
#include "eal_memcfg.h"
|
||||
|
||||
/* The frequency of the RDTSC timer resolution */
|
||||
static uint64_t eal_tsc_resolution_hz;
|
||||
@ -77,8 +79,20 @@ estimate_tsc_freq(void)
|
||||
void
|
||||
set_tsc_freq(void)
|
||||
{
|
||||
struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
|
||||
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();
|
||||
if (!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);
|
||||
eal_tsc_resolution_hz = freq;
|
||||
mcfg->tsc_hz = freq;
|
||||
}
|
||||
|
||||
void rte_delay_us_callback_register(void (*userfunc)(unsigned int))
|
||||
|
@ -69,6 +69,9 @@ struct rte_mem_config {
|
||||
uint32_t single_file_segments;
|
||||
/**< stored single file segments parameter. */
|
||||
|
||||
uint64_t tsc_hz;
|
||||
/**< TSC rate */
|
||||
|
||||
uint8_t dma_maskbits; /**< Keeps the more restricted dma mask. */
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user