VirtualBox

Changeset 87811 in vbox


Ignore:
Timestamp:
Feb 19, 2021 4:56:39 PM (4 years ago)
Author:
vboxsync
Message:

HDA: Use a PDMCRITSECT per stream instead of RTCRITSECT, to also allow access in R0. ticketoem2ref:36

Location:
trunk/src/VBox/Devices/Audio
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/DevHDA.cpp

    r87809 r87811  
    13871387        LogFunc(("[SD%RU8] Reset enter\n", uSD));
    13881388
    1389         hdaR3StreamLock(pStreamR3);
     1389        hdaStreamLock(pStreamShared);
    13901390
    13911391# ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
     
    14001400        hdaR3StreamAsyncIOUnlock(pStreamR3);
    14011401# endif
    1402         hdaR3StreamUnlock(pStreamR3);
     1402        hdaStreamUnlock(pStreamShared);
    14031403    }
    14041404    else
     
    14121412            LogFunc(("[SD%RU8] State changed (fRun=%RTbool)\n", uSD, fRun));
    14131413
    1414             hdaR3StreamLock(pStreamR3);
     1414            hdaStreamLock(pStreamShared);
    14151415
    14161416            int rc2 = VINF_SUCCESS;
     
    15061506# endif
    15071507            /* Make sure to leave the lock before (eventually) starting the timer. */
    1508             hdaR3StreamUnlock(pStreamR3);
     1508            hdaStreamUnlock(pStreamShared);
    15091509        }
    15101510    }
     
    15261526    AssertReturn(uSD < RT_ELEMENTS(pThis->aStreams), VERR_INTERNAL_ERROR_3); /* paranoia^2: Bad g_aHdaRegMap. */
    15271527    PHDASTATER3 const  pThisCC       = PDMDEVINS_2_DATA_CC(pDevIns, PHDASTATER3);
    1528     PHDASTREAMR3 const pStreamR3     = &pThisCC->aStreams[uSD];
    15291528    PHDASTREAM const   pStreamShared = &pThis->aStreams[uSD];
    15301529
     
    15391538    }
    15401539
    1541     hdaR3StreamLock(pStreamR3);
     1540    hdaStreamLock(pStreamShared);
    15421541
    15431542    uint32_t v = HDA_REG_IND(pThis, iReg);
     
    16251624    if (cTransferTicks)
    16261625        PDMDevHlpTimerUnlockClock(pDevIns, pStreamShared->hTimer); /* Caller will unlock pThis->CritSect. */
    1627     hdaR3StreamUnlock(pStreamR3);
     1626    hdaStreamUnlock(pStreamShared);
    16281627    return VINF_SUCCESS;
    16291628#else  /* !IN_RING3 */
     
    27072706                     pSink->pMixSink->pszName, pSink->pStreamShared->u8SD, pSink->pStreamShared->u8Channel));
    27082707
    2709             hdaR3StreamLock(pSink->pStreamR3);
     2708            hdaStreamLock(pSink->pStreamShared);
    27102709
    27112710            /* Only disable the stream if the stream descriptor # has changed. */
     
    27152714            pSink->pStreamR3->pMixSink = NULL;
    27162715
    2717             hdaR3StreamUnlock(pSink->pStreamR3);
     2716            hdaStreamUnlock(pSink->pStreamShared);
    27182717
    27192718            pSink->pStreamShared = NULL;
     
    27302729            PHDASTREAMR3 pStreamR3     = &pThisCC->aStreams[uSD];
    27312730            PHDASTREAM   pStreamShared = &pThis->aStreams[uSD];
    2732             hdaR3StreamLock(pStreamR3);
     2731            hdaStreamLock(pStreamShared);
    27332732
    27342733            pSink->pStreamR3     = pStreamR3;
     
    27382737            pStreamR3->pMixSink      = pSink;
    27392738
    2740             hdaR3StreamUnlock(pStreamR3);
     2739            hdaStreamUnlock(pStreamShared);
    27412740            rc = VINF_SUCCESS;
    27422741        }
  • trunk/src/VBox/Devices/Audio/HDAStream.cpp

    r87809 r87811  
    7575#endif
    7676
    77 # ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
    78     rc = RTCritSectInit(&pStreamR3->CritSect);
     77#ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
     78    AssertPtr(pStreamR3->pHDAStateR3);
     79    AssertPtr(pStreamR3->pHDAStateR3->pDevIns);
     80    rc = PDMDevHlpCritSectInit(pStreamR3->pHDAStateR3->pDevIns, &pStreamShared->CritSect,
     81                               RT_SRC_POS, "hda_sd#%RU8", pStreamShared->u8SD);
    7982    AssertRCReturn(rc, rc);
    80 # endif
     83#endif
    8184
    8285    rc = hdaR3StreamPeriodCreate(&pStreamShared->State.Period);
     
    175178#endif
    176179
    177 # ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
    178     if (RTCritSectIsInitialized(&pStreamR3->CritSect))
    179     {
    180         rc2 = RTCritSectDelete(&pStreamR3->CritSect);
     180#ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
     181    if (PDMCritSectIsInitialized(&pStreamShared->CritSect))
     182    {
     183        rc2 = PDMR3CritSectDelete(&pStreamShared->CritSect);
    181184        AssertRC(rc2);
    182185    }
    183 # endif
     186#endif
    184187
    185188    if (pStreamR3->State.pCircBuf)
     
    10961099
    10971100    uint8_t const uSD = pStreamShared->u8SD;
    1098     hdaR3StreamLock(pStreamR3);
     1101    hdaStreamLock(pStreamShared);
    10991102
    11001103    PHDASTREAMPERIOD pPeriod = &pStreamShared->State.Period;
     
    11211124    if (!fProceed)
    11221125    {
    1123         hdaR3StreamUnlock(pStreamR3);
     1126        hdaStreamUnlock(pStreamShared);
    11241127        return VINF_SUCCESS;
    11251128    }
     
    15811584    LogFlowFuncLeave();
    15821585
    1583     hdaR3StreamUnlock(pStreamR3);
     1586    hdaStreamUnlock(pStreamShared);
    15841587
    15851588    return VINF_SUCCESS;
     
    17881791 *
    17891792 * @returns IPRT status code.
    1790  * @param   pStreamR3           HDA stream to lock (ring-3 bits).
    1791  */
    1792 void hdaR3StreamLock(PHDASTREAMR3 pStreamR3)
    1793 {
    1794     AssertPtrReturnVoid(pStreamR3);
     1793 * @param   pStreamShared       HDA stream to lock (shared bits).
     1794 */
     1795void hdaStreamLock(PHDASTREAM pStreamShared)
     1796{
     1797    AssertPtrReturnVoid(pStreamShared);
    17951798# ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
    1796     int rc2 = RTCritSectEnter(&pStreamR3->CritSect);
     1799    int rc2 = PDMCritSectEnter(&pStreamShared->CritSect, VINF_SUCCESS);
    17971800    AssertRC(rc2);
    1798 # else
    1799     Assert(PDMDevHlpCritSectIsOwner(pStream->pHDAState->pDevInsR3, pStream->pHDAState->CritSect));
    1800 # endif
     1801#endif
    18011802}
    18021803
     
    18051806 *
    18061807 * @returns IPRT status code.
    1807  * @param   pStreamR3           HDA stream to unlock (ring-3 bits).
    1808  */
    1809 void hdaR3StreamUnlock(PHDASTREAMR3 pStreamR3)
    1810 {
    1811     AssertPtrReturnVoid(pStreamR3);
     1808 * @param   pStreamShared       HDA stream to unlock (shared bits).
     1809 */
     1810void hdaStreamUnlock(PHDASTREAM pStreamShared)
     1811{
     1812    AssertPtrReturnVoid(pStreamShared);
    18121813# ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
    1813     int rc2 = RTCritSectLeave(&pStreamR3->CritSect);
     1814    int rc2 = PDMCritSectLeave(&pStreamShared->CritSect);
    18141815    AssertRC(rc2);
    18151816# endif
  • trunk/src/VBox/Devices/Audio/HDAStream.h

    r87758 r87811  
    191191    uint8_t                     u8Channel;
    192192    uint8_t                     abPadding0[6];
     193#ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
     194    /** The stream's shared r0/r3 critical section to serialize access between the async I/O
     195     *  thread and (basically) the guest. */
     196    PDMCRITSECT                 CritSect;
     197#endif
    193198    /** DMA base address (SDnBDPU - SDnBDPL).
    194199     *  Will be updated in hdaR3StreamInit(). */
     
    238243    /** Pointer to HDA sink this stream is attached to. */
    239244    R3PTRTYPE(PHDAMIXERSINK)    pMixSink;
    240 #ifdef VBOX_WITH_AUDIO_HDA_ASYNC_IO
    241     /** The stream's critical section to serialize access between the async I/O
    242      *  thread and (basically) the guest. */
    243     RTCRITSECT                  CritSect;
    244 #endif
    245245    /** Internal state of this stream. */
    246246    struct
     
    281281bool                hdaR3StreamTransferIsScheduled(PHDASTREAM pStreamShared, uint64_t tsNow);
    282282uint64_t            hdaR3StreamTransferGetNext(PHDASTREAM pStreamShared);
    283 void                hdaR3StreamLock(PHDASTREAMR3 pStreamR3);
    284 void                hdaR3StreamUnlock(PHDASTREAMR3 pStreamR3);
     283void                hdaStreamLock(PHDASTREAM pStreamShared);
     284void                hdaStreamUnlock(PHDASTREAM pStreamShared);
    285285void                hdaR3StreamUpdate(PPDMDEVINS pDevIns, PHDASTATE pThis, PHDASTATER3 pThisCC,
    286286                                      PHDASTREAM pStreamShared, PHDASTREAMR3 pStreamR3, bool fInTimer);
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