VirtualBox

Changeset 96925 in vbox for trunk


Ignore:
Timestamp:
Sep 28, 2022 8:39:43 PM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
153836
Message:

VMM,RuntimeR0: Flush the log buffer directly to the parent VMM if that's the only destination, and honor the unbuffered setting when that's the case. Setting VBOX_LOG_DEST='nofile vmm' & excluding 'buffered' from VBOX_LOG_FLAGS for the inner VBox instance will result in the logging to be intermixed w/o any buffering delays and no need to try correlate events between outer and inner vbox instances. bugref:10092

Location:
trunk
Files:
5 edited

Legend:

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

    r96407 r96925  
    454454 * Request package for VMMR0_DO_VMMR0_UPDATE_LOGGERS.
    455455 *
    456  * In addition the u64Arg selects the logger sets: @c false for debug, @c true
    457  * for release.
     456 * In addition the u64Arg is selects the logger and indicates whether we're only
     457 * outputting to the parent VMM. See VMMR0UPDATELOGGER_F_XXX.
    458458 */
    459459typedef struct VMMR0UPDATELOGGERSREQ
     
    473473/** Pointer to a VMMR0_DO_VMMR0_UPDATE_LOGGERS request. */
    474474typedef VMMR0UPDATELOGGERSREQ *PVMMR0UPDATELOGGERSREQ;
     475
     476/** @name VMMR0UPDATELOGGER_F_XXX - u64Arg definitions for VMMR0_DO_VMMR0_UPDATE_LOGGERS.
     477 * @{ */
     478/** Logger index mask. */
     479#define VMMR0UPDATELOGGER_F_LOGGER_MASK         UINT64_C(0x0001)
     480/** Only flush to the parent VMM's debug log, don't return to ring-3. */
     481#define VMMR0UPDATELOGGER_F_TO_PARENT_VMM_DBG   UINT64_C(0x0002)
     482/** Only flush to the parent VMM's debug log, don't return to ring-3. */
     483#define VMMR0UPDATELOGGER_F_TO_PARENT_VMM_REL   UINT64_C(0x0004)
     484/** Valid flag mask. */
     485#define VMMR0UPDATELOGGER_F_VALID_MASK          UINT64_C(0x0007)
     486/** @} */
    475487
    476488#if defined(IN_RING0) || defined(DOXYGEN_RUNNING)
  • trunk/src/VBox/Runtime/Makefile.kmk

    r96892 r96925  
    34053405        common/asm/ASMRdMsrEx.asm \
    34063406        common/asm/ASMWrMsrEx.asm \
    3407         common/string/RTStrEnd.asm
     3407        common/string/RTStrEnd.asm \
     3408        VBox/RTLogWriteVmm-amd64-x86.asm
    34083409RuntimeR0_SOURCES.amd64 += \
    34093410        common/asm/ASMCpuIdExSlow.asm \
     
    34253426        common/asm/ASMWrMsrEx.asm \
    34263427        common/math/RTUInt128MulByU64Ex.asm \
    3427         common/string/RTStrEnd.asm
     3428        common/string/RTStrEnd.asm \
     3429        VBox/RTLogWriteVmm-amd64-x86.asm
    34283430RuntimeR0_SOURCES.arm32 += \
    34293431        common/string/RTStrEnd.cpp
  • trunk/src/VBox/VMM/VMMR0/VMMR0.cpp

    r96407 r96925  
    100100#endif
    101101RT_C_DECLS_END
    102 static int  vmmR0UpdateLoggers(PGVM pGVM, VMCPUID idCpu, PVMMR0UPDATELOGGERSREQ pReq, size_t idxLogger);
     102static int  vmmR0UpdateLoggers(PGVM pGVM, VMCPUID idCpu, PVMMR0UPDATELOGGERSREQ pReq, uint64_t fFlags);
    103103static int  vmmR0LogFlusher(PGVM pGVM);
    104104static int  vmmR0LogWaitFlushed(PGVM pGVM, VMCPUID idCpu, size_t idxLogger);
     
    18371837            if (idCpu == NIL_VMCPUID)
    18381838                return VERR_INVALID_CPU_ID;
    1839             if (u64Arg < VMMLOGGER_IDX_MAX && pReqHdr != NULL)
    1840                 rc = vmmR0UpdateLoggers(pGVM, idCpu /*idCpu*/, (PVMMR0UPDATELOGGERSREQ)pReqHdr, (size_t)u64Arg);
     1839            if (!(u64Arg & ~VMMR0UPDATELOGGER_F_VALID_MASK) && pReqHdr != NULL)
     1840                rc = vmmR0UpdateLoggers(pGVM, idCpu /*idCpu*/, (PVMMR0UPDATELOGGERSREQ)pReqHdr, u64Arg);
    18411841            else
    18421842                return VERR_INVALID_PARAMETER;
     
    27382738 * @param   idCpu           The ID of the calling EMT.
    27392739 * @param   pReq            The request data.
    2740  * @param   idxLogger       Which logger set to update.
     2740 * @param   fFlags          Flags, see VMMR0UPDATELOGGER_F_XXX.
    27412741 * @thread  EMT(idCpu)
    27422742 */
    2743 static int vmmR0UpdateLoggers(PGVM pGVM, VMCPUID idCpu, PVMMR0UPDATELOGGERSREQ pReq, size_t idxLogger)
     2743static int vmmR0UpdateLoggers(PGVM pGVM, VMCPUID idCpu, PVMMR0UPDATELOGGERSREQ pReq, uint64_t fFlags)
    27442744{
    27452745    /*
     
    27532753    AssertReturn(pReq->Hdr.cbReq == RT_UOFFSETOF_DYN(VMMR0UPDATELOGGERSREQ, afGroups[pReq->cGroups]), VERR_INVALID_PARAMETER);
    27542754
     2755    size_t const idxLogger = (size_t)(fFlags & VMMR0UPDATELOGGER_F_LOGGER_MASK);
    27552756    AssertReturn(idxLogger < VMMLOGGER_IDX_MAX, VERR_OUT_OF_RANGE);
    27562757
     
    27582759     * Adjust flags.
    27592760     */
    2760     /* Always buffered: */
    2761     pReq->fFlags |= RTLOGFLAGS_BUFFERED;
     2761    /* Always buffered, unless logging directly to parent VMM: */
     2762    if (!(fFlags & (VMMR0UPDATELOGGER_F_TO_PARENT_VMM_DBG | VMMR0UPDATELOGGER_F_TO_PARENT_VMM_REL)))
     2763        pReq->fFlags |= RTLOGFLAGS_BUFFERED;
    27622764    /* These doesn't make sense at present: */
    27632765    pReq->fFlags &= ~(RTLOGFLAGS_FLUSH | RTLOGFLAGS_WRITE_THROUGH);
     
    27752777        if (pLogger)
    27762778        {
     2779            pGVCpu->vmmr0.s.u.aLoggers[idxLogger].fFlushToParentVmmDbg = RT_BOOL(fFlags & VMMR0UPDATELOGGER_F_TO_PARENT_VMM_DBG);
     2780            pGVCpu->vmmr0.s.u.aLoggers[idxLogger].fFlushToParentVmmRel = RT_BOOL(fFlags & VMMR0UPDATELOGGER_F_TO_PARENT_VMM_REL);
     2781
    27772782            RTLogSetR0ProgramStart(pLogger, pGVM->vmm.s.nsProgramStart);
    27782783            rc = RTLogBulkUpdate(pLogger, pReq->fFlags, pReq->uGroupCrc32, pReq->cGroups, pReq->afGroups);
     
    29983003
    29993004/**
    3000  * Inner worker for vmmR0LoggerFlushCommon.
    3001  */
    3002 static bool   vmmR0LoggerFlushInner(PGVM pGVM, PGVMCPU pGVCpu, uint32_t idxLogger, size_t idxBuffer, uint32_t cbToFlush)
     3005 * Inner worker for vmmR0LoggerFlushCommon for flushing to ring-3.
     3006 */
     3007static bool   vmmR0LoggerFlushInnerToRing3(PGVM pGVM, PGVMCPU pGVCpu, uint32_t idxLogger, size_t idxBuffer, uint32_t cbToFlush)
    30033008{
    30043009    PVMMR0PERVCPULOGGER const pR0Log    = &pGVCpu->vmmr0.s.u.aLoggers[idxLogger];
     
    30483053    if (enmAction != kJustSignal)
    30493054    {
    3050         int rc = VMMR0EmtPrepareToBlock(pGVCpu, VINF_SUCCESS, "vmmR0LoggerFlushInner", pR0Log->hEventFlushWait, &Ctx);
     3055        int rc = VMMR0EmtPrepareToBlock(pGVCpu, VINF_SUCCESS, "vmmR0LoggerFlushInnerToRing3", pR0Log->hEventFlushWait, &Ctx);
    30513056        if (RT_SUCCESS(rc))
    30523057        { /* likely */ }
     
    31543159    return fFlushedBuffer;
    31553160}
     3161
     3162
     3163/**
     3164 * Inner worker for vmmR0LoggerFlushCommon when only flushing to the parent
     3165 * VMM's logs.
     3166 */
     3167static bool vmmR0LoggerFlushInnerToParent(PGVM pGVM, PGVMCPU pGVCpu, PVMMR0PERVCPULOGGER pR0Log, PRTLOGBUFFERDESC pBufDesc)
     3168{
     3169    uint32_t const cbToFlush = pBufDesc->offBuf;
     3170    if (pR0Log->fFlushToParentVmmDbg)
     3171        RTLogWriteVmm(pBufDesc->pchBuf, cbToFlush, false /*fRelease*/);
     3172    if (pR0Log->fFlushToParentVmmRel)
     3173        RTLogWriteVmm(pBufDesc->pchBuf, cbToFlush, true /*fRelease*/);
     3174    return true;
     3175}
     3176
    31563177
    31573178
     
    31923213                        {
    31933214                            pR0Log->fFlushing = true;
    3194                             bool fFlushed = vmmR0LoggerFlushInner(pGVM, pGVCpu, idxLogger, idxBuffer, pBufDesc->offBuf);
     3215                            bool fFlushed;
     3216                            if (   !pR0Log->fFlushToParentVmmDbg
     3217                                && !pR0Log->fFlushToParentVmmRel)
     3218                                fFlushed = vmmR0LoggerFlushInnerToRing3(pGVM, pGVCpu, idxLogger, idxBuffer, pBufDesc->offBuf);
     3219                            else
     3220                                fFlushed = vmmR0LoggerFlushInnerToParent(pGVM, pGVCpu, pR0Log, pBufDesc);
    31953221                            pR0Log->fFlushing = false;
    31963222                            return fFlushed;
  • trunk/src/VBox/VMM/VMMR3/VMM.cpp

    r96407 r96925  
    731731        AssertRC(rc);
    732732        if (RT_SUCCESS(rc))
    733             rc = VMMR3CallR0Emt(pVM, pVCpu, VMMR0_DO_VMMR0_UPDATE_LOGGERS, fReleaseLogger, &pReq->Hdr);
     733        {
     734            /*
     735             * The 64-bit value argument.
     736             */
     737            uint64_t fExtraArg = fReleaseLogger;
     738
     739            /* Only outputting to the parent VMM's logs? Enable ring-0 to flush directly. */
     740            uint32_t fDst = RTLogGetDestinations(pSrcLogger);
     741            fDst &= ~(RTLOGDEST_DUMMY | RTLOGDEST_F_NO_DENY | RTLOGDEST_F_DELAY_FILE | RTLOGDEST_FIXED_FILE | RTLOGDEST_FIXED_DIR);
     742            if (   (fDst & (RTLOGDEST_VMM | RTLOGDEST_VMM_REL))
     743                && !(fDst & ~(RTLOGDEST_VMM | RTLOGDEST_VMM_REL)))
     744                fExtraArg |= (fDst & RTLOGDEST_VMM     ? VMMR0UPDATELOGGER_F_TO_PARENT_VMM_DBG : 0)
     745                          |  (fDst & RTLOGDEST_VMM_REL ? VMMR0UPDATELOGGER_F_TO_PARENT_VMM_REL : 0);
     746
     747            rc = VMMR3CallR0Emt(pVM, pVCpu, VMMR0_DO_VMMR0_UPDATE_LOGGERS, fExtraArg, &pReq->Hdr);
     748        }
    734749
    735750        RTMemFree(pReq);
  • trunk/src/VBox/VMM/include/VMMInternal.h

    r96407 r96925  
    9999    /** Set while we're inside vmmR0LoggerFlushCommon to prevent recursion. */
    100100    bool                    fFlushing;
    101     bool                    afPadding[1];
     101    /** Flush to parent VMM's debug log instead of ring-3. */
     102    bool                    fFlushToParentVmmDbg : 1;
     103    /** Flush to parent VMM's debug log instead of ring-3. */
     104    bool                    fFlushToParentVmmRel : 1;
    102105    /** Number of buffers currently queued for flushing. */
    103106    uint32_t volatile       cFlushing;
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