From: Jack Lange Date: Sat, 16 Jan 2010 00:13:31 +0000 (-0600) Subject: telemetry fixes X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=651e3672545ee1d510231995dfbc184d98c3686b;p=palacios.git telemetry fixes --- diff --git a/palacios/include/palacios/vm_guest.h b/palacios/include/palacios/vm_guest.h index 4723165..24fe22d 100644 --- a/palacios/include/palacios/vm_guest.h +++ b/palacios/include/palacios/vm_guest.h @@ -132,9 +132,6 @@ struct v3_segments { struct shadow_page_state; struct v3_intr_state; -#ifdef CONFIG_TELEMETRY -struct v3_telemetry; -#endif #ifdef CONFIG_SYMBIOTIC_SWAP struct v3_sym_swap_state; @@ -181,7 +178,7 @@ struct guest_info { uint64_t num_exits; #ifdef CONFIG_TELEMETRY - struct v3_telemetry_state telemetry; + struct v3_core_telemetry core_telem; #endif @@ -234,6 +231,7 @@ struct v3_vm_info { #ifdef CONFIG_TELEMETRY uint_t enable_telemetry; + struct v3_telemetry_state telemetry; #endif uint64_t yield_cycle_period; diff --git a/palacios/include/palacios/vmm_telemetry.h b/palacios/include/palacios/vmm_telemetry.h index 084d90b..88e3cce 100644 --- a/palacios/include/palacios/vmm_telemetry.h +++ b/palacios/include/palacios/vmm_telemetry.h @@ -28,34 +28,40 @@ #include struct guest_info; - +struct v3_vm_info; struct v3_telemetry_state { + uint32_t invoke_cnt; + uint64_t granularity; - uint64_t vmm_start_tsc; uint64_t prev_tsc; + struct list_head cb_list; +}; + + +struct v3_core_telemetry { uint_t exit_cnt; struct rb_root exit_root; - uint32_t invoke_cnt; - uint64_t granularity; + uint64_t vmm_start_tsc; + struct v3_telemetry_state * vm_telem; - struct list_head cb_list; }; -void v3_init_telemetry(struct guest_info * info); +void v3_init_telemetry(struct v3_vm_info * vm); +void v3_init_core_telemetry(struct guest_info * info); void v3_telemetry_start_exit(struct guest_info * info); void v3_telemetry_end_exit(struct guest_info * info, uint_t exit_code); -void v3_print_telemetry(struct guest_info * info); +void v3_print_telemetry(struct v3_vm_info * vm); -void v3_add_telemetry_cb(struct guest_info * info, - void (*telemetry_fn)(struct guest_info * info, void * private_data, char * hdr), +void v3_add_telemetry_cb(struct v3_vm_info * vm, + void (*telemetry_fn)(struct v3_vm_info * vm, void * private_data, char * hdr), void * private_data); #endif diff --git a/palacios/src/devices/keyboard.c b/palacios/src/devices/keyboard.c index c7f0b35..08844e2 100644 --- a/palacios/src/devices/keyboard.c +++ b/palacios/src/devices/keyboard.c @@ -366,7 +366,7 @@ static int key_event_handler(struct v3_vm_info * vm, v3_dbg_enable ^= 1; } else if (evt->scan_code == 0x41) { // F7 telemetry dump #ifdef CONFIG_TELEMETRY - v3_print_telemetry(info); + v3_print_telemetry(vm); #endif } diff --git a/palacios/src/palacios/vmm_config.c b/palacios/src/palacios/vmm_config.c index b05d637..edc0710 100644 --- a/palacios/src/palacios/vmm_config.c +++ b/palacios/src/palacios/vmm_config.c @@ -227,6 +227,8 @@ static int pre_config_vm(struct v3_vm_info * vm, v3_cfg_tree_t * vm_cfg) { } #ifdef CONFIG_TELEMETRY + v3_init_telemetry(vm); + { char * telemetry = v3_cfg_val(vm_cfg, "telemetry"); @@ -303,9 +305,7 @@ static int pre_config_core(struct guest_info * info, v3_cfg_tree_t * core_cfg) { * Initialize the subsystem data strutures */ #ifdef CONFIG_TELEMETRY - if (info->vm_info->enable_telemetry) { - v3_init_telemetry(info); - } + v3_init_core_telemetry(info); #endif diff --git a/palacios/src/palacios/vmm_shadow_paging.c b/palacios/src/palacios/vmm_shadow_paging.c index fbc0d8c..a6817f9 100644 --- a/palacios/src/palacios/vmm_shadow_paging.c +++ b/palacios/src/palacios/vmm_shadow_paging.c @@ -71,8 +71,13 @@ static int is_guest_pf(pt_access_status_t guest_access, pt_access_status_t shado #ifdef CONFIG_SHADOW_PAGING_TELEMETRY -static void telemetry_cb(struct guest_info * info, void * private_data, char * hdr) { - V3_Print("%s Guest Page faults: %d\n", hdr, info->shdw_pg_state.guest_faults); +static void telemetry_cb(struct v3_vm_info * vm, void * private_data, char * hdr) { + int i = 0; + for (i = 0; i < vm->num_cores; i++) { + struct guest_info * core = &(vm->cores[i]); + + V3_Print("%s Guest Page faults: %d\n", hdr, core->shdw_pg_state.guest_faults); + } } #endif @@ -88,9 +93,7 @@ int v3_init_shadow_page_state(struct guest_info * info) { INIT_LIST_HEAD(&(state->page_list)); #ifdef CONFIG_SHADOW_PAGING_TELEMETRY - if (info->vm_info->enable_telemetry) { - v3_add_telemetry_cb(info, telemetry_cb, NULL); - } + v3_add_telemetry_cb(info->vm_info, telemetry_cb, NULL); #endif return 0; diff --git a/palacios/src/palacios/vmm_telemetry.c b/palacios/src/palacios/vmm_telemetry.c index 62e3606..8d94db0 100644 --- a/palacios/src/palacios/vmm_telemetry.c +++ b/palacios/src/palacios/vmm_telemetry.c @@ -27,14 +27,14 @@ #ifdef CONFIG_TELEMETRY_GRANULARITY #define DEFAULT_GRANULARITY CONFIG_TELEMETRY_GRANULARITY #else -#define DEFAULT_GRANULARITY 50000000 +#define DEFAULT_GRANULARITY 500 #endif struct telemetry_cb { - void (*telemetry_fn)(struct guest_info * info, void * private_data, char * hdr); + void (*telemetry_fn)(struct v3_vm_info * vm, void * private_data, char * hdr); void * private_data; struct list_head cb_node; @@ -50,25 +50,33 @@ struct exit_event { }; -void v3_init_telemetry(struct guest_info * info) { - struct v3_telemetry_state * telemetry = &(info->telemetry); +void v3_init_telemetry(struct v3_vm_info * vm) { + struct v3_telemetry_state * telemetry = &(vm->telemetry); - telemetry->exit_cnt = 0; - telemetry->vmm_start_tsc = 0; - telemetry->prev_tsc = 0; telemetry->invoke_cnt = 0; telemetry->granularity = DEFAULT_GRANULARITY; + telemetry->prev_tsc = 0; - telemetry->exit_root.rb_node = NULL; INIT_LIST_HEAD(&(telemetry->cb_list)); } +void v3_init_core_telemetry(struct guest_info * core) { + struct v3_core_telemetry * telemetry = &(core->core_telem); + + telemetry->exit_cnt = 0; + telemetry->vmm_start_tsc = 0; + + telemetry->vm_telem = &(core->vm_info->telemetry); + + telemetry->exit_root.rb_node = NULL; +} + static inline struct exit_event * __insert_event(struct guest_info * info, struct exit_event * evt) { - struct rb_node ** p = &(info->telemetry.exit_root.rb_node); + struct rb_node ** p = &(info->core_telem.exit_root.rb_node); struct rb_node * parent = NULL; struct exit_event * tmp_evt = NULL; @@ -97,14 +105,14 @@ static inline struct exit_event * insert_event(struct guest_info * info, return ret; } - v3_rb_insert_color(&(evt->tree_node), &(info->telemetry.exit_root)); + v3_rb_insert_color(&(evt->tree_node), &(info->core_telem.exit_root)); return NULL; } static struct exit_event * get_exit(struct guest_info * info, uint_t exit_code) { - struct rb_node * n = info->telemetry.exit_root.rb_node; + struct rb_node * n = info->core_telem.exit_root.rb_node; struct exit_event * evt = NULL; while (n) { @@ -134,12 +142,12 @@ static inline struct exit_event * create_exit(uint_t exit_code) { } void v3_telemetry_start_exit(struct guest_info * info) { - rdtscll(info->telemetry.vmm_start_tsc); + rdtscll(info->core_telem.vmm_start_tsc); } void v3_telemetry_end_exit(struct guest_info * info, uint_t exit_code) { - struct v3_telemetry_state * telemetry = &(info->telemetry); + struct v3_core_telemetry * telemetry = &(info->core_telem); struct exit_event * evt = NULL; uint64_t end_tsc = 0; @@ -160,18 +168,18 @@ void v3_telemetry_end_exit(struct guest_info * info, uint_t exit_code) { // check if the exit count has expired - if ((telemetry->exit_cnt % telemetry->granularity) == 0) { - v3_print_telemetry(info); + if ((telemetry->exit_cnt % telemetry->vm_telem->granularity) == 0) { + v3_print_telemetry(info->vm_info); } } -void v3_add_telemetry_cb(struct guest_info * info, - void (*telemetry_fn)(struct guest_info * info, void * private_data, char * hdr), +void v3_add_telemetry_cb(struct v3_vm_info * vm, + void (*telemetry_fn)(struct v3_vm_info * vm, void * private_data, char * hdr), void * private_data) { - struct v3_telemetry_state * telemetry = &(info->telemetry); + struct v3_telemetry_state * telemetry = &(vm->telemetry); struct telemetry_cb * cb = (struct telemetry_cb *)V3_Malloc(sizeof(struct telemetry_cb)); cb->private_data = private_data; @@ -182,10 +190,11 @@ void v3_add_telemetry_cb(struct guest_info * info, -void v3_print_telemetry(struct guest_info * info) { - struct v3_telemetry_state * telemetry = &(info->telemetry); +void v3_print_telemetry(struct v3_vm_info * vm) { + struct v3_telemetry_state * telemetry = &(vm->telemetry); uint64_t invoke_tsc = 0; char hdr_buf[32]; + int i; rdtscll(invoke_tsc); @@ -193,12 +202,15 @@ void v3_print_telemetry(struct guest_info * info) { V3_Print("%stelemetry window tsc cnt: %d\n", hdr_buf, (uint32_t)(invoke_tsc - telemetry->prev_tsc)); - /* + // Exit Telemetry - { + for (i = 0; i < vm->num_cores; i++) { + struct guest_info * core = &(vm->cores[i]); struct exit_event * evt = NULL; - struct rb_node * node = v3_rb_first(&(info->telemetry.exit_root)); + struct rb_node * node = v3_rb_first(&(core->core_telem.exit_root)); + V3_Print("Exit information for Core %d\n", core->cpu_id); + do { evt = rb_entry(node, struct exit_event, tree_node); const char * code_str = vmexit_code_to_str(evt->exit_code); @@ -212,14 +224,14 @@ void v3_print_telemetry(struct guest_info * info) { (uint32_t)(evt->handler_time / evt->cnt)); } while ((node = v3_rb_next(node))); } - */ + // Registered callbacks { struct telemetry_cb * cb = NULL; list_for_each_entry(cb, &(telemetry->cb_list), cb_node) { - cb->telemetry_fn(info, cb->private_data, hdr_buf); + cb->telemetry_fn(vm, cb->private_data, hdr_buf); } }