VirtualBox

Changeset 74838 in vbox


Ignore:
Timestamp:
Oct 15, 2018 9:25:50 AM (6 years ago)
Author:
vboxsync
Message:

DrvVD: Fixed failing suspend/resume cycle if an recoverable error occurs a second time, need to clear the redo flag on resume. Fixed active I/O request accounting

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DrvVD.cpp

    r74309 r74838  
    29152915    bool fXchg = ASMAtomicCmpXchgU32((volatile uint32_t *)&pIoReq->enmState, VDIOREQSTATE_COMPLETING, VDIOREQSTATE_ACTIVE);
    29162916    if (fXchg)
    2917         ASMAtomicDecU32(&pThis->cIoReqsActive);
     2917    {
     2918        uint32_t cNew = ASMAtomicDecU32(&pThis->cIoReqsActive);
     2919        AssertMsg(cNew != UINT32_MAX, ("Number of active requests underflowed!\n"));
     2920    }
    29182921    else
    29192922    {
     
    30623065            RTListAppend(&pThis->LstIoReqRedo, &pIoReq->NdLstWait);
    30633066            RTCritSectLeave(&pThis->CritSectIoReqRedo);
    3064             ASMAtomicDecU32(&pThis->cIoReqsActive);
     3067            uint32_t cNew = ASMAtomicDecU32(&pThis->cIoReqsActive);
     3068            AssertMsg(cNew != UINT32_MAX, ("Number of active requests underflowed!\n"));
    30653069            pThis->pDrvMediaExPort->pfnIoReqStateChanged(pThis->pDrvMediaExPort, pIoReq, &pIoReq->abAlloc[0],
    30663070                                                         PDMMEDIAEXIOREQSTATE_SUSPENDED);
     3071            LogFlowFunc(("Suspended I/O request %#p\n", pIoReq));
    30673072            rcReq = VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS;
    30683073        }
     
    31573162                pThis->pDrvMediaExPort->pfnIoReqStateChanged(pThis->pDrvMediaExPort, pIoReq, &pIoReq->abAlloc[0],
    31583163                                                             PDMMEDIAEXIOREQSTATE_SUSPENDED);
     3164            LogFlowFunc(("Suspended I/O request %#p\n", pIoReq));
    31593165            RTCritSectLeave(&pThis->CritSectIoReqsIoBufWait);
    31603166            rc = VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS;
     
    37033709    }
    37043710
    3705     if (fXchg)
    3706         ASMAtomicDecU32(&pThis->cIoReqsActive);
     3711    if (fXchg && enmStateOld == VDIOREQSTATE_ACTIVE)
     3712    {
     3713        uint32_t cNew = ASMAtomicDecU32(&pThis->cIoReqsActive);
     3714        AssertMsg(cNew != UINT32_MAX, ("Number of active requests underflowed!\n"));
     3715    }
    37073716
    37083717    return fXchg;
     
    37463755        pThis->pDrvMediaExPort->pfnIoReqStateChanged(pThis->pDrvMediaExPort, pIoReqCur, &pIoReqCur->abAlloc[0],
    37473756                                                     PDMMEDIAEXIOREQSTATE_SUSPENDED);
     3757        LogFlowFunc(("Suspended I/O request %#p\n", pIoReqCur));
    37483758    }
    37493759    RTCritSectLeave(&pThis->CritSectIoReqsIoBufWait);
     
    47534763    drvvdSetWritable(pThis);
    47544764    pThis->fSuspending      = false;
     4765    pThis->fRedo            = false;
    47554766
    47564767    if (pThis->pBlkCache)
     
    47704781                                                         PDMMEDIAEXIOREQSTATE_ACTIVE);
    47714782            ASMAtomicIncU32(&pThis->cIoReqsActive);
     4783            LogFlowFunc(("Resumed I/O request %#p\n", pIoReq));
    47724784        }
    47734785        RTCritSectLeave(&pThis->CritSectIoReqsIoBufWait);
     
    47834795            ASMAtomicIncU32(&pThis->cIoReqsActive);
    47844796
     4797            LogFlowFunc(("Resuming I/O request %#p fXchg=%RTbool\n", pIoReq, fXchg));
    47854798            if (fXchg)
    47864799            {
    47874800                pThis->pDrvMediaExPort->pfnIoReqStateChanged(pThis->pDrvMediaExPort, pIoReq, &pIoReq->abAlloc[0],
    47884801                                                             PDMMEDIAEXIOREQSTATE_ACTIVE);
     4802                LogFlowFunc(("Resumed I/O request %#p\n", pIoReq));
    47894803                if (   pIoReq->enmType == PDMMEDIAEXIOREQTYPE_READ
    47904804                    || pIoReq->enmType == PDMMEDIAEXIOREQTYPE_WRITE)
     
    49875001    pThis->pRegionList                  = NULL;
    49885002    pThis->fSuspending                  = false;
     5003    pThis->fRedo                        = false;
    49895004
    49905005    for (unsigned i = 0; i < RT_ELEMENTS(pThis->aIoReqAllocBins); i++)
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