From: Peter Dinda Date: Sat, 7 Jul 2012 23:23:23 +0000 (-0500) Subject: Change to internal v3_yield/yield_cond semantics: X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=25aec1d035e5a740d8c1cb936d7633b6bb5751f1;p=palacios.git Change to internal v3_yield/yield_cond semantics: v3_yield(guest, time (usec) ) time < 0 => direct call to host yield os hook time >=0 0 => direct call to host yield_timed os hook (this usually implies interruptible, even if time=0) time is in usec --- diff --git a/palacios/include/palacios/vmm.h b/palacios/include/palacios/vmm.h index df66aeb..0c10e84 100644 --- a/palacios/include/palacios/vmm.h +++ b/palacios/include/palacios/vmm.h @@ -275,9 +275,8 @@ typedef enum v3_cpu_arch {V3_INVALID_CPU, V3_SVM_CPU, V3_SVM_REV3_CPU, V3_VMX_CP v3_cpu_mode_t v3_get_host_cpu_mode(); -void v3_yield(struct guest_info * info); -void v3_yield_cond(struct guest_info * info); -void v3_yield_timed(struct guest_info * info, unsigned int usec); +void v3_yield(struct guest_info * info, int usec); +void v3_yield_cond(struct guest_info * info, int usec); void v3_print_cond(const char * fmt, ...); void v3_interrupt_cpu(struct v3_vm_info * vm, int logical_cpu, int vector); diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index facdb18..8a1b3e4 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -564,7 +564,7 @@ int v3_svm_enter(struct guest_info * info) { uint64_t guest_cycles = 0; // Conditionally yield the CPU if the timeslice has expired - v3_yield_cond(info); + v3_yield_cond(info,-1); // Update timer devices after being in the VM before doing // IRQ updates, so that any interrupts they raise get seen @@ -695,7 +695,7 @@ int v3_svm_enter(struct guest_info * info) { v3_stgi(); // Conditionally yield the CPU if the timeslice has expired - v3_yield_cond(info); + v3_yield_cond(info,-1); // This update timers is for time-dependent handlers // if we're slaved to host time @@ -740,7 +740,7 @@ int v3_start_svm_guest(struct guest_info * info) { return 0; } - v3_yield(info); + v3_yield(info,-1); //PrintDebug("SVM core %u: still waiting for INIT\n", info->vcpu_id); } diff --git a/palacios/src/palacios/vmm.c b/palacios/src/palacios/vmm.c index 30fa2e6..21ca408 100644 --- a/palacios/src/palacios/vmm.c +++ b/palacios/src/palacios/vmm.c @@ -482,7 +482,7 @@ int v3_stop_vm(struct v3_vm_info * vm) { break; } - v3_yield(NULL); + v3_yield(NULL,-1); } V3_Print("VM stopped. Returning\n"); @@ -530,7 +530,7 @@ static int sim_callback(struct guest_info * core, void * private_data) { V3_Print("Simulation callback activated (guest_rip=%p)\n", (void *)core->rip); while (v3_bitmap_check(timeout_map, core->vcpu_id) == 1) { - v3_yield(NULL); + v3_yield(NULL,-1); } return 0; @@ -601,7 +601,7 @@ int v3_simulate_vm(struct v3_vm_info * vm, unsigned int msecs) { break; } - v3_yield(NULL); + v3_yield(NULL,-1); } @@ -690,7 +690,7 @@ v3_cpu_mode_t v3_get_host_cpu_mode() { -void v3_yield_cond(struct guest_info * info) { +void v3_yield_cond(struct guest_info * info, int usec) { uint64_t cur_cycle; cur_cycle = v3_get_host_time(&info->time_state); @@ -699,7 +699,12 @@ void v3_yield_cond(struct guest_info * info) { // (void *)cur_cycle, (void *)info->yield_start_cycle, // (void *)info->yield_cycle_period); - V3_Yield(); + if (usec < 0) { + V3_Yield(); + } else { + V3_Yield_Timed(usec); + } + info->yield_start_cycle += info->vm_info->yield_cycle_period; } } @@ -709,9 +714,16 @@ void v3_yield_cond(struct guest_info * info) { * unconditional cpu yield * if the yielding thread is a guest context, the guest quantum is reset on resumption * Non guest context threads should call this function with a NULL argument - */ -void v3_yield(struct guest_info * info) { - V3_Yield(); + * + * usec <0 => the non-timed yield is used + * usec >=0 => the timed yield is used, which also usually implies interruptible + */ +void v3_yield(struct guest_info * info, int usec) { + if (usec < 0) { + V3_Yield(); + } else { + V3_Yield_Timed(usec); + } if (info) { info->yield_start_cycle += info->vm_info->yield_cycle_period; @@ -719,18 +731,6 @@ void v3_yield(struct guest_info * info) { } -/* - * unconditional cpu yield for a period of time - * Otherwise identical to v3_yield - */ -void v3_yield_timed(struct guest_info *info, unsigned int usec) -{ - V3_Yield_Timed(usec); - - if (info) { - info->yield_start_cycle += info->vm_info->yield_cycle_period; - } -} void v3_print_cond(const char * fmt, ...) { diff --git a/palacios/src/palacios/vmm_barrier.c b/palacios/src/palacios/vmm_barrier.c index 961b894..e6f1221 100644 --- a/palacios/src/palacios/vmm_barrier.c +++ b/palacios/src/palacios/vmm_barrier.c @@ -120,7 +120,7 @@ int v3_wait_for_barrier(struct v3_vm_info * vm_info, struct guest_info * local_c break; } - v3_yield(local_core); + v3_yield(local_core,-1); } return 0; @@ -199,7 +199,7 @@ int v3_wait_at_barrier(struct guest_info * core) { // wait for cpu bit to clear while (v3_bitmap_check(&(barrier->cpu_map), core->vcpu_id)) { - v3_yield(core); + v3_yield(core,-1); } return 0; diff --git a/palacios/src/palacios/vmm_halt.c b/palacios/src/palacios/vmm_halt.c index 60ca74b..e7862c8 100644 --- a/palacios/src/palacios/vmm_halt.c +++ b/palacios/src/palacios/vmm_halt.c @@ -46,7 +46,7 @@ int v3_handle_halt(struct guest_info * info) { uint64_t t, cycles; /* Yield, allowing time to pass while yielded */ t = v3_get_host_time(&info->time_state); - v3_yield_timed(info,YIELD_TIME_USEC); + v3_yield(info,YIELD_TIME_USEC); cycles = v3_get_host_time(&info->time_state) - t; v3_advance_time(info, &cycles); diff --git a/palacios/src/palacios/vmm_time.c b/palacios/src/palacios/vmm_time.c index d9ca1d6..3fb36ce 100644 --- a/palacios/src/palacios/vmm_time.c +++ b/palacios/src/palacios/vmm_time.c @@ -107,7 +107,7 @@ int v3_start_time(struct guest_info * info) { info->time_state.guest_cycles = 0; PrintDebug("Starting time for core %d at host time %llu/guest time %llu.\n", info->vcpu_id, t, info->time_state.guest_cycles); - v3_yield(info); + v3_yield(info,-1); return 0; } diff --git a/palacios/src/palacios/vmx.c b/palacios/src/palacios/vmx.c index a80b8f2..ed5140f 100644 --- a/palacios/src/palacios/vmx.c +++ b/palacios/src/palacios/vmx.c @@ -948,7 +948,7 @@ int v3_vmx_enter(struct guest_info * info) { uint64_t guest_cycles = 0; // Conditionally yield the CPU if the timeslice has expired - v3_yield_cond(info); + v3_yield_cond(info,-1); // Update timer devices late after being in the VM so that as much // of the time in the VM is accounted for as possible. Also do it before @@ -1105,7 +1105,7 @@ int v3_vmx_enter(struct guest_info * info) { v3_enable_ints(); // Conditionally yield the CPU if the timeslice has expired - v3_yield_cond(info); + v3_yield_cond(info,-1); v3_advance_time(info, NULL); v3_update_timers(info); @@ -1140,7 +1140,7 @@ int v3_start_vmx_guest(struct guest_info * info) { return 0; } - v3_yield(info); + v3_yield(info,-1); //PrintDebug("VMX core %u: still waiting for INIT\n",info->vcpu_id); }