VirtualBox

Changeset 89748 in vbox


Ignore:
Timestamp:
Jun 16, 2021 4:06:33 PM (3 years ago)
Author:
vboxsync
Message:

DevIchAc97: Don't take the timer lock when fielding IO port writes, not even when enabling the stream (will be taken by TM when arming the timer, but after we drop the device lock). bugref:9890

File:
1 edited

Legend:

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

    r89743 r89748  
    643643    } while (0)
    644644
    645 /** Retrieves an attribute from a specific audio stream in RC. */
    646 #define DEVAC97_CTX_SUFF_SD(a_Var, a_SD)      CTX_SUFF(a_Var)[a_SD]
    647 
    648645/**
    649646 * Releases the AC'97 lock.
     
    652649    do { PDMDevHlpCritSectLeave((a_pDevIns), &(a_pThis)->CritSect); } while (0)
    653650
    654 /**
    655  * Acquires the TM lock and AC'97 lock, returns on failure.
    656  *
    657  * @todo r=bird: Isn't this overkill for ring-0, only ring-3 access the timer
    658  *               from what I can tell (ichac97R3StreamTransferCalcNext,
    659  *               ichac97R3TimerSet, timer callback and state load).
    660  */
    661 #define DEVAC97_LOCK_BOTH_RETURN(a_pDevIns, a_pThis, a_pStream, a_rcBusy) \
    662     do { \
    663         VBOXSTRICTRC rcLock = PDMDevHlpTimerLockClock2((a_pDevIns), (a_pStream)->hTimer, &(a_pThis)->CritSect, (a_rcBusy)); \
    664         if (RT_LIKELY(rcLock == VINF_SUCCESS)) \
    665         { /* likely */ } \
    666         else \
    667         { \
    668             AssertRC(VBOXSTRICTRC_VAL(rcLock)); \
    669             return rcLock; \
    670         } \
    671     } while (0)
    672 
    673 /**
    674  * Releases the AC'97 lock and TM lock.
    675  */
    676 #define DEVAC97_UNLOCK_BOTH(a_pDevIns, a_pThis, a_pStream) \
    677     PDMDevHlpTimerUnlockClock2((a_pDevIns), (a_pStream)->hTimer, &(a_pThis)->CritSect)
    678651
    679652#ifndef VBOX_DEVICE_STRUCT_TESTCASE
     
    19951968 * @param   fForce      Whether to force re-opening the stream or not.
    19961969 *                      Otherwise re-opening only will happen if the PCM properties have changed.
     1970 *
     1971 * @remarks This is called holding:
     1972 *              -# The AC'97 device lock.
     1973 *              -# The AC'97 stream lock.
     1974 *              -# The mixer sink lock (to prevent racing AIO thread).
    19971975 */
    19981976static int ichac97R3StreamSetUp(PPDMDEVINS pDevIns, PAC97STATE pThis, PAC97STATER3 pThisCC, PAC97STREAM pStream,
     
    26682646        PAC97BMREGS     pRegs     = &pStream->Regs;
    26692647
    2670         /** @todo r=bird: this locking is overkill, we don't need the timer lock
    2671          *        unless we're going to call ichac97R3TimerSet. */
    2672         DEVAC97_LOCK_BOTH_RETURN(pDevIns, pThis, pStream, VINF_IOM_R3_IOPORT_WRITE);
    26732648        switch (cb)
    26742649        {
     
    26802655                     */
    26812656                    case AC97_NABM_OFF_LVI:
     2657                        DEVAC97_LOCK_RETURN(pDevIns, pThis, VINF_IOM_R3_IOPORT_WRITE);
    26822658                        if (   (pRegs->cr & AC97_CR_RPBM)
    26832659                            && (pRegs->sr & AC97_SR_DCH))
     
    26922668                        }
    26932669                        pRegs->lvi = u32 % AC97_MAX_BDLE;
     2670                        DEVAC97_UNLOCK(pDevIns, pThis);
    26942671                        Log3Func(("[SD%RU8] LVI <- %#x\n", pStream->u8SD, u32));
    26952672                        break;
     
    27002677                    case AC97_NABM_OFF_CR:
    27012678#ifdef IN_RING3
     2679                        DEVAC97_LOCK(pDevIns, pThis);
     2680
    27022681                        Log3Func(("[SD%RU8] CR <- %#x (cr %#x)\n", pStream->u8SD, u32, pRegs->cr));
    27032682                        if (u32 & AC97_CR_RR) /* Busmaster reset. */
     
    27132692
    27142693                            ichac97StreamUpdateSR(pDevIns, pThis, pStream, AC97_SR_DCH); /** @todo Do we need to do that? */
     2694
     2695                            DEVAC97_UNLOCK(pDevIns, pThis);
    27152696                        }
    27162697                        else
     
    27252706
    27262707                                pRegs->sr |= AC97_SR_DCH;
     2708
     2709                                DEVAC97_UNLOCK(pDevIns, pThis);
    27272710                            }
    27282711                            else
    27292712                            {
     2713                                /** @todo r=bird: How do we prevent the guest from triggering enable more
     2714                                 *        than once? */
    27302715                                Log3Func(("[SD%RU8] Enable\n", pStream->u8SD));
    27312716
     
    27402725                                ichac97R3StreamEnable(pDevIns, pThis, pThisCC, pStream, pStreamCC, true /* fEnable */);
    27412726
    2742                                 /* Arm the timer for this stream. */
    2743                                 ichac97R3TimerSet(pDevIns, pStream, pStreamCC->State.cTransferTicks);
     2727                                /*
     2728                                 * Arm the DMA timer.  Must drop the AC'97 device lock first as it would
     2729                                 * create a lock order violation with the virtual sync time lock otherwise.
     2730                                 */
     2731                                uint64_t const cTicksToDeadline = pStreamCC->State.cTransferTicks;
     2732
     2733                                DEVAC97_UNLOCK(pDevIns, pThis);
     2734
     2735                                /** @todo take down the start time here.  */
     2736                                int rc2 = PDMDevHlpTimerSetRelative(pDevIns, pStream->hTimer, cTicksToDeadline, NULL /*pu64Now*/);
     2737                                AssertRC(rc2);
    27442738                            }
    27452739                        }
     
    27532747                     */
    27542748                    case AC97_NABM_OFF_SR:
     2749                        DEVAC97_LOCK_RETURN(pDevIns, pThis, VINF_IOM_R3_IOPORT_WRITE);
    27552750                        ichac97StreamWriteSR(pDevIns, pThis, pStream, u32);
     2751                        DEVAC97_UNLOCK(pDevIns, pThis);
    27562752                        break;
    27572753
     
    27672763                {
    27682764                    case AC97_NABM_OFF_SR:
     2765                        DEVAC97_LOCK_RETURN(pDevIns, pThis, VINF_IOM_R3_IOPORT_WRITE);
    27692766                        ichac97StreamWriteSR(pDevIns, pThis, pStream, u32);
     2767                        DEVAC97_UNLOCK(pDevIns, pThis);
    27702768                        break;
    27712769                    default:
     
    27802778                {
    27812779                    case AC97_NABM_OFF_BDBAR:
     2780                        DEVAC97_LOCK_RETURN(pDevIns, pThis, VINF_IOM_R3_IOPORT_WRITE);
    27822781                        /* Buffer Descriptor list Base Address Register */
    27832782                        pRegs->bdbar = u32 & ~(uint32_t)3;
    27842783                        Log3Func(("[SD%RU8] BDBAR <- %#x (bdbar %#x)\n", AC97_PORT2IDX(offPort), u32, pRegs->bdbar));
     2784                        DEVAC97_UNLOCK(pDevIns, pThis);
    27852785                        break;
    27862786                    default:
     
    27952795                break;
    27962796        }
    2797         DEVAC97_UNLOCK_BOTH(pDevIns, pThis, pStream);
    27982797    }
    27992798    else
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