X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_sym_swap.c;h=56e0014475ad82ba5b9e607dcf8ed40d1a0a9546;hp=c22937cc16f9687c3bbc39be8a2ffe16db94084f;hb=cfcc5717f659b3ed2954f41cf363d3bceae8dc84;hpb=316c417125ed34aaa60f9fc5486a6d8dec4fb361 diff --git a/palacios/src/palacios/vmm_sym_swap.c b/palacios/src/palacios/vmm_sym_swap.c index c22937c..56e0014 100644 --- a/palacios/src/palacios/vmm_sym_swap.c +++ b/palacios/src/palacios/vmm_sym_swap.c @@ -21,7 +21,11 @@ #include #include +#include +#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY +#include +#endif // This is a hack and 32 bit linux specific.... need to fix... struct swap_pte { @@ -65,9 +69,30 @@ 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\tMapped Pages=%d\n", hdr, swap_state->mapped_pages); + 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"); @@ -124,7 +149,15 @@ int v3_swap_flush(struct guest_info * info) { struct v3_sym_swap_state * swap_state = &(info->swap_state); struct hashtable_iter * ht_iter = v3_create_htable_iter(swap_state->shdw_ptr_ht); - PrintDebug("Flushing Symbiotic Swap table\n"); + // PrintDebug("Flushing Symbiotic Swap table\n"); + +#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY + swap_state->flushes++; +#endif + + if (!ht_iter) { + PrintError("NULL iterator in swap flush!! Probably will crash soon...\n"); + } while (ht_iter->entry) { struct shadow_pointer * tmp_shdw_ptr = NULL; @@ -135,12 +168,16 @@ int v3_swap_flush(struct guest_info * info) { // we can leave the list_head structures and reuse them for the next round list_for_each_entry_safe(shdw_ptr, tmp_shdw_ptr, shdw_ptr_list, node) { + if (shdw_ptr == NULL) { + PrintError("Null shadow pointer in swap flush!! Probably crashing soon...\n"); + } + // Trigger faults for next shadow access shdw_ptr->shadow_pte->present = 0; // Delete entry from list list_del(&(shdw_ptr->node)); - V3_Free(shdw_ptr); + V3_Free(shdw_ptr); } v3_htable_iter_advance(ht_iter); @@ -149,6 +186,21 @@ int v3_swap_flush(struct guest_info * info) { return 0; } +int v3_get_vaddr_perms(struct guest_info * info, addr_t vaddr, pte32_t * guest_pte, pf_error_t * page_perms) { + uint64_t pte_val = (uint64_t)*(uint32_t *)guest_pte; + + // symcall to check if page is in cache or on swap disk + if (v3_sym_call3(info, SYMCALL_MEM_LOOKUP, (uint64_t *)&vaddr, (uint64_t *)&pte_val, (uint64_t *)page_perms) == -1) { + PrintError("Sym call error?? that's weird... \n"); + return -1; + } + + // V3_Print("page perms = %x\n", *(uint32_t *)page_perms); + + return 0; +} + + addr_t v3_get_swapped_pg_addr(struct guest_info * info, pte32_t * shadow_pte, pte32_t * guest_pte) { struct list_head * shdw_ptr_list = NULL; @@ -162,6 +214,8 @@ addr_t v3_get_swapped_pg_addr(struct guest_info * info, pte32_t * shadow_pte, pt return 0; } + + swp_page_ptr = swp_dev->ops->get_swap_entry(get_pg_index(guest_pte), swp_dev->private_data); if (swp_page_ptr == NULL) {