X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmx_handler.c;h=c758abf3776b6960bfed095d16f9b13b26d23ae8;hp=67f03a4f581af919266940bf7fa3f2171e152d0a;hb=68521eca0f94f8c22aa60e762c83e24beec7233c;hpb=abccb1c104baffd2bfd901cf8b3ed48b44615dd4 diff --git a/palacios/src/palacios/vmx_handler.c b/palacios/src/palacios/vmx_handler.c index 67f03a4..c758abf 100644 --- a/palacios/src/palacios/vmx_handler.c +++ b/palacios/src/palacios/vmx_handler.c @@ -32,15 +32,27 @@ #include #include -#ifdef CONFIG_TELEMETRY -#include +#ifdef CONFIG_VNET +#include #endif +#ifdef CONFIG_LINUX_VIRTIO_NET + extern int v3_virtionic_pktprocess(struct guest_info * info); +#endif -#ifdef CONFIG_VNET -#include +#ifdef CONFIG_TELEMETRY +#include #endif +//#define VNET_PROFILE +/* for vnet profiling*/ +#ifdef VNET_PROFILE +static uint64_t vmm_time = 0; +static uint64_t vnet_time = 0; +static uint64_t guest_time = 0; +static uint64_t last_exit_time = 0; +static uint64_t num_exit = 0; +#endif /* At this point the GPRs are already copied into the guest_info state */ @@ -61,6 +73,15 @@ int v3_handle_vmx_exit(struct guest_info * info, struct vmx_exit_info * exit_inf } #endif +#ifdef VNET_PROFILE + uint64_t exit_start_time, vnet_start_time; + uint64_t exit_end_time, vnet_end_time; + rdtscll(exit_start_time); + num_exit ++; + if (last_exit_time > 0) + guest_time += exit_start_time - last_exit_time; +#endif + switch (exit_info->exit_reason) { case VMEXIT_INFO_EXCEPTION_OR_NMI: { pf_error_t error_code = *(pf_error_t *)&(exit_info->int_err); @@ -226,16 +247,44 @@ int v3_handle_vmx_exit(struct guest_info * info, struct vmx_exit_info * exit_inf return -1; } + #ifdef CONFIG_VNET +#ifdef VNET_PROFILE + rdtscll(vnet_start_time); +#endif v3_vnet_pkt_process(info); +#ifdef VNET_PROFILE + rdtscll(vnet_end_time); + vnet_time += vnet_end_time - vnet_start_time; +#endif #endif +#ifdef CONFIG_LINUX_VIRTIO_NET + v3_virtionic_pktprocess(info); +#endif + +#ifdef VNET_PROFILE + rdtscll(exit_end_time); + vmm_time += exit_end_time - exit_start_time; + last_exit_time = exit_end_time; + if ((num_exit % 100000) == 0) { + PrintError("exit: %ld, vmm_time: %ld, guest_time: %ld, vnet_time: %ld\n", (long)num_exit, (long)vmm_time, (long)guest_time, (long)vnet_time); + vmm_time = 0; + vnet_time = 0; + guest_time = 0; + last_exit_time = 0; + } +#endif + + + #ifdef CONFIG_TELEMETRY if (info->enable_telemetry) { v3_telemetry_end_exit(info, exit_info->exit_reason); } #endif + return 0; }