X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_sym_swap.c;h=67a245b46d573b513edb206f695d5cd1b5e19a65;hb=1786dcbd1b5a05d2591556db17bff62465713ee1;hp=216894aa0f4434eb8a44a29b2a286228fc5ee550;hpb=6fe9fe338ec19b212b43bb2c25322dce3cdbb490;p=palacios.git diff --git a/palacios/src/palacios/vmm_sym_swap.c b/palacios/src/palacios/vmm_sym_swap.c index 216894a..67a245b 100644 --- a/palacios/src/palacios/vmm_sym_swap.c +++ b/palacios/src/palacios/vmm_sym_swap.c @@ -23,6 +23,10 @@ #include +#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY +#include +#endif + // This is a hack and 32 bit linux specific.... need to fix... struct swap_pte { uint32_t present : 1; @@ -65,9 +69,29 @@ 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, char * hdr) { + struct v3_sym_swap_state * swap_state = &(info->swap_state); + + 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 + + int v3_init_sym_swap(struct guest_info * info) { - memset(&(info->swap_state), 0, sizeof(struct v3_sym_swap_state)); - info->swap_state.shdw_ptr_ht = v3_create_htable(0, swap_hash_fn, swap_eq_fn); + struct v3_sym_swap_state * swap_state = &(info->swap_state); + + memset(swap_state, 0, sizeof(struct v3_sym_swap_state)); + swap_state->shdw_ptr_ht = v3_create_htable(0, swap_hash_fn, swap_eq_fn); + +#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY + if (info->enable_telemetry) { + v3_add_telemetry_cb(info, telemetry_cb, NULL); + } +#endif PrintDebug("Initialized Symbiotic Swap\n"); @@ -126,6 +150,10 @@ int v3_swap_flush(struct guest_info * info) { PrintDebug("Flushing Symbiotic Swap table\n"); +#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY + swap_state->flushes++; +#endif + while (ht_iter->entry) { struct shadow_pointer * tmp_shdw_ptr = NULL; struct shadow_pointer * shdw_ptr = NULL; @@ -174,6 +202,7 @@ addr_t v3_get_swapped_pg_addr(struct guest_info * info, pte32_t * shadow_pte, pt if (shdw_ptr_list == NULL) { shdw_ptr_list = (struct list_head *)V3_Malloc(sizeof(struct list_head *)); INIT_LIST_HEAD(shdw_ptr_list); + v3_htable_insert(swap_state->shdw_ptr_ht, (addr_t)*(uint32_t *)guest_pte, (addr_t)shdw_ptr_list); } shdw_ptr = (struct shadow_pointer *)V3_Malloc(sizeof(struct shadow_pointer));