Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


telemetry fixes
Jack Lange [Sat, 16 Jan 2010 00:13:31 +0000 (18:13 -0600)]
palacios/include/palacios/vm_guest.h
palacios/include/palacios/vmm_telemetry.h
palacios/src/devices/keyboard.c
palacios/src/palacios/vmm_config.c
palacios/src/palacios/vmm_shadow_paging.c
palacios/src/palacios/vmm_telemetry.c

index 4723165..24fe22d 100644 (file)
@@ -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;  
index 084d90b..88e3cce 100644 (file)
 #include <palacios/vmm_list.h>
 
 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
index c7f0b35..08844e2 100644 (file)
@@ -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
     }
 
index b05d637..edc0710 100644 (file)
@@ -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
 
     
index fbc0d8c..a6817f9 100644 (file)
@@ -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;
index 62e3606..8d94db0 100644 (file)
 #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);
        }
     }