VirtualBox

Changeset 82378 in vbox


Ignore:
Timestamp:
Dec 4, 2019 12:13:45 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
135212
Message:

IOM: Better I/O port statistics. bugref:9218

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IOMAll.cpp

    r82313 r82378  
    5757VMMDECL(VBOXSTRICTRC) IOMIOPortRead(PVMCC pVM, PVMCPU pVCpu, RTIOPORT Port, uint32_t *pu32Value, size_t cbValue)
    5858{
     59    STAM_COUNTER_INC(&pVM->iom.s.StatIoPortIn);
    5960    Assert(pVCpu->iom.s.PendingIOPortWrite.cbValue == 0);
    6061
     
    115116            PDMCritSectLeave(pDevIns->CTX_SUFF(pCritSectRo));
    116117
    117             if (rcStrict == VINF_SUCCESS)
     118#ifndef IN_RING3
     119            if (rcStrict == VINF_IOM_R3_IOPORT_READ)
     120                STAM_COUNTER_INC(&pStats->InRZToR3);
     121            else
     122#endif
     123            {
    118124                STAM_COUNTER_INC(&pStats->CTX_SUFF_Z(In));
    119 #ifndef IN_RING3
    120             else if (rcStrict == VINF_IOM_R3_IOPORT_READ)
    121                 STAM_COUNTER_INC(&pStats->InRZToR3);
    122 #endif
    123             else if (rcStrict == VERR_IOM_IOPORT_UNUSED)
    124             {
    125                 /* make return value */
    126                 rcStrict = VINF_SUCCESS;
    127                 switch (cbValue)
     125                STAM_COUNTER_INC(&iomIoPortGetStats(pVM, pRegEntry, 0)->Total);
     126                if (rcStrict == VERR_IOM_IOPORT_UNUSED)
    128127                {
    129                     case 1: *(uint8_t  *)pu32Value = 0xff; break;
    130                     case 2: *(uint16_t *)pu32Value = 0xffff; break;
    131                     case 4: *(uint32_t *)pu32Value = UINT32_C(0xffffffff); break;
    132                     default:
    133                         AssertMsgFailedReturn(("Invalid I/O port size %d. Port=%d\n", cbValue, Port), VERR_IOM_INVALID_IOPORT_SIZE);
     128                    /* make return value */
     129                    rcStrict = VINF_SUCCESS;
     130                    switch (cbValue)
     131                    {
     132                        case 1: *(uint8_t  *)pu32Value = 0xff; break;
     133                        case 2: *(uint16_t *)pu32Value = 0xffff; break;
     134                        case 4: *(uint32_t *)pu32Value = UINT32_C(0xffffffff); break;
     135                        default:
     136                            AssertMsgFailedReturn(("Invalid I/O port size %d. Port=%d\n", cbValue, Port), VERR_IOM_INVALID_IOPORT_SIZE);
     137                    }
    134138                }
    135             }
     139           }
    136140            Log3(("IOMIOPortRead: Port=%RTiop *pu32=%08RX32 cb=%d rc=%Rrc\n", Port, *pu32Value, cbValue, VBOXSTRICTRC_VAL(rcStrict)));
     141            STAM_COUNTER_INC(&iomIoPortGetStats(pVM, pRegEntry, 0)->Total);
    137142        }
    138143        else
     
    179184                                               void *pvDst, uint32_t *pcTransfers, unsigned cb)
    180185{
     186    STAM_COUNTER_INC(&pVM->iom.s.StatIoPortInS);
    181187    Assert(pVCpu->iom.s.PendingIOPortWrite.cbValue == 0);
    182188
     
    279285
    280286#ifdef VBOX_WITH_STATISTICS
    281             if (rcStrict == VINF_SUCCESS && pStats)
     287# ifndef IN_RING3
     288            if (rcStrict == VINF_IOM_R3_IOPORT_READ)
     289                STAM_COUNTER_INC(&pStats->InRZToR3);
     290            else
     291# endif
     292            {
    282293                STAM_COUNTER_INC(&pStats->CTX_SUFF_Z(In));
    283 # ifndef IN_RING3
    284             else if (rcStrict == VINF_IOM_R3_IOPORT_READ && pStats)
    285                 STAM_COUNTER_INC(&pStats->InRZToR3);
    286 # endif
     294                STAM_COUNTER_INC(&iomIoPortGetStats(pVM, pRegEntry, 0)->Total);
     295            }
    287296#endif
    288297            Log3(("IOMIOPortReadStr: uPort=%RTiop pvDst=%p pcTransfer=%p:{%#x->%#x} cb=%d rc=%Rrc\n",
     
    349358VMMDECL(VBOXSTRICTRC) IOMIOPortWrite(PVMCC pVM, PVMCPU pVCpu, RTIOPORT Port, uint32_t u32Value, size_t cbValue)
    350359{
     360    STAM_COUNTER_INC(&pVM->iom.s.StatIoPortOut);
    351361#ifndef IN_RING3
    352362    Assert(pVCpu->iom.s.PendingIOPortWrite.cbValue == 0);
     
    408418
    409419#ifdef VBOX_WITH_STATISTICS
    410             if (rcStrict == VINF_SUCCESS)
     420# ifndef IN_RING3
     421            if (rcStrict != VINF_IOM_R3_IOPORT_WRITE)
     422# endif
     423            {
    411424                STAM_COUNTER_INC(&pStats->CTX_SUFF_Z(Out));
     425                STAM_COUNTER_INC(&iomIoPortGetStats(pVM, pRegEntry, 0)->Total);
     426            }
    412427#endif
    413428            Log3(("IOMIOPortWrite: Port=%RTiop u32=%08RX32 cb=%d rc=%Rrc\n", Port, u32Value, cbValue, VBOXSTRICTRC_VAL(rcStrict)));
     
    454469                                                uint32_t *pcTransfers, unsigned cb)
    455470{
     471    STAM_COUNTER_INC(&pVM->iom.s.StatIoPortOutS);
    456472    Assert(pVCpu->iom.s.PendingIOPortWrite.cbValue == 0);
    457473    Assert(cb == 1 || cb == 2 || cb == 4);
     
    549565
    550566#ifdef VBOX_WITH_STATISTICS
    551             if (rcStrict == VINF_SUCCESS)
     567# ifndef IN_RING3
     568            if (rcStrict == VINF_IOM_R3_IOPORT_WRITE)
     569                STAM_COUNTER_INC(&pStats->OutRZToR3);
     570            else
     571# endif
     572            {
    552573                STAM_COUNTER_INC(&pStats->CTX_SUFF_Z(Out));
    553 # ifndef IN_RING3
    554             else if (rcStrict == VINF_IOM_R3_IOPORT_WRITE)
    555                 STAM_COUNTER_INC(&pStats->OutRZToR3);
    556 # endif
     574                STAM_COUNTER_INC(&iomIoPortGetStats(pVM, pRegEntry, 0)->Total);
     575            }
    557576#endif
    558577            Log3(("IOMIOPortWriteStr: uPort=%RTiop pvSrc=%p pcTransfer=%p:{%#x->%#x} cb=%d rcStrict=%Rrc\n",
  • trunk/src/VBox/VMM/VMMR3/IOM.cpp

    r82313 r82378  
    176176     */
    177177    STAM_REG(pVM, &pVM->iom.s.StatIoPortCommits,      STAMTYPE_COUNTER, "/IOM/IoPortCommits",                       STAMUNIT_OCCURENCES,     "Number of ring-3 I/O port commits.");
     178    STAM_REG(pVM, &pVM->iom.s.StatIoPortIn,           STAMTYPE_PROFILE, "/IOM/IoPortIN",                            STAMUNIT_OCCURENCES,     "Number of IN instructions (attempts)");
     179    STAM_REG(pVM, &pVM->iom.s.StatIoPortInS,          STAMTYPE_PROFILE, "/IOM/IoPortINS",                           STAMUNIT_OCCURENCES,     "Number of INS instructions (attempts)");
     180    STAM_REG(pVM, &pVM->iom.s.StatIoPortOutS,         STAMTYPE_PROFILE, "/IOM/IoPortOUT",                           STAMUNIT_OCCURENCES,     "Number of OUT instructions (attempts)");
     181    STAM_REG(pVM, &pVM->iom.s.StatIoPortOutS,         STAMTYPE_PROFILE, "/IOM/IoPortOUTS",                          STAMUNIT_OCCURENCES,     "Number of OUTS instructions (attempts)");
    178182
    179183    STAM_REL_REG(pVM, &pVM->iom.s.StatMMIOStaleMappings, STAMTYPE_PROFILE, "/IOM/MMIOStaleMappings",                STAMUNIT_TICKS_PER_CALL, "Number of times iomMmioHandlerNew got a call for a remapped range at the old mapping.");
  • trunk/src/VBox/VMM/VMMR3/IOMR3IoPort.cpp

    r82311 r82378  
    5858    size_t cchPrefix;
    5959    if (uFirstPort < uEndPort - 1)
    60         cchPrefix = RTStrPrintf(szName, sizeof(szName), "/IOM/NewPorts/%04x-%04x", uFirstPort, uEndPort - 1);
     60        cchPrefix = RTStrPrintf(szName, sizeof(szName), "/IOM/IoPorts/%04x-%04x", uFirstPort, uEndPort - 1);
    6161    else
    62         cchPrefix = RTStrPrintf(szName, sizeof(szName), "/IOM/NewPorts/%04x", uPort);
     62        cchPrefix = RTStrPrintf(szName, sizeof(szName), "/IOM/IoPorts/%04x", uPort);
    6363    const char *pszDesc     = pRegEntry->pszDesc;
    6464    char       *pszFreeDesc = NULL;
    6565    if (pRegEntry->pDevIns && pRegEntry->pDevIns->iInstance > 0 && pszDesc)
    6666        pszDesc = pszFreeDesc = RTStrAPrintf2("%u / %s", pRegEntry->pDevIns->iInstance, pszDesc);
    67     int rc = STAMR3Register(pVM, &pRegEntry->idxSelf, STAMTYPE_U16, STAMVISIBILITY_ALWAYS, szName,
     67    int rc = STAMR3Register(pVM, &pStats->Total, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, szName,
    6868                            STAMUNIT_NONE, pRegEntry->pszDesc);
    6969    AssertRC(rc);
     
    132132    size_t cchPrefix;
    133133    if (pRegEntry->cPorts > 1)
    134         cchPrefix = RTStrPrintf(szPrefix, sizeof(szPrefix), "/IOM/NewPorts/%04x-%04x", uPort, uPort + pRegEntry->cPorts - 1);
     134        cchPrefix = RTStrPrintf(szPrefix, sizeof(szPrefix), "/IOM/IoPorts/%04x-%04x", uPort, uPort + pRegEntry->cPorts - 1);
    135135    else
    136         cchPrefix = RTStrPrintf(szPrefix, sizeof(szPrefix), "/IOM/NewPorts/%04x", uPort);
     136        cchPrefix = RTStrPrintf(szPrefix, sizeof(szPrefix), "/IOM/IoPorts/%04x", uPort);
    137137    STAMR3DeregisterByPrefix(pVM->pUVM, szPrefix);
    138138}
  • trunk/src/VBox/VMM/include/IOMInternal.h

    r82313 r82378  
    148148typedef struct IOMIOPORTSTATSENTRY
    149149{
     150    /** All accesses (only updated for the first port in a range). */
     151    STAMCOUNTER                 Total;
     152
    150153    /** Number of INs to this port from R3. */
    151154    STAMCOUNTER                 InR3;
     
    447450#endif
    448451
    449 #if 0 /* unused */
    450452    /** @name I/O Port statistics.
    451453     * @{ */
    452     STAMCOUNTER                     StatInstIn;
    453     STAMCOUNTER                     StatInstOut;
    454     STAMCOUNTER                     StatInstIns;
    455     STAMCOUNTER                     StatInstOuts;
     454    STAMCOUNTER                     StatIoPortIn;
     455    STAMCOUNTER                     StatIoPortOut;
     456    STAMCOUNTER                     StatIoPortInS;
     457    STAMCOUNTER                     StatIoPortOutS;
    456458    /** @} */
    457 #endif
    458459
    459460    /** @name MMIO statistics.
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