Changeset 24793 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Nov 19, 2009 2:53:59 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 55010
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PGM.cpp
r24768 r24793 1562 1562 1563 1563 /* Common - misc variables */ 1564 STAM_REL_REG(pVM, &pPGM->cAllPages, STAMTYPE_U32, "/PGM/Page/cAllPages", STAMUNIT_COUNT, "The total number of pages.");1565 STAM_REL_REG(pVM, &pPGM->cPrivatePages, STAMTYPE_U32, "/PGM/Page/cPrivatePages", STAMUNIT_COUNT, "The number of private pages.");1566 STAM_REL_REG(pVM, &pPGM->cSharedPages, STAMTYPE_U32, "/PGM/Page/cSharedPages", STAMUNIT_COUNT, "The number of shared pages.");1567 STAM_REL_REG(pVM, &pPGM->cZeroPages, STAMTYPE_U32, "/PGM/Page/cZeroPages", STAMUNIT_COUNT, "The number of zero backed pages.");1568 STAM_REL_REG(pVM, &pPGM->cMonitoredPages, STAMTYPE_U32, "/PGM/Page/cMonitoredPages", STAMUNIT_COUNT, "The number of write monitored pages.");1569 STAM_REL_REG(pVM, &pPGM->cWrittenToPages, STAMTYPE_U32, "/PGM/Page/cWrittenToPages", STAMUNIT_COUNT, "The number of previously write monitored pages that have been written to.");1570 STAM_REL_REG(pVM, &pPGM->cWriteLockedPages, STAMTYPE_U32, "/PGM/Page/cWriteLockedPages", STAMUNIT_COUNT, "The number of write(/read) locked pages.");1571 STAM_REL_REG(pVM, &pPGM->cReadLockedPages, STAMTYPE_U32, "/PGM/Page/cReadLockedPages", STAMUNIT_COUNT, "The number of read (only) locked pages.");1572 STAM_REL_REG(pVM, &pPGM->cHandyPages, STAMTYPE_U32, "/PGM/Page/cHandyPages", STAMUNIT_COUNT, "The number of handy pages (not included in cAllPages).");1573 STAM_REL_REG(pVM, &pPGM->cRelocations, STAMTYPE_COUNTER, "/PGM/cRelocations", STAMUNIT_OCCURENCES,"Number of hypervisor relocations.");1574 STAM_REL_REG(pVM, &pPGM->ChunkR3Map.c, STAMTYPE_U32, "/PGM/ChunkR3Map/c", STAMUNIT_COUNT, "Number of mapped chunks.");1575 STAM_REL_REG(pVM, &pPGM->ChunkR3Map.cMax, STAMTYPE_U32, "/PGM/ChunkR3Map/cMax", STAMUNIT_COUNT, "Maximum number of mapped chunks.");1564 STAM_REL_REG(pVM, &pPGM->cAllPages, STAMTYPE_U32, "/PGM/Page/cAllPages", STAMUNIT_COUNT, "The total number of pages."); 1565 STAM_REL_REG(pVM, &pPGM->cPrivatePages, STAMTYPE_U32, "/PGM/Page/cPrivatePages", STAMUNIT_COUNT, "The number of private pages."); 1566 STAM_REL_REG(pVM, &pPGM->cSharedPages, STAMTYPE_U32, "/PGM/Page/cSharedPages", STAMUNIT_COUNT, "The number of shared pages."); 1567 STAM_REL_REG(pVM, &pPGM->cZeroPages, STAMTYPE_U32, "/PGM/Page/cZeroPages", STAMUNIT_COUNT, "The number of zero backed pages."); 1568 STAM_REL_REG(pVM, &pPGM->cMonitoredPages, STAMTYPE_U32, "/PGM/Page/cMonitoredPages", STAMUNIT_COUNT, "The number of write monitored pages."); 1569 STAM_REL_REG(pVM, &pPGM->cWrittenToPages, STAMTYPE_U32, "/PGM/Page/cWrittenToPages", STAMUNIT_COUNT, "The number of previously write monitored pages that have been written to."); 1570 STAM_REL_REG(pVM, &pPGM->cWriteLockedPages, STAMTYPE_U32, "/PGM/Page/cWriteLockedPages", STAMUNIT_COUNT, "The number of write(/read) locked pages."); 1571 STAM_REL_REG(pVM, &pPGM->cReadLockedPages, STAMTYPE_U32, "/PGM/Page/cReadLockedPages", STAMUNIT_COUNT, "The number of read (only) locked pages."); 1572 STAM_REL_REG(pVM, &pPGM->cHandyPages, STAMTYPE_U32, "/PGM/Page/cHandyPages", STAMUNIT_COUNT, "The number of handy pages (not included in cAllPages)."); 1573 STAM_REL_REG(pVM, &pPGM->cRelocations, STAMTYPE_COUNTER, "/PGM/cRelocations", STAMUNIT_OCCURENCES,"Number of hypervisor relocations."); 1574 STAM_REL_REG(pVM, &pPGM->ChunkR3Map.c, STAMTYPE_U32, "/PGM/ChunkR3Map/c", STAMUNIT_COUNT, "Number of mapped chunks."); 1575 STAM_REL_REG(pVM, &pPGM->ChunkR3Map.cMax, STAMTYPE_U32, "/PGM/ChunkR3Map/cMax", STAMUNIT_COUNT, "Maximum number of mapped chunks."); 1576 1576 1577 1577 /* Live save */ 1578 STAM_REL_REG(pVM, &pPGM->LiveSave.fActive, STAMTYPE_U8, "/PGM/LiveSave/fActive", STAMUNIT_COUNT, "Active or not."); 1579 STAM_REL_REG(pVM, &pPGM->LiveSave.cIgnoredPages, STAMTYPE_U32, "/PGM/LiveSave/cIgnoredPages", STAMUNIT_COUNT, "The number of ignored pages in the RAM ranges (i.e. MMIO, MMIO2 and ROM)."); 1580 STAM_REL_REG(pVM, &pPGM->LiveSave.Ram.cReadyPages, STAMTYPE_U32, "/PGM/LiveSave/Ram/cReadPages", STAMUNIT_COUNT, "RAM: Ready pages."); 1581 STAM_REL_REG(pVM, &pPGM->LiveSave.Ram.cDirtyPages, STAMTYPE_U32, "/PGM/LiveSave/Ram/cDirtyPages", STAMUNIT_COUNT, "RAM: Dirty pages."); 1582 STAM_REL_REG(pVM, &pPGM->LiveSave.Ram.cZeroPages, STAMTYPE_U32, "/PGM/LiveSave/Ram/cZeroPages", STAMUNIT_COUNT, "RAM: Ready zero pages."); 1583 STAM_REL_REG(pVM, &pPGM->LiveSave.Ram.cMonitoredPages, STAMTYPE_U32, "/PGM/LiveSave/Ram/cMonitoredPages", STAMUNIT_COUNT, "RAM: Write monitored pages."); 1584 STAM_REL_REG(pVM, &pPGM->LiveSave.Rom.cReadyPages, STAMTYPE_U32, "/PGM/LiveSave/Rom/cReadPages", STAMUNIT_COUNT, "ROM: Ready pages."); 1585 STAM_REL_REG(pVM, &pPGM->LiveSave.Rom.cDirtyPages, STAMTYPE_U32, "/PGM/LiveSave/Rom/cDirtyPages", STAMUNIT_COUNT, "ROM: Dirty pages."); 1586 STAM_REL_REG(pVM, &pPGM->LiveSave.Rom.cZeroPages, STAMTYPE_U32, "/PGM/LiveSave/Rom/cZeroPages", STAMUNIT_COUNT, "ROM: Ready zero pages."); 1587 STAM_REL_REG(pVM, &pPGM->LiveSave.Rom.cMonitoredPages, STAMTYPE_U32, "/PGM/LiveSave/Rom/cMonitoredPages", STAMUNIT_COUNT, "ROM: Write monitored pages."); 1588 STAM_REL_REG(pVM, &pPGM->LiveSave.Mmio2.cReadyPages, STAMTYPE_U32, "/PGM/LiveSave/Mmio2/cReadPages", STAMUNIT_COUNT, "MMIO2: Ready pages."); 1589 STAM_REL_REG(pVM, &pPGM->LiveSave.Mmio2.cDirtyPages, STAMTYPE_U32, "/PGM/LiveSave/Mmio2/cDirtyPages", STAMUNIT_COUNT, "MMIO2: Dirty pages."); 1590 STAM_REL_REG(pVM, &pPGM->LiveSave.Mmio2.cZeroPages, STAMTYPE_U32, "/PGM/LiveSave/Mmio2/cZeroPages", STAMUNIT_COUNT, "MMIO2: Ready zero pages."); 1591 STAM_REL_REG(pVM, &pPGM->LiveSave.Mmio2.cMonitoredPages,STAMTYPE_U32, "/PGM/LiveSave/Mmio2/cMonitoredPages",STAMUNIT_COUNT, "MMIO2: Write monitored pages."); 1578 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.fActive, STAMTYPE_U8, "/PGM/LiveSave/fActive", STAMUNIT_COUNT, "Active or not."); 1579 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.cIgnoredPages, STAMTYPE_U32, "/PGM/LiveSave/cIgnoredPages", STAMUNIT_COUNT, "The number of ignored pages in the RAM ranges (i.e. MMIO, MMIO2 and ROM)."); 1580 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.cDirtyPagesLong, STAMTYPE_U32, "/PGM/LiveSave/cDirtyPagesLong", STAMUNIT_COUNT, "Longer term dirty page average."); 1581 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.cDirtyPagesShort, STAMTYPE_U32, "/PGM/LiveSave/cDirtyPagesShort", STAMUNIT_COUNT, "Short term dirty page average."); 1582 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Ram.cReadyPages, STAMTYPE_U32, "/PGM/LiveSave/Ram/cReadPages", STAMUNIT_COUNT, "RAM: Ready pages."); 1583 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Ram.cDirtyPages, STAMTYPE_U32, "/PGM/LiveSave/Ram/cDirtyPages", STAMUNIT_COUNT, "RAM: Dirty pages."); 1584 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Ram.cZeroPages, STAMTYPE_U32, "/PGM/LiveSave/Ram/cZeroPages", STAMUNIT_COUNT, "RAM: Ready zero pages."); 1585 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Ram.cMonitoredPages, STAMTYPE_U32, "/PGM/LiveSave/Ram/cMonitoredPages", STAMUNIT_COUNT, "RAM: Write monitored pages."); 1586 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Rom.cReadyPages, STAMTYPE_U32, "/PGM/LiveSave/Rom/cReadPages", STAMUNIT_COUNT, "ROM: Ready pages."); 1587 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Rom.cDirtyPages, STAMTYPE_U32, "/PGM/LiveSave/Rom/cDirtyPages", STAMUNIT_COUNT, "ROM: Dirty pages."); 1588 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Rom.cZeroPages, STAMTYPE_U32, "/PGM/LiveSave/Rom/cZeroPages", STAMUNIT_COUNT, "ROM: Ready zero pages."); 1589 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Rom.cMonitoredPages, STAMTYPE_U32, "/PGM/LiveSave/Rom/cMonitoredPages", STAMUNIT_COUNT, "ROM: Write monitored pages."); 1590 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Mmio2.cReadyPages, STAMTYPE_U32, "/PGM/LiveSave/Mmio2/cReadPages", STAMUNIT_COUNT, "MMIO2: Ready pages."); 1591 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Mmio2.cDirtyPages, STAMTYPE_U32, "/PGM/LiveSave/Mmio2/cDirtyPages", STAMUNIT_COUNT, "MMIO2: Dirty pages."); 1592 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Mmio2.cZeroPages, STAMTYPE_U32, "/PGM/LiveSave/Mmio2/cZeroPages", STAMUNIT_COUNT, "MMIO2: Ready zero pages."); 1593 STAM_REL_REG_USED(pVM, &pPGM->LiveSave.Mmio2.cMonitoredPages,STAMTYPE_U32, "/PGM/LiveSave/Mmio2/cMonitoredPages",STAMUNIT_COUNT, "MMIO2: Write monitored pages."); 1592 1594 1593 1595 #ifdef VBOX_WITH_STATISTICS -
trunk/src/VBox/VMM/PGMInternal.h
r24767 r24793 162 162 /** @def VBOX_WITH_NEW_LAZY_PAGE_ALLOC 163 163 * Enables the experimental lazy page allocation code. */ 164 /*# define VBOX_WITH_NEW_LAZY_PAGE_ALLOC */ 164 /*#define VBOX_WITH_NEW_LAZY_PAGE_ALLOC */ 165 166 /** @def VBOX_WITH_REAL_WRITE_MONITORED_PAGES 167 * Enables real write monitoring of pages, i.e. mapping them read-only and 168 * only making them writable when getting a write access #PF. */ 169 /*#define VBOX_WITH_REAL_WRITE_MONITORED_PAGES */ 165 170 166 171 /** @} */ … … 2741 2746 bool fActive; 2742 2747 /** Padding. */ 2743 bool afReserved[3]; 2748 bool afReserved[2]; 2749 /** The next history index. */ 2750 uint8_t iDirtyPagesHistory; 2751 /** History of the total amount of dirty pages. */ 2752 uint32_t acDirtyPagesHistory[64]; 2753 /** Short term dirty page average. */ 2754 uint32_t cDirtyPagesShort; 2755 /** Long term dirty page average. */ 2756 uint32_t cDirtyPagesLong; 2744 2757 } LiveSave; 2745 2758 -
trunk/src/VBox/VMM/PGMSavedState.cpp
r24769 r24793 1759 1759 * @param pVM The VM handle. 1760 1760 * @param pSSM The SSM handle. 1761 */ 1762 static DECLCALLBACK(int) pgmR3LiveVote(PVM pVM, PSSMHANDLE pSSM) 1763 { 1764 #if 0 1765 RTPrintf("# Rom[R/D/Z/M]=%03x/%03x/%03x/%03x Mmio2=%04x/%04x/%04x/%04x Ram=%06x/%06x/%06x/%06x Ignored=%03x\n", 1766 pVM->pgm.s.LiveSave.Rom.cReadyPages, 1767 pVM->pgm.s.LiveSave.Rom.cDirtyPages, 1768 pVM->pgm.s.LiveSave.Rom.cZeroPages, 1769 pVM->pgm.s.LiveSave.Rom.cMonitoredPages, 1770 pVM->pgm.s.LiveSave.Mmio2.cReadyPages, 1771 pVM->pgm.s.LiveSave.Mmio2.cDirtyPages, 1772 pVM->pgm.s.LiveSave.Mmio2.cZeroPages, 1773 pVM->pgm.s.LiveSave.Mmio2.cMonitoredPages, 1774 pVM->pgm.s.LiveSave.Ram.cReadyPages, 1775 pVM->pgm.s.LiveSave.Ram.cDirtyPages, 1776 pVM->pgm.s.LiveSave.Ram.cZeroPages, 1777 pVM->pgm.s.LiveSave.Ram.cMonitoredPages, 1778 pVM->pgm.s.LiveSave.cIgnoredPages 1779 ); 1780 static int s_iHack = 0; 1781 if ((++s_iHack % 42) == 0) 1782 return VINF_SUCCESS; 1783 RTThreadSleep(1000); 1784 1785 #else 1786 if ( pVM->pgm.s.LiveSave.Rom.cDirtyPages 1787 + pVM->pgm.s.LiveSave.Mmio2.cDirtyPages 1788 + pVM->pgm.s.LiveSave.Ram.cDirtyPages 1789 # if 0 1790 < 256) /* semi random number. */ 1791 # else 1792 < 4096) /* too high number */ 1793 # endif 1794 return VINF_SUCCESS; 1795 #endif 1761 * @param uPass The data pass. 1762 */ 1763 static DECLCALLBACK(int) pgmR3LiveVote(PVM pVM, PSSMHANDLE pSSM, uint32_t uPass) 1764 { 1765 const uint32_t cHistoryEntries = RT_ELEMENTS(pVM->pgm.s.LiveSave.acDirtyPagesHistory); 1766 1767 /* update history. */ 1768 uint32_t i = pVM->pgm.s.LiveSave.iDirtyPagesHistory; 1769 pVM->pgm.s.LiveSave.acDirtyPagesHistory[i] = pVM->pgm.s.LiveSave.Rom.cDirtyPages 1770 + pVM->pgm.s.LiveSave.Mmio2.cDirtyPages 1771 + pVM->pgm.s.LiveSave.Ram.cDirtyPages; 1772 pVM->pgm.s.LiveSave.iDirtyPagesHistory = (i + 1) % cHistoryEntries; 1773 1774 /* calc shortterm average (4 passes). */ 1775 AssertCompile(RT_ELEMENTS(pVM->pgm.s.LiveSave.acDirtyPagesHistory) >= 4); 1776 uint64_t cTotal = pVM->pgm.s.LiveSave.acDirtyPagesHistory[i]; 1777 cTotal += pVM->pgm.s.LiveSave.acDirtyPagesHistory[(i + cHistoryEntries - 1) % cHistoryEntries]; 1778 cTotal += pVM->pgm.s.LiveSave.acDirtyPagesHistory[(i + cHistoryEntries - 2) % cHistoryEntries]; 1779 cTotal += pVM->pgm.s.LiveSave.acDirtyPagesHistory[(i + cHistoryEntries - 3) % cHistoryEntries]; 1780 uint32_t const cDirtyPagesShort = cTotal / 4; 1781 pVM->pgm.s.LiveSave.cDirtyPagesShort = cDirtyPagesShort; 1782 1783 /* calc longterm average. */ 1784 cTotal = 0; 1785 for (i = 0; i < RT_ELEMENTS(pVM->pgm.s.LiveSave.acDirtyPagesHistory); i++) 1786 cTotal += pVM->pgm.s.LiveSave.acDirtyPagesHistory[i]; 1787 uint32_t const cDirtyPagesLong = cTotal / cHistoryEntries; 1788 pVM->pgm.s.LiveSave.cDirtyPagesLong = cDirtyPagesLong; 1789 1790 /* 1791 * Try make a decision. 1792 */ 1793 /** @todo take the count dirtied write-monitored page into account here. */ 1794 if (cDirtyPagesShort <= cDirtyPagesLong) 1795 { 1796 if ( cDirtyPagesShort <= 128 1797 && cDirtyPagesLong <= 1024) 1798 return VINF_SUCCESS; 1799 1800 if (cDirtyPagesLong <= 256) 1801 return VINF_SUCCESS; 1802 1803 /* !! hack !! */ 1804 if ( cDirtyPagesLong < 4096 1805 && uPass >= 8192) 1806 return VINF_SUCCESS; 1807 } 1796 1808 return VINF_SSM_VOTE_FOR_ANOTHER_PASS; 1797 1809 } … … 1836 1848 pVM->pgm.s.LiveSave.cIgnoredPages = 0; 1837 1849 pVM->pgm.s.LiveSave.fActive = true; 1850 for (unsigned i = 0; i < RT_ELEMENTS(pVM->pgm.s.LiveSave.acDirtyPagesHistory); i++) 1851 pVM->pgm.s.LiveSave.acDirtyPagesHistory[i] = UINT32_MAX / 2; 1852 pVM->pgm.s.LiveSave.iDirtyPagesHistory = 0; 1838 1853 1839 1854 /* -
trunk/src/VBox/VMM/SSM.cpp
r24613 r24793 4711 4711 { 4712 4712 case SSMUNITTYPE_DEV: 4713 rc = pUnit->u.Dev.pfnLiveVote(pUnit->u.Dev.pDevIns, pSSM );4713 rc = pUnit->u.Dev.pfnLiveVote(pUnit->u.Dev.pDevIns, pSSM, uPass); 4714 4714 break; 4715 4715 case SSMUNITTYPE_DRV: 4716 rc = pUnit->u.Drv.pfnLiveVote(pUnit->u.Drv.pDrvIns, pSSM );4716 rc = pUnit->u.Drv.pfnLiveVote(pUnit->u.Drv.pDrvIns, pSSM, uPass); 4717 4717 break; 4718 4718 case SSMUNITTYPE_INTERNAL: 4719 rc = pUnit->u.Internal.pfnLiveVote(pVM, pSSM );4719 rc = pUnit->u.Internal.pfnLiveVote(pVM, pSSM, uPass); 4720 4720 break; 4721 4721 case SSMUNITTYPE_EXTERNAL: 4722 rc = pUnit->u.External.pfnLiveVote(pSSM, pUnit->u.External.pvUser );4722 rc = pUnit->u.External.pfnLiveVote(pSSM, pUnit->u.External.pvUser, uPass); 4723 4723 break; 4724 4724 default: -
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r24699 r24793 1504 1504 if ( PteSrc.n.u1Write 1505 1505 && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED 1506 # ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES 1507 && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED 1508 # endif 1506 1509 && PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_RAM) 1507 1510 { … … 1894 1897 if ( PdeSrc.n.u1Write 1895 1898 && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED 1899 # ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES 1900 && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED 1901 # endif 1896 1902 && PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_RAM) 1897 1903 { … … 2876 2882 if ( PteDstBase.n.u1Write 2877 2883 && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED 2884 # ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES 2885 && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_WRITE_MONITORED 2886 # endif 2878 2887 && PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_RAM) 2879 2888 {
Note:
See TracChangeset
for help on using the changeset viewer.