VirtualBox

Changeset 61643 in vbox


Ignore:
Timestamp:
Jun 10, 2016 1:07:04 AM (8 years ago)
Author:
vboxsync
Message:

EM,VMM: Attempt at dealing with guru meditations in SMP VMs.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/vmapi.h

    r60404 r61643  
    437437VMMR3DECL(int)          VMR3AtStateRegister(PUVM pUVM, PFNVMATSTATE pfnAtState, void *pvUser);
    438438VMMR3DECL(int)          VMR3AtStateDeregister(PUVM pUVM, PFNVMATSTATE pfnAtState, void *pvUser);
     439VMMR3_INT_DECL(bool)    VMR3SetGuruMeditation(PVM pVM);
    439440VMMR3_INT_DECL(bool)    VMR3TeleportedAndNotFullyResumedYet(PVM pVM);
    440441VMMR3DECL(int)          VMR3AtErrorRegister(PUVM pUVM, PFNVMATERROR pfnAtError, void *pvUser);
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r61633 r61643  
    16951695                case VMSTATE_FATAL_ERROR:
    16961696                case VMSTATE_FATAL_ERROR_LS:
     1697                case VMSTATE_GURU_MEDITATION:
     1698                case VMSTATE_GURU_MEDITATION_LS:
    16971699                    Log2(("emR3ForcedActions: %s -> VINF_EM_SUSPEND\n", VMGetStateName(enmState) ));
    16981700                    STAM_REL_PROFILE_STOP(&pVCpu->em.s.StatForcedActions, a);
     
    20362038                case VMSTATE_FATAL_ERROR:
    20372039                case VMSTATE_FATAL_ERROR_LS:
     2040                case VMSTATE_GURU_MEDITATION:
     2041                case VMSTATE_GURU_MEDITATION_LS:
    20382042                    Log2(("emR3ForcedActions: %s -> VINF_EM_SUSPEND\n", VMGetStateName(enmState) ));
    20392043                    STAM_REL_PROFILE_STOP(&pVCpu->em.s.StatForcedActions, a);
     
    26552659                            /* switch to guru meditation mode */
    26562660                            pVCpu->em.s.enmState = EMSTATE_GURU_MEDITATION;
     2661                            VMR3SetGuruMeditation(pVM); /* This notifies the other EMTs. */
    26572662                            VMMR3FatalDump(pVM, pVCpu, rc);
    26582663                        }
     
    26722677                {
    26732678                    TMR3NotifySuspend(pVM, pVCpu);
     2679                    VMR3SetGuruMeditation(pVM); /* This notifies the other EMTs. */
    26742680                    VMMR3FatalDump(pVM, pVCpu, rc);
    26752681                    emR3Debug(pVM, pVCpu, rc);
     
    27012707        Log(("EMR3ExecuteVM: returns %Rrc because of longjmp / fatal error; (state %s / %s)\n", rc, emR3GetStateName(pVCpu->em.s.enmState), emR3GetStateName(pVCpu->em.s.enmPrevState)));
    27022708        TMR3NotifySuspend(pVM, pVCpu);
     2709        VMR3SetGuruMeditation(pVM); /* This notifies the other EMTs. */
    27032710        VMMR3FatalDump(pVM, pVCpu, rc);
    27042711        emR3Debug(pVM, pVCpu, rc);
  • trunk/src/VBox/VMM/VMMR3/VM.cpp

    r61570 r61643  
    123123static void                 vmR3DoAtState(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld);
    124124static int                  vmR3TrySetState(PVM pVM, const char *pszWho, unsigned cTransitions, ...);
    125 static void                 vmR3SetStateLocked(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld);
     125static void                 vmR3SetStateLocked(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld, bool fSetRatherThanClearFF);
    126126static void                 vmR3SetState(PVM pVM, VMSTATE enmStateNew, VMSTATE enmStateOld);
    127127static int                  vmR3SetErrorU(PUVM pUVM, int rc, RT_SRC_POS_DECL, const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(6, 7);
     
    15951595        {
    15961596            case VMSTATE_RUNNING_LS:
    1597                 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDING_LS, VMSTATE_RUNNING_LS);
     1597                vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDING_LS, VMSTATE_RUNNING_LS, false /*fSetRatherThanClearFF*/);
    15981598                rc = VINF_SUCCESS;
    15991599                break;
     
    16091609
    16101610            case VMSTATE_OFF_LS:
    1611                 vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF, VMSTATE_OFF_LS);
     1611                vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF, VMSTATE_OFF_LS, false /*fSetRatherThanClearFF*/);
    16121612                rc = VERR_SSM_LIVE_POWERED_OFF;
    16131613                break;
    16141614
    16151615            case VMSTATE_FATAL_ERROR_LS:
    1616                 vmR3SetStateLocked(pVM, pUVM, VMSTATE_FATAL_ERROR, VMSTATE_FATAL_ERROR_LS);
     1616                vmR3SetStateLocked(pVM, pUVM, VMSTATE_FATAL_ERROR, VMSTATE_FATAL_ERROR_LS, false /*fSetRatherThanClearFF*/);
    16171617                rc = VERR_SSM_LIVE_FATAL_ERROR;
    16181618                break;
    16191619
    16201620            case VMSTATE_GURU_MEDITATION_LS:
    1621                 vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION, VMSTATE_GURU_MEDITATION_LS);
     1621                vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION, VMSTATE_GURU_MEDITATION_LS, false /*fSetRatherThanClearFF*/);
    16221622                rc = VERR_SSM_LIVE_GURU_MEDITATION;
    16231623                break;
     
    23392339        enmVMState = pVM->enmVMState;
    23402340        if (enmVMState == VMSTATE_POWERING_OFF_LS)
    2341             vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF_LS, VMSTATE_POWERING_OFF_LS);
     2341            vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF_LS, VMSTATE_POWERING_OFF_LS, false /*fSetRatherThanClearFF*/);
    23422342        else
    2343             vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF,    VMSTATE_POWERING_OFF);
     2343            vmR3SetStateLocked(pVM, pUVM, VMSTATE_OFF,    VMSTATE_POWERING_OFF, false /*fSetRatherThanClearFF*/);
    23442344        RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
    23452345    }
     
    27782778        {
    27792779            if (pUVM->vm.s.enmPrevVMState == VMSTATE_SUSPENDED)
    2780                 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDED, VMSTATE_SOFT_RESETTING);
     2780                vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDED, VMSTATE_SOFT_RESETTING, false /*fSetRatherThanClearFF*/);
    27812781            else
    2782                 vmR3SetStateLocked(pVM, pUVM, VMSTATE_RUNNING,   VMSTATE_SOFT_RESETTING);
     2782                vmR3SetStateLocked(pVM, pUVM, VMSTATE_RUNNING,   VMSTATE_SOFT_RESETTING, false /*fSetRatherThanClearFF*/);
    27832783        }
    27842784        else
    2785             vmR3SetStateLocked(pVM, pUVM, VMSTATE_RUNNING_LS, VMSTATE_SOFT_RESETTING_LS);
     2785            vmR3SetStateLocked(pVM, pUVM, VMSTATE_RUNNING_LS, VMSTATE_SOFT_RESETTING_LS, false /*fSetRatherThanClearFF*/);
    27862786        RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
    27872787    }
     
    28952895        {
    28962896            if (pUVM->vm.s.enmPrevVMState == VMSTATE_SUSPENDED)
    2897                 vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDED, VMSTATE_RESETTING);
     2897                vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDED, VMSTATE_RESETTING, false /*fSetRatherThanClearFF*/);
    28982898            else
    2899                 vmR3SetStateLocked(pVM, pUVM, VMSTATE_RUNNING,   VMSTATE_RESETTING);
     2899                vmR3SetStateLocked(pVM, pUVM, VMSTATE_RUNNING,   VMSTATE_RESETTING, false /*fSetRatherThanClearFF*/);
    29002900        }
    29012901        else
    2902             vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDING_LS, VMSTATE_RESETTING_LS);
     2902            vmR3SetStateLocked(pVM, pUVM, VMSTATE_SUSPENDING_LS, VMSTATE_RESETTING_LS, false /*fSetRatherThanClearFF*/);
    29032903        RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
    29042904
     
    34863486 * Sets the current VM state, with the AtStatCritSect already entered.
    34873487 *
    3488  * @param   pVM                 The cross context VM structure.
    3489  * @param   pUVM                The UVM handle.
    3490  * @param   enmStateNew         The new state.
    3491  * @param   enmStateOld         The old state.
    3492  */
    3493 static void vmR3SetStateLocked(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld)
     3488 * @param   pVM                     The cross context VM structure.
     3489 * @param   pUVM                    The UVM handle.
     3490 * @param   enmStateNew             The new state.
     3491 * @param   enmStateOld             The old state.
     3492 * @param   fSetRatherThanClearFF   The usual behavior is to clear the
     3493 *                                  VM_FF_CHECK_VM_STATE force flag, but for
     3494 *                                  some transitions (-> guru) we need to kick
     3495 *                                  the other EMTs to stop what they're doing.
     3496 */
     3497static void vmR3SetStateLocked(PVM pVM, PUVM pUVM, VMSTATE enmStateNew, VMSTATE enmStateOld, bool fSetRatherThanClearFF)
    34943498{
    34953499    vmR3ValidateStateTransition(enmStateOld, enmStateNew);
     
    34973501    AssertMsg(pVM->enmVMState == enmStateOld,
    34983502              ("%s != %s\n", VMR3GetStateName(pVM->enmVMState), VMR3GetStateName(enmStateOld)));
     3503
    34993504    pUVM->vm.s.enmPrevVMState = enmStateOld;
    35003505    pVM->enmVMState           = enmStateNew;
    3501     VM_FF_CLEAR(pVM, VM_FF_CHECK_VM_STATE);
     3506
     3507    if (!fSetRatherThanClearFF)
     3508        VM_FF_CLEAR(pVM, VM_FF_CHECK_VM_STATE);
     3509    else if (pVM->cCpus > 0)
     3510        VM_FF_SET(pVM, VM_FF_CHECK_VM_STATE);
    35023511
    35033512    vmR3DoAtState(pVM, pUVM, enmStateNew, enmStateOld);
     
    35193528    AssertMsg(pVM->enmVMState == enmStateOld,
    35203529              ("%s != %s\n", VMR3GetStateName(pVM->enmVMState), VMR3GetStateName(enmStateOld)));
    3521     vmR3SetStateLocked(pVM, pUVM, enmStateNew, pVM->enmVMState);
     3530    vmR3SetStateLocked(pVM, pUVM, enmStateNew, pVM->enmVMState, false /*fSetRatherThanClearFF*/);
    35223531
    35233532    RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
     
    35723581        if (enmStateCur == enmStateOld)
    35733582        {
    3574             vmR3SetStateLocked(pVM, pUVM, enmStateNew, enmStateOld);
     3583            vmR3SetStateLocked(pVM, pUVM, enmStateNew, enmStateOld, false /*fSetRatherThanClearFF*/);
    35753584            rc = i + 1;
    35763585            break;
     
    36223631
    36233632/**
    3624  * Flag a guru meditation ... a hack.
    3625  *
     3633 * Interface used by EM to signal that it's entering the guru meditation state.
     3634 *
     3635 * This will notifying other threads.
     3636 *
     3637 * @returns true if the state changed to Guru, false if no state change.
    36263638 * @param   pVM             The cross context VM structure.
    3627  *
    3628  * @todo    Rewrite this part. The guru meditation should be flagged
    3629  *          immediately by the VMM and not by VMEmt.cpp when it's all over.
    3630  */
    3631 void vmR3SetGuruMeditation(PVM pVM)
     3639 */
     3640VMMR3_INT_DECL(bool) VMR3SetGuruMeditation(PVM pVM)
    36323641{
    36333642    PUVM pUVM = pVM->pUVM;
     
    36353644
    36363645    VMSTATE enmStateCur = pVM->enmVMState;
     3646    bool fRc = true;
    36373647    if (enmStateCur == VMSTATE_RUNNING)
    3638         vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION, VMSTATE_RUNNING);
     3648        vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION, VMSTATE_RUNNING, true /*fSetRatherThanClearFF*/);
    36393649    else if (enmStateCur == VMSTATE_RUNNING_LS)
    36403650    {
    3641         vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION_LS, VMSTATE_RUNNING_LS);
     3651        vmR3SetStateLocked(pVM, pUVM, VMSTATE_GURU_MEDITATION_LS, VMSTATE_RUNNING_LS, true /*fSetRatherThanClearFF*/);
    36423652        SSMR3Cancel(pUVM);
    36433653    }
     3654    else
     3655        fRc = false;
    36443656
    36453657    RTCritSectLeave(&pUVM->vm.s.AtStateCritSect);
     3658    return fRc;
    36463659}
    36473660
  • trunk/src/VBox/VMM/VMMR3/VMEmt.cpp

    r61628 r61643  
    237237                rc = EMR3ExecuteVM(pVM, pVCpu);
    238238                Log(("vmR3EmulationThread: EMR3ExecuteVM() -> rc=%Rrc, enmVMState=%d\n", rc, pVM->enmVMState));
    239                 if (EMGetState(pVCpu) == EMSTATE_GURU_MEDITATION)
    240                     vmR3SetGuruMeditation(pVM);
    241239            }
    242240        }
  • trunk/src/VBox/VMM/include/VMInternal.h

    r56287 r61643  
    457457DECLCALLBACK(int)   vmR3SetRuntimeErrorV(PVM pVM, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, va_list *pVa);
    458458void                vmSetRuntimeErrorCopy(PVM pVM, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, va_list va);
    459 void                vmR3SetGuruMeditation(PVM pVM);
    460459void                vmR3SetTerminated(PVM pVM);
    461460
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette