X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_barrier.c;h=a94e40f157eb5d82c2b370886ce2022eb2d73d85;hb=6fa605075d1944da0a88a389122ea24bbc583329;hp=19b2db268718b1de39b78d1b4e6226ad84362072;hpb=3848474666fa030031e14b9fdea4caf886e034ca;p=palacios.git diff --git a/palacios/src/palacios/vmm_barrier.c b/palacios/src/palacios/vmm_barrier.c index 19b2db2..a94e40f 100644 --- a/palacios/src/palacios/vmm_barrier.c +++ b/palacios/src/palacios/vmm_barrier.c @@ -120,6 +120,7 @@ int v3_wait_for_barrier(struct v3_vm_info * vm_info, struct guest_info * local_c break; } + // return immediately and spin if there is no one to yield to v3_yield(local_core,-1); } @@ -142,7 +143,7 @@ int v3_raise_barrier(struct v3_vm_info * vm_info, struct guest_info * local_core int ret = 0; - if ((vm_info->run_state != VM_RUNNING) || + if ((vm_info->run_state != VM_RUNNING) && (vm_info->run_state != VM_SIMULATING)) { return 0; } @@ -169,7 +170,7 @@ int v3_lower_barrier(struct v3_vm_info * vm_info) { struct v3_barrier * barrier = &(vm_info->barrier); - if ((vm_info->run_state != VM_RUNNING) || + if ((vm_info->run_state != VM_RUNNING) && (vm_info->run_state != VM_SIMULATING)) { return 0; } @@ -197,8 +198,15 @@ int v3_wait_at_barrier(struct guest_info * core) { if (barrier->active == 0) { return 0; } +#ifndef V3_CONFIG_FP_SWITCH + v3_get_fp_state(core); // snapshot FP state now +#else +# ifdef V3_CONFIG_LAZY_FP_SWITCH + v3_get_fp_state(core); // snapshot FP state now regardless of lazy eval +# endif +#endif - V3_Print("Core %d waiting at barrier\n", core->vcpu_id); + V3_Print(core->vm_info, core, "Core %d waiting at barrier\n", core->vcpu_id); /* Barrier has been activated. * Wait here until it's lowered @@ -207,12 +215,21 @@ int v3_wait_at_barrier(struct guest_info * core) { // set cpu bit in barrier bitmap v3_bitmap_set(&(barrier->cpu_map), core->vcpu_id); - V3_Print("Core %d bit set as waiting\n", core->vcpu_id); + V3_Print(core->vm_info, core, "Core %d bit set as waiting\n", core->vcpu_id); // wait for cpu bit to clear while (v3_bitmap_check(&(barrier->cpu_map), core->vcpu_id)) { + // Barrier wait will spin if there is no competing work v3_yield(core,-1); } +#ifndef V3_CONFIG_FP_SWITCH + core->fp_state.need_restore=1; // restore FP on next entry +#else +# ifdef V3_CONFIG_LAZY_FP_SWITCH + core->fp_state.need_restore=1; // restore FP on next entry +# endif +#endif + return 0; }