From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-we0-x233.google.com (mail-we0-x233.google.com [IPv6:2a00:1450:400c:c03::233]) by dpdk.org (Postfix) with ESMTP id 256614BFE for ; Wed, 20 Mar 2013 17:08:35 +0100 (CET) Received: by mail-we0-f179.google.com with SMTP id u3so1544846wey.24 for ; Wed, 20 Mar 2013 09:07:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:subject:date:message-id:x-mailer:in-reply-to :references:in-reply-to:references:x-gm-message-state; bh=ZVgSpxCjWLjzuaZWnFRTffFMj42D53cIO6jkN2T8fic=; b=iIARgQ0Q4xy3AzCbX+rRdHzaX+WI28oOm8vYgVxg+XardCTeJXGq+Rb5UBB8AdYrkj BkX4admJOEz33O6BQAUYQNkCn42arh8J8BugBJk/k2l6/8l4ARwsSivm4PWUyUsegkbu bgLZ/1NJMtkjKM8c8CX7bNOBdKLBFiphf6HtUtf6JsxX8x19Zq7etrqgkCT1NW6IZMO/ pxWk15lsL21PCbmfhtbBGyZeKCBHlqbBj3uYVN+jpuj24zWByghqkxIoxDm2J54rdZ0z TFOTn/UH16TnYtVH/DuQGEu+uQ0kOz0f/G1rHEzCdV2mev7uelAy7mLH4A7KgczOJptz Mkwg== X-Received: by 10.180.73.212 with SMTP id n20mr11259747wiv.11.1363795653955; Wed, 20 Mar 2013 09:07:33 -0700 (PDT) Received: from 6wind.com (6wind.net2.nerim.net. [213.41.180.237]) by mx.google.com with ESMTPS id t7sm7771490wij.2.2013.03.20.09.07.31 (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 20 Mar 2013 09:07:32 -0700 (PDT) Received: by 6wind.com (sSMTP sendmail emulation); Wed, 20 Mar 2013 17:07:30 +0100 From: Thomas Monjalon To: dev@dpdk.org Date: Wed, 20 Mar 2013 17:05:06 +0100 Message-Id: X-Mailer: git-send-email 1.7.2.5 In-Reply-To: References: In-Reply-To: References: X-Gm-Message-State: ALoCoQnUvCAuf5j0vry/ldm5F6nbONVhW3NLfRBCFFhaCFLjwHE1nGYkDisAW942FWGp8dx8TQ4g Subject: [dpdk-dev] [PATCH 18/22] timer: option --vmware-tsc-map for VMware guest X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Mar 2013 16:08:35 -0000 From: Damien Millescamps The VMware TSC mapping uses a hook to RDPMC to read the physical TSC in the case of VMware ESXi. Introduce new option --vmware-tsc-map, ignored if CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT is not set. Default is CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT=y. if CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT is set: rte_rdtsc() selects at runtime between Vmware mapping of TSC or native TSC else rte_rdtsc() always uses native rdtsc. When running DPDK on VMware guest, enable --vmware-tsc-map to read the physical TSC. Caution: ESXi should pass monitor_control.pseudo_perfctr = TRUE otherwise it results in general protection fault. Acked-by: Vincent Jardin Acked-by: Olivier Matz Acked-by: Thomas Monjalon Signed-off-by: Damien Millescamps Signed-off-by: Jean-Mickael Guerin --- config/defconfig_i686-default-linuxapp-gcc | 5 ++++ config/defconfig_i686-default-linuxapp-icc | 5 ++++ config/defconfig_x86_64-default-linuxapp-gcc | 5 ++++ config/defconfig_x86_64-default-linuxapp-icc | 5 ++++ lib/librte_eal/common/include/rte_cycles.h | 19 ++++++++++++++++ lib/librte_eal/linuxapp/eal/eal.c | 23 ++++++++++++++++++++ .../linuxapp/eal/include/eal_internal_cfg.h | 1 + 7 files changed, 63 insertions(+), 0 deletions(-) diff --git a/config/defconfig_i686-default-linuxapp-gcc b/config/defconfig_i686-default-linuxapp-gcc index ed54434..e64bb86 100644 --- a/config/defconfig_i686-default-linuxapp-gcc +++ b/config/defconfig_i686-default-linuxapp-gcc @@ -121,6 +121,11 @@ CONFIG_RTE_LIBRTE_EAL_LINUXAPP=y CONFIG_RTE_LIBRTE_EAL_BAREMETAL=n # +# Compile Environment Abstraction Layer to support VMware TSC map +# +CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT=y + +# # Compile generic ethernet library # CONFIG_RTE_LIBRTE_ETHER=y diff --git a/config/defconfig_i686-default-linuxapp-icc b/config/defconfig_i686-default-linuxapp-icc index cb0d017..3f15a53 100644 --- a/config/defconfig_i686-default-linuxapp-icc +++ b/config/defconfig_i686-default-linuxapp-icc @@ -121,6 +121,11 @@ CONFIG_RTE_LIBRTE_EAL_LINUXAPP=y CONFIG_RTE_LIBRTE_EAL_BAREMETAL=n # +# Compile Environment Abstraction Layer to support VMware TSC map +# +CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT=y + +# # Compile generic ethernet library # CONFIG_RTE_LIBRTE_ETHER=y diff --git a/config/defconfig_x86_64-default-linuxapp-gcc b/config/defconfig_x86_64-default-linuxapp-gcc index 3555187..f5213d5 100644 --- a/config/defconfig_x86_64-default-linuxapp-gcc +++ b/config/defconfig_x86_64-default-linuxapp-gcc @@ -121,6 +121,11 @@ CONFIG_RTE_LIBRTE_EAL_LINUXAPP=y CONFIG_RTE_LIBRTE_EAL_BAREMETAL=n # +# Compile Environment Abstraction Layer to support VMware TSC map +# +CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT=y + +# # Compile generic ethernet library # CONFIG_RTE_LIBRTE_ETHER=y diff --git a/config/defconfig_x86_64-default-linuxapp-icc b/config/defconfig_x86_64-default-linuxapp-icc index f527f53..f28943a 100644 --- a/config/defconfig_x86_64-default-linuxapp-icc +++ b/config/defconfig_x86_64-default-linuxapp-icc @@ -121,6 +121,11 @@ CONFIG_RTE_LIBRTE_EAL_LINUXAPP=y CONFIG_RTE_LIBRTE_EAL_BAREMETAL=n # +# Compile Environment Abstraction Layer to support VMware TSC map +# +CONFIG_RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT=y + +# # Compile generic ethernet library # CONFIG_RTE_LIBRTE_ETHER=y diff --git a/lib/librte_eal/common/include/rte_cycles.h b/lib/librte_eal/common/include/rte_cycles.h index a1eca6c..fa0b408 100644 --- a/lib/librte_eal/common/include/rte_cycles.h +++ b/lib/librte_eal/common/include/rte_cycles.h @@ -2,6 +2,7 @@ * BSD LICENSE * * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * Copyright(c) 2012-2013 6WIND. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,6 +49,13 @@ extern "C" { #include +#ifdef RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT +/** Global switch to use VMware mapping of TSC instead of RDTSC */ +extern int rte_cycles_vmware_tsc_map; +#include +#endif + + /** * Read the TSC register. * @@ -65,9 +73,20 @@ rte_rdtsc(void) }; } tsc; +#ifdef RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT + if (unlikely(rte_cycles_vmware_tsc_map)) { + /* ecx = 0x10000 corresponds to the Physical TSC for VMware */ + asm volatile("rdpmc" : + "=a" (tsc.lo_32), + "=d" (tsc.hi_32) : + "c"(0x10000)); + return tsc.tsc_64; + } +#endif asm volatile("rdtsc" : "=a" (tsc.lo_32), "=d" (tsc.hi_32)); + return tsc.tsc_64; } diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index 8d82cc3..a63881c 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -78,6 +78,7 @@ #define OPT_PROC_TYPE "proc-type" #define OPT_NO_SHCONF "no-shconf" #define OPT_NO_HPET "no-hpet" +#define OPT_VMWARE_TSC_MAP "vmware-tsc-map" #define OPT_NO_PCI "no-pci" #define OPT_NO_HUGE "no-huge" #define OPT_FILE_PREFIX "file-prefix" @@ -125,6 +126,9 @@ struct lcore_config lcore_config[RTE_MAX_LCORE]; /* internal configuration */ struct internal_config internal_config; +/* used by rte_rdtsc() */ +int rte_cycles_vmware_tsc_map; + /* Return a pointer to the configuration structure */ struct rte_config * rte_eal_get_configuration(void) @@ -264,6 +268,7 @@ eal_usage(const char *prgname) " --"OPT_HUGE_DIR" : directory where hugetlbfs is mounted\n" " --"OPT_PROC_TYPE": type of this process\n" " --"OPT_FILE_PREFIX": prefix for hugepage filenames\n" + " --"OPT_VMWARE_TSC_MAP" : use VMware TSC map instead of native RDTSC\n\n" "\nEAL options for DEBUG use only:\n" " --"OPT_NO_HUGE" : use malloc instead of hugetlbfs\n" " --"OPT_NO_PCI" : disable pci\n" @@ -379,6 +384,7 @@ eal_parse_args(int argc, char **argv) {OPT_NO_HUGE, 0, 0, 0}, {OPT_NO_PCI, 0, 0, 0}, {OPT_NO_HPET, 0, 0, 0}, + {OPT_VMWARE_TSC_MAP, 0, 0, 0}, {OPT_HUGE_DIR, 1, 0, 0}, {OPT_NO_SHCONF, 0, 0, 0}, {OPT_PROC_TYPE, 1, 0, 0}, @@ -399,6 +405,8 @@ eal_parse_args(int argc, char **argv) internal_config.no_hpet = 1; #endif + internal_config.vmware_tsc_map = 0; + while ((opt = getopt_long(argc, argvopt, "b:c:m:n:r:v", lgopts, &option_index)) != EOF) { @@ -464,6 +472,9 @@ eal_parse_args(int argc, char **argv) else if (!strcmp(lgopts[option_index].name, OPT_NO_HPET)) { internal_config.no_hpet = 1; } + else if (!strcmp(lgopts[option_index].name, OPT_VMWARE_TSC_MAP)) { + internal_config.vmware_tsc_map = 1; + } else if (!strcmp(lgopts[option_index].name, OPT_NO_SHCONF)) { internal_config.no_shconf = 1; } @@ -547,6 +558,18 @@ rte_eal_init(int argc, char **argv) internal_config.memory = eal_get_hugepage_mem_size(); } + if (internal_config.vmware_tsc_map == 1) { +#ifdef RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT + rte_cycles_vmware_tsc_map = 1; + RTE_LOG (DEBUG, EAL, "Using VMware TSC map, " + "you must have monitor_control.pseudo_perfctr = TRUE\n"); +#else + RTE_LOG (WARNING, EAL, "Ignoring --vmware-tsc-map because " + "RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT is not set\n"); +#endif + } else { + RTE_LOG (DEBUG, EAL, "Using native RDTSC\n"); + } rte_srand(rte_rdtsc()); rte_config_init(); diff --git a/lib/librte_eal/linuxapp/eal/include/eal_internal_cfg.h b/lib/librte_eal/linuxapp/eal/include/eal_internal_cfg.h index 70d5afb..470b746 100644 --- a/lib/librte_eal/linuxapp/eal/include/eal_internal_cfg.h +++ b/lib/librte_eal/linuxapp/eal/include/eal_internal_cfg.h @@ -63,6 +63,7 @@ struct internal_config { volatile unsigned no_hugetlbfs; /* true to disable hugetlbfs */ volatile unsigned no_pci; /* true to disable PCI */ volatile unsigned no_hpet; /* true to disable HPET */ + volatile unsigned vmware_tsc_map; /* true to use VMware TSC mapping instead of native TSC */ volatile unsigned no_shconf; /* true if there is no shared config */ volatile enum rte_proc_type_t process_type; /* multi-process proc type */ const char *hugefile_prefix; /* the base filename of hugetlbfs files */ -- 1.7.2.5