VirtualBox

Changeset 81658 in vbox for trunk/src/VBox/Devices/Storage


Ignore:
Timestamp:
Nov 4, 2019 8:31:12 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134418
Message:

Virtio_1_0,DevVirtioScsi: Refactored code to not use the heap for the virtio state. Untested! bugref:9218 bugref:9440

File:
1 edited

Legend:

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

    r81645 r81658  
    5656
    5757
     58/*********************************************************************************************************************************
     59*   Defined Constants And Macros                                                                                                 *
     60*********************************************************************************************************************************/
     61/** The current saved state version. */
     62#define VIRTIOSCSI_SAVED_STATE_VERSION          UINT32_C(1)
     63
     64
    5865#define LUN0    0
    5966/** @name VirtIO 1.0 SCSI Host feature bits (See VirtIO 1.0 specification, Section 5.6.3)
     
    113120    ((pMediaExTxDirEnumValue) == PDMMEDIAEXIOREQSCSITXDIR_TO_DEVICE)
    114121
     122
     123/*********************************************************************************************************************************
     124*   Structures and Typedefs                                                                                                      *
     125*********************************************************************************************************************************/
    115126/**
    116127 * VirtIO SCSI Host Device device-specific configuration (see VirtIO 1.0, section 5.6.4)
     
    390401typedef struct VIRTIOSCSI
    391402{
    392     /* Opaque handle to VirtIO common framework (must be first item
    393      * in this struct so PDMDEVINS_2_DATA macro's casting works) */
    394     VIRTIOHANDLE                    hVirtio;
     403    /** The virtio state.   */
     404    VIRTIOSTATE                     Virtio;
    395405
    396406    /** Number of targets detected */
     
    645655    }
    646656
    647     if (virtioQueueIsEmpty(pThis->hVirtio, EVENTQ_IDX))
     657    if (virtioQueueIsEmpty(&pThis->Virtio, EVENTQ_IDX))
    648658    {
    649659        LogFunc(("eventq is empty, events missed (driver didn't preload queue)!\n"));
     
    653663
    654664    PVIRTIO_DESC_CHAIN_T pDescChain;
    655     virtioQueueGet(pThis->hVirtio, EVENTQ_IDX, &pDescChain, true);
     665    virtioQueueGet(&pThis->Virtio, EVENTQ_IDX, &pDescChain, true);
    656666
    657667    RTSGBUF reqSegBuf;
     
    659669    RTSgBufInit(&reqSegBuf, aReqSegs, RT_ELEMENTS(aReqSegs));
    660670
    661     virtioQueuePut( pThis->hVirtio, EVENTQ_IDX, &reqSegBuf, pDescChain, true);
    662     virtioQueueSync(pThis->hVirtio, EVENTQ_IDX);
     671    virtioQueuePut( &pThis->Virtio, EVENTQ_IDX, &reqSegBuf, pDescChain, true);
     672    virtioQueueSync(&pThis->Virtio, EVENTQ_IDX);
    663673
    664674    return VINF_SUCCESS;
     
    709719        pRespHdr->uResponse = VIRTIOSCSI_S_RESET;
    710720
    711     virtioQueuePut(pThis->hVirtio, qIdx, &reqSegBuf, pDescChain, true /* fFence */);
    712     virtioQueueSync(pThis->hVirtio, qIdx);
     721    virtioQueuePut(&pThis->Virtio, qIdx, &reqSegBuf, pDescChain, true /* fFence */);
     722    virtioQueueSync(&pThis->Virtio, qIdx);
    713723
    714724    RTMemFree(pabSenseBuf);
     
    865875
    866876
    867         virtioQueuePut(pThis->hVirtio, pReq->qIdx, &reqSegBuf, pReq->pDescChain, true /* fFence TBD */);
    868         virtioQueueSync(pThis->hVirtio, pReq->qIdx);
     877        virtioQueuePut(&pThis->Virtio, pReq->qIdx, &reqSegBuf, pReq->pDescChain, true /* fFence TBD */);
     878        virtioQueueSync(&pThis->Virtio, pReq->qIdx);
    869879
    870880
     
    14071417
    14081418    LogFunc(("Response code: %s\n", virtioGetReqRespText(bResponse)));
    1409     virtioQueuePut( pThis->hVirtio, qIdx, &reqSegBuf, pDescChain, true);
    1410     virtioQueueSync(pThis->hVirtio, qIdx);
     1419    virtioQueuePut( &pThis->Virtio, qIdx, &reqSegBuf, pDescChain, true);
     1420    virtioQueueSync(&pThis->Virtio, qIdx);
    14111421
    14121422    return VINF_SUCCESS;
     
    14381448    while (pThread->enmState == PDMTHREADSTATE_RUNNING)
    14391449    {
    1440         if (virtioQueueIsEmpty(pThis->hVirtio, qIdx))
     1450        if (virtioQueueIsEmpty(&pThis->Virtio, qIdx))
    14411451        {
    14421452            /* Atomic interlocks avoid missing alarm while going to sleep & notifier waking the awoken */
     
    14661476             Log6Func(("fetching next descriptor chain from %s\n", QUEUENAME(qIdx)));
    14671477             PVIRTIO_DESC_CHAIN_T pDescChain;
    1468              int rc = virtioQueueGet(pThis->hVirtio, qIdx, &pDescChain, true);
     1478             int rc = virtioQueueGet(&pThis->Virtio, qIdx, &pDescChain, true);
    14691479             if (rc == VERR_NOT_AVAILABLE)
    14701480             {
     
    15721582 * @callback_method_impl{FNVIRTIOQUEUENOTIFIED}
    15731583 */
    1574 static DECLCALLBACK(void) virtioScsiR3Notified(VIRTIOHANDLE hVirtio, void *pClient, uint16_t qIdx)
    1575 {
    1576     RT_NOREF(hVirtio);
    1577 
     1584static DECLCALLBACK(void) virtioScsiR3Notified(PVIRTIOSTATE pVirtio, uint16_t qIdx)
     1585{
    15781586    AssertReturnVoid(qIdx < VIRTIOSCSI_QUEUE_CNT);
    1579     PVIRTIOSCSI pThis = (PVIRTIOSCSI)pClient;
     1587    PVIRTIOSCSI pThis = RT_FROM_MEMBER(pVirtio, VIRTIOSCSI, Virtio);
    15801588    PVIRTIOSCSIWORKER pWorker = &pThis->aWorkers[qIdx];
    15811589
     
    16091617 * @callback_method_impl{FNVIRTIOSTATUSCHANGED}
    16101618 */
    1611 static DECLCALLBACK(void) virtioScsiR3StatusChanged(VIRTIOHANDLE hVirtio, void *pClient,  uint32_t fVirtioReady)
    1612 {
    1613     RT_NOREF(hVirtio);
    1614     PVIRTIOSCSI pThis = (PVIRTIOSCSI)pClient;
     1619static DECLCALLBACK(void) virtioScsiR3StatusChanged(PVIRTIOSTATE pVirtio,  uint32_t fVirtioReady)
     1620{
     1621    PVIRTIOSCSI pThis = RT_FROM_MEMBER(pVirtio, VIRTIOSCSI, Virtio);
    16151622
    16161623    pThis->fVirtioReady = fVirtioReady;
     
    16191626    {
    16201627        LogFunc(("VirtIO ready\n-----------------------------------------------------------------------------------------\n"));
    1621         uint64_t features    = virtioGetNegotiatedFeatures(hVirtio);
    1622         pThis->fHasT10pi     = features & VIRTIO_SCSI_F_T10_PI;
    1623         pThis->fHasHotplug   = features & VIRTIO_SCSI_F_HOTPLUG;
    1624         pThis->fHasInOutBufs = features & VIRTIO_SCSI_F_INOUT;
    1625         pThis->fHasLunChange = features & VIRTIO_SCSI_F_CHANGE;
     1628        uint64_t fFeatures   = virtioGetNegotiatedFeatures(&pThis->Virtio);
     1629        pThis->fHasT10pi     = fFeatures & VIRTIO_SCSI_F_T10_PI;
     1630        pThis->fHasHotplug   = fFeatures & VIRTIO_SCSI_F_HOTPLUG;
     1631        pThis->fHasInOutBufs = fFeatures & VIRTIO_SCSI_F_INOUT;
     1632        pThis->fHasLunChange = fFeatures & VIRTIO_SCSI_F_CHANGE;
    16261633        pThis->fQuiescing    = false;
    16271634        pThis->fResetting    = false;
     
    18961903
    18971904/**
    1898  * @callback_method_impl{FNSSMDEVLIVEEXEC}
    1899  */
    1900 static DECLCALLBACK(int) virtioScsiR3LiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass)
    1901 {
    1902     LogFunc(("LIVE EXEC!!\n"));
     1905 * @callback_method_impl{FNSSMDEVLOADEXEC}
     1906 */
     1907static DECLCALLBACK(int) virtioScsiR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
     1908{
    19031909    PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI);
    1904     RT_NOREF(pThis);
    1905     RT_NOREF(uPass);
    1906     RT_NOREF(pSSM);
    1907     return VINF_SSM_DONT_CALL_AGAIN;
    1908 }
    1909 
    1910 /**
    1911  * @callback_method_impl{FNSSMDEVLOADEXEC}
    1912  */
    1913 static DECLCALLBACK(int) virtioScsiR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
    1914 {
    19151910    LogFunc(("LOAD EXEC!!\n"));
    1916     PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI);
     1911
     1912    AssertReturn(uPass == SSM_PASS_FINAL, VERR_SSM_UNEXPECTED_PASS);
     1913    AssertLogRelMsgReturn(uVersion == VIRTIOSCSI_SAVED_STATE_VERSION,
     1914                          ("uVersion=%u\n", uVersion), VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION);
     1915
    19171916    SSMR3GetU32(pSSM, &pThis->virtioScsiConfig.uNumQueues);
    19181917    SSMR3GetU32(pSSM, &pThis->virtioScsiConfig.uSegMax);
     
    19341933    SSMR3GetU32(pSSM, &pThis->fHasLunChange);
    19351934    SSMR3GetU32(pSSM, &pThis->fResetting);
    1936     SSMR3GetU32(pSSM, &pThis->fQuiescing);
    1937     RT_NOREF(uPass);
    1938     RT_NOREF(uVersion);
    1939     return VINF_SUCCESS;
     1935    int rc = SSMR3GetU32(pSSM, &pThis->fQuiescing);
     1936    AssertRCReturn(rc, rc);
     1937
     1938    /*
     1939     * Call the virtio core to let it load its state.
     1940     */
     1941    return virtioR3LoadExec(&pThis->Virtio, pDevIns->pHlpR3, pSSM);
    19401942}
    19411943
     
    19451947static DECLCALLBACK(int) virtioScsiR3SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
    19461948{
     1949    PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI);
    19471950    LogFunc(("SAVE EXEC!!\n"));
    1948     PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI);
    19491951
    19501952    SSMR3PutU32(pSSM, pThis->virtioScsiConfig.uNumQueues);
     
    19721974    SSMR3PutU32(pSSM, pThis->fQuiescing); /** @todo r=bird: This shall always be false, as the VM is suspended when saving, so no need to save this */
    19731975
    1974     return VINF_SUCCESS;
    1975 }
    1976 
    1977 /**
    1978  * @callback_method_impl{FNSSMDEVLOADDONE}
    1979  */
    1980 static DECLCALLBACK(int) virtioScsiR3LoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
    1981 {
    1982     LogFunc(("callback"));
    1983     PVIRTIOSCSI pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIOSCSI);
    1984     RT_NOREF(pThis);
    1985     RT_NOREF(pSSM);
    1986     return VINF_SUCCESS;
     1976    /*
     1977     * Call the virtio core to let it save its state.
     1978     */
     1979    return virtioR3SaveExec(&pThis->Virtio, pDevIns->pHlpR3, pSSM);
    19871980}
    19881981
     
    21162109
    21172110    /* Ensure guest is working the queues too. */
    2118     virtioPropagateResumeNotification(pThis->hVirtio);
     2111    virtioPropagateResumeNotification(&pThis->Virtio);
    21192112}
    21202113
     
    22602253    pThis->virtioScsiConfig.uMaxLun         = VIRTIOSCSI_MAX_LUN;
    22612254
    2262     rc = virtioConstruct(pDevIns, pThis, &pThis->hVirtio, pVirtioPciParams, pThis->szInstance,
    2263                          VIRTIOSCSI_HOST_SCSI_FEATURES_OFFERED,
    2264                          virtioScsiR3DevCapRead,
    2265                          virtioScsiR3DevCapWrite,
    2266                          virtioScsiR3StatusChanged,
    2267                          virtioScsiR3Notified,
    2268                          virtioScsiR3LiveExec,
    2269                          virtioScsiR3SaveExec,
    2270                          virtioScsiR3LoadExec,
    2271                          virtioScsiR3LoadDone,
    2272                          sizeof(VIRTIOSCSI_CONFIG_T) /* cbDevSpecificCap */,
    2273                          (void *)&pThis->virtioScsiConfig /* pDevSpecificCap */);
     2255    /* Initialize the generic Virtio core: */
     2256    pThis->Virtio.Callbacks.pfnStatusChanged  = virtioScsiR3StatusChanged;
     2257    pThis->Virtio.Callbacks.pfnQueueNotified  = virtioScsiR3Notified;
     2258    pThis->Virtio.Callbacks.pfnDevCapRead     = virtioScsiR3DevCapRead;
     2259    pThis->Virtio.Callbacks.pfnDevCapWrite    = virtioScsiR3DevCapWrite;
     2260
     2261    rc = virtioR3Init(&pThis->Virtio, pDevIns, pVirtioPciParams, pThis->szInstance, VIRTIOSCSI_HOST_SCSI_FEATURES_OFFERED,
     2262                      &pThis->virtioScsiConfig /*pvDevSpecificCap*/, sizeof(pThis->virtioScsiConfig));
    22742263
    22752264    if (RT_FAILURE(rc))
     
    22842273    for (uint16_t qIdx = 0; qIdx < VIRTIOSCSI_QUEUE_CNT; qIdx++)
    22852274    {
    2286         rc = virtioQueueAttach(pThis->hVirtio, qIdx, QUEUENAME(qIdx));
     2275        rc = virtioQueueAttach(&pThis->Virtio, qIdx, QUEUENAME(qIdx));
    22872276        pThis->afQueueAttached[qIdx] = (rc == VINF_SUCCESS);
    22882277
     
    23942383        return PDMDEV_SET_ERROR(pDevIns, rc, N_("Failed to attach the status LUN"));
    23952384
     2385
    23962386    /*
    2397      * Register the debugger info callback.
     2387     * Register saved state.
     2388     */
     2389    rc = PDMDevHlpSSMRegister(pDevIns, VIRTIOSCSI_SAVED_STATE_VERSION, sizeof(*pThis),
     2390                              virtioScsiR3SaveExec, virtioScsiR3LoadExec);
     2391    AssertRCReturn(rc, rc);
     2392
     2393    /*
     2394     * Register the debugger info callback (ignore errors).
    23982395     */
    23992396    char szTmp[128];
Note: See TracChangeset for help on using the changeset viewer.

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