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 updates
Jack Lange [Mon, 24 Aug 2009 22:46:22 +0000 (17:46 -0500)]
palacios/include/palacios/vmm_sprintf.h
palacios/include/palacios/vmm_telemetry.h
palacios/src/devices/sym_swap.c
palacios/src/palacios/vmm_shadow_paging_32.h
palacios/src/palacios/vmm_sym_swap.c
palacios/src/palacios/vmm_telemetry.c

index dbba4fa..df8ac6f 100644 (file)
 
 int sprintf(char *buf, const char *cfmt, ...);
 //        __attribute__ ((format (printf, 1, 2)));
-int vsprintf(char *buf, const char *cfmt, va_list ap);
+//int vsprintf(char *buf, const char * cfmt, va_list ap);
 int snprintf(char *str, size_t size, const char * fmt, ...);
-int vsnprintf(char *str, size_t size, const char * fmt, va_list ap);
-int vsnrprintf(char *str, size_t size, int radix, const char * fmt, va_list ap);
+//int vsnprintf(char *str, size_t size, const char * fmt, va_list ap);
+//int vsnrprintf(char *str, size_t size, int radix, const char * fmt, va_list ap);
 
 #define HD_COLUMN_MASK  0xff
 #define HD_DELIM_MASK   0xff00
index 80ac874..084d90b 100644 (file)
@@ -41,6 +41,7 @@ struct v3_telemetry_state {
     uint32_t invoke_cnt;
     uint64_t granularity;
 
+
     struct list_head cb_list;
 };
 
@@ -54,8 +55,8 @@ void v3_print_telemetry(struct guest_info * info);
 
 
 void v3_add_telemetry_cb(struct guest_info * info, 
-                       void (*telemetry_fn)(struct guest_info * info, void * private_data),
-                       void * private_data);
+                        void (*telemetry_fn)(struct guest_info * info, void * private_data, char * hdr),
+                        void * private_data);
 
 #endif
 
index 35b46cc..4b7270d 100644 (file)
@@ -24,6 +24,9 @@
 
 #define SWAP_CAPACITY (150 * 1024 * 1024)
 
+#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY
+#include <palacios/vmm_telemetry.h>
+#endif
 
 
 /* This is the first page that linux writes to the swap area */
@@ -60,6 +63,12 @@ struct swap_state {
 
     union swap_header * hdr;
 
+#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY
+    uint32_t pages_in;
+    uint32_t pages_out;
+#endif
+
+
     uint64_t capacity;
     uint8_t * swap_space;
     addr_t swap_base_addr;
@@ -158,7 +167,11 @@ static int swap_read(uint8_t * buf, int sector_count, uint64_t lba,  void * priv
     if ((swap->active == 1) && (offset != 0)) {
        int i = 0;
        // Notify the shadow paging layer
-       PrintDebug("Swapped in %d pages\n", length / 4096);
+
+#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY
+       swap->pages_in += length / 4096;
+#endif
+
        for (i = 0; i < length; i += 4096) {
            set_index_usage(swap, get_swap_index_from_offset(offset + i), 0);
            v3_swap_in_notify(dev->vm, get_swap_index_from_offset(offset + i), swap->hdr->info.type);
@@ -210,7 +223,10 @@ static int swap_write(uint8_t * buf, int sector_count, uint64_t lba, void * priv
 
     if ((swap->active == 1) && (offset != 0)) {
        int i = 0;
-       PrintDebug("Swapped out %d pages\n", length / 4096);
+
+#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY
+       swap->pages_out += length / 4096;
+#endif
 
        for (i = 0; i < length; i += 4096) {
            set_index_usage(swap, get_swap_index_from_offset(offset + i), 1);
@@ -242,6 +258,18 @@ static struct v3_device_ops dev_ops = {
 };
 
 
+#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY
+static void telemetry_cb(struct guest_info * info, void * private_data, char * hdr) {
+    struct vm_device * dev = (struct vm_device *)private_data;
+    struct swap_state * swap = (struct swap_state *)(dev->private_data);
+
+    V3_Print("%sSwap Device:\n", hdr);
+    V3_Print("%s\tPages Swapped in=%d\n", hdr, swap->pages_in);
+    V3_Print("%s\tPages Swapped out=%d\n", hdr, swap->pages_out);
+
+}
+#endif
+
 
 
 
@@ -290,6 +318,12 @@ static int swap_init(struct guest_info * vm, void * cfg_data) {
 
     v3_virtio_register_harddisk(virtio_blk, &hd_ops, dev);
 
+#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY
+    if (vm->enable_telemetry) {
+       v3_add_telemetry_cb(vm, telemetry_cb, dev);
+    }
+#endif
+
     return 0;
 }
 
index b6ac424..a48c50b 100644 (file)
@@ -240,7 +240,8 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault
            }
 #endif
            if (error_code.write == 0) {
-               PrintError("Page fault on swapped out page (pte=%x) (error_code=%x)\n", *(uint32_t *)guest_pte, *(uint32_t *)&error_code);
+               V3_Print("Page fault on swapped out page (vaddr=%p) (pte=%x) (error_code=%x)\n", 
+                        (void *)fault_addr, *(uint32_t *)guest_pte, *(uint32_t *)&error_code);
                
                addr_t swp_pg_addr = v3_get_swapped_pg_addr(info, shadow_pte, guest_pte);
                
@@ -259,7 +260,7 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault
                    shadow_pte->accessed = 1;
                    shadow_pte->writable = 0;
                    
-                   if (fault_addr & 0xc0000000) {
+                   if ((fault_addr & 0xc0000000) == 0xc0000000) {
                        shadow_pte->user_page = 0;
                    } else {
                        shadow_pte->user_page = 1;
index 1650c4e..67a245b 100644 (file)
@@ -70,13 +70,13 @@ static inline uint32_t get_dev_index(pte32_t * pte) {
 
 
 #ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY
-static void telemetry_cb(struct guest_info * info, void * private_data) {
+static void telemetry_cb(struct guest_info * info, void * private_data, char * hdr) {
     struct v3_sym_swap_state * swap_state = &(info->swap_state);
 
-    V3_Print("Symbiotic Swap:\n");
-    V3_Print("\tRead faults=%d\n", swap_state->read_faults);
-    V3_Print("\tWrite faults=%d\n", swap_state->write_faults);
-    V3_Print("\tFlushes=%d\n", swap_state->flushes);
+    V3_Print("%sSymbiotic Swap:\n", hdr);
+    V3_Print("%s\tRead faults=%d\n", hdr, swap_state->read_faults);
+    V3_Print("%s\tWrite faults=%d\n", hdr, swap_state->write_faults);
+    V3_Print("%s\tFlushes=%d\n", hdr, swap_state->flushes);
 }
 #endif
 
index e69af85..4a419a2 100644 (file)
@@ -21,6 +21,7 @@
 #include <palacios/vmm_telemetry.h>
 #include <palacios/svm_handler.h>
 #include <palacios/vmm_rbtree.h>
+#include <palacios/vmm_sprintf.h>
 
 
 #ifdef CONFIG_TELEMETRY_GRANULARITY
@@ -33,7 +34,7 @@
 
 struct telemetry_cb {
     
-    void (*telemetry_fn)(struct guest_info * info, void * private_data);
+    void (*telemetry_fn)(struct guest_info * info, void * private_data, char * hdr);
 
     void * private_data;
     struct list_head cb_node;
@@ -168,8 +169,8 @@ void v3_telemetry_end_exit(struct guest_info * info, uint_t exit_code) {
 
 
 void v3_add_telemetry_cb(struct guest_info * info, 
-                       void (*telemetry_fn)(struct guest_info * info, void * private_data),
-                       void * private_data) {
+                        void (*telemetry_fn)(struct guest_info * info, void * private_data, char * hdr),
+                        void * private_data) {
     struct v3_telemetry_state * telemetry = &(info->telemetry);
     struct telemetry_cb * cb = (struct telemetry_cb *)V3_Malloc(sizeof(struct telemetry_cb));
 
@@ -180,14 +181,17 @@ void v3_add_telemetry_cb(struct guest_info * info,
 }
 
 
+
 void v3_print_telemetry(struct guest_info * info) {
     struct v3_telemetry_state * telemetry = &(info->telemetry);
     uint64_t invoke_tsc = 0;
+    char hdr_buf[32];
 
     rdtscll(invoke_tsc);
 
-    V3_Print("Telemetry (%d)\n", telemetry->invoke_cnt++);
-    V3_Print("\ttelemetry window tsc cnt: %d\n", (uint32_t)(invoke_tsc - telemetry->prev_tsc));
+    snprintf(hdr_buf, 32, "telem.%d>", telemetry->invoke_cnt++);
+
+    V3_Print("%stelemetry window tsc cnt: %d\n", hdr_buf, (uint32_t)(invoke_tsc - telemetry->prev_tsc));
 
     // Exit Telemetry
     {
@@ -198,13 +202,13 @@ void v3_print_telemetry(struct guest_info * info) {
            evt = rb_entry(node, struct exit_event, tree_node);
            const char * code_str = vmexit_code_to_str(evt->exit_code);
            
-           V3_Print("%s:%sCnt=%u,%sAvg. Time=%u\n", 
-                      code_str,
-                      (strlen(code_str) > 14) ? "\t" : "\t\t",
-                      evt->cnt,
-                      (evt->cnt >= 100) ? "\t" : "\t\t",
-                      (uint32_t)(evt->handler_time / evt->cnt));
-
+           V3_Print("%s%s:%sCnt=%u,%sAvg. Time=%u\n", 
+                    hdr_buf,
+                    code_str,
+                    (strlen(code_str) > 14) ? "\t" : "\t\t",
+                    evt->cnt,
+                    (evt->cnt >= 100) ? "\t" : "\t\t",
+                    (uint32_t)(evt->handler_time / evt->cnt));
        } while ((node = v3_rb_next(node)));
     }
 
@@ -214,7 +218,7 @@ void v3_print_telemetry(struct guest_info * info) {
        struct telemetry_cb * cb = NULL;
 
        list_for_each_entry(cb, &(telemetry->cb_list), cb_node) {
-           cb->telemetry_fn(info, cb->private_data);
+           cb->telemetry_fn(info, cb->private_data, hdr_buf);
        }
     }