VirtualBox

Changeset 96925 in vbox for trunk/src/VBox/VMM/VMMR0


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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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;
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