VirtualBox

Changeset 81528 in vbox for trunk/src/VBox/Devices/USB


Ignore:
Timestamp:
Oct 25, 2019 10:00:16 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134261
Message:

DevOHCI: Don't allocate the page two page caches, just put them directly into the ring-3 state structure. (It is no longer on the hyper heap, so we've got plenty space.) bugref:9218

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/USB/DevOHCI.cpp

    r81527 r81528  
    248248    RTGCPHYS            GCPhysReadCacheAddr;
    249249    /** Copy of last read physical page. */
    250     uint8_t             au8PhysReadCache[PAGE_SIZE];
    251 } OHCIPAGECACHE, *POHCIPAGECACHE;
     250    uint8_t             abPhysReadCache[PAGE_SIZE];
     251} OHCIPAGECACHE;
     252typedef OHCIPAGECACHE *POHCIPAGECACHE;
    252253#endif
    253254
     
    408409#ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
    409410    /** Last read physical page for caching ED reads in the framer thread. */
    410     R3PTRTYPE(POHCIPAGECACHE)  pCacheED;
     411    OHCIPAGECACHE               CacheED;
    411412    /** Last read physical page for caching TD reads in the framer thread. */
    412     R3PTRTYPE(POHCIPAGECACHE)  pCacheTD;
     413    OHCIPAGECACHE               CacheTD;
    413414#endif
    414415} OHCIR3;
     
    889890static void                 ohciR3BusStop(POHCI pThis);
    890891#ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
    891 static void                 ohciR3PhysReadCacheClear(POHCIPAGECACHE pPageCache);
     892static void                 ohciR3PhysReadCacheInvalidate(POHCIPAGECACHE pPageCache);
    892893#endif
    893894
     
    12821283
    12831284#ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
    1284     ohciR3PhysReadCacheClear(pThisCC->pCacheED);
    1285     ohciR3PhysReadCacheClear(pThisCC->pCacheTD);
     1285    ohciR3PhysReadCacheInvalidate(&pThisCC->CacheED);
     1286    ohciR3PhysReadCacheInvalidate(&pThisCC->CacheTD);
    12861287#endif
    12871288
     
    14281429# ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
    14291430
    1430 static POHCIPAGECACHE ohciR3PhysReadCacheAlloc(void)
    1431 {
    1432     return (POHCIPAGECACHE)RTMemAlloc(sizeof(OHCIPAGECACHE));
    1433 }
    1434 
    1435 static void ohciR3PhysReadCacheFree(POHCIPAGECACHE pPageCache)
    1436 {
    1437     RTMemFree(pPageCache);
    1438 }
    1439 
    1440 static void ohciR3PhysReadCacheClear(POHCIPAGECACHE pPageCache)
     1431static void ohciR3PhysReadCacheInvalidate(POHCIPAGECACHE pPageCache)
    14411432{
    14421433    pPageCache->GCPhysReadCacheAddr = NIL_RTGCPHYS;
     
    14511442        if (PageAddr != pPageCache->GCPhysReadCacheAddr)
    14521443        {
    1453             PDMDevHlpPhysRead(pDevIns, PageAddr, pPageCache->au8PhysReadCache, sizeof(pPageCache->au8PhysReadCache));
     1444            PDMDevHlpPhysRead(pDevIns, PageAddr, pPageCache->abPhysReadCache, sizeof(pPageCache->abPhysReadCache));
    14541445            pPageCache->GCPhysReadCacheAddr = PageAddr;
    14551446#  ifdef VBOX_WITH_OHCI_PHYS_READ_STATS
     
    14581449        }
    14591450
    1460         memcpy(pvBuf, &pPageCache->au8PhysReadCache[GCPhys & PAGE_OFFSET_MASK], cbBuf);
     1451        memcpy(pvBuf, &pPageCache->abPhysReadCache[GCPhys & PAGE_OFFSET_MASK], cbBuf);
    14611452#  ifdef VBOX_WITH_OHCI_PHYS_READ_STATS
    14621453        ++g_PhysReadState.cCacheReads;
     
    14901481    {
    14911482        uint32_t offPage = GCPhys & PAGE_OFFSET_MASK;
    1492         memcpy(&pPageCache->au8PhysReadCache[offPage], pvBuf, RT_MIN(PAGE_SIZE - offPage, cbBuf));
     1483        memcpy(&pPageCache->abPhysReadCache[offPage], pvBuf, RT_MIN(PAGE_SIZE - offPage, cbBuf));
    14931484    }
    14941485}
     
    15041495DECLINLINE(void) ohciR3CacheEdUpdate(POHCICC pThisCC, RTGCPHYS32 EdAddr, PCOHCIED pEd)
    15051496{
    1506     ohciR3PhysCacheUpdate(pThisCC->pCacheED, EdAddr + RT_OFFSETOF(OHCIED, HeadP), &pEd->HeadP, sizeof(uint32_t));
     1497    ohciR3PhysCacheUpdate(&pThisCC->CacheED, EdAddr + RT_OFFSETOF(OHCIED, HeadP), &pEd->HeadP, sizeof(uint32_t));
    15071498}
    15081499
     
    15181509DECLINLINE(void) ohciR3CacheTdUpdate(POHCICC pThisCC, RTGCPHYS32 TdAddr, PCOHCITD pTd)
    15191510{
    1520     ohciR3PhysCacheUpdate(pThisCC->pCacheTD, TdAddr, pTd, sizeof(*pTd));
     1511    ohciR3PhysCacheUpdate(&pThisCC->CacheTD, TdAddr, pTd, sizeof(*pTd));
    15211512}
    15221513
     
    15341525#ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
    15351526    POHCICC pThisCC = PDMINS_2_DATA_CC(pDevIns, POHCICC);
    1536     ohciR3PhysReadCacheRead(pDevIns, pThisCC->pCacheED, EdAddr, pEd, sizeof(*pEd));
     1527    ohciR3PhysReadCacheRead(pDevIns, &pThisCC->CacheED, EdAddr, pEd, sizeof(*pEd));
    15371528#else
    15381529    ohciR3GetDWords(pDevIns, EdAddr, (uint32_t *)pEd, sizeof(*pEd) >> 2);
     
    15511542#ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
    15521543    POHCICC pThisCC = PDMINS_2_DATA_CC(pDevIns, POHCICC);
    1553     ohciR3PhysReadCacheRead(pDevIns, pThisCC->pCacheTD, TdAddr, pTd, sizeof(*pTd));
     1544    ohciR3PhysReadCacheRead(pDevIns, &pThisCC->CacheTD, TdAddr, pTd, sizeof(*pTd));
    15541545#else
    15551546    ohciR3GetDWords(pDevIns, TdAddr, (uint32_t *)pTd, sizeof(*pTd) >> 2);
     
    25292520    /* Clear all caches here to avoid reading stale data from previous lock holders. */
    25302521    POHCICC pThisCC = pThis->pThisR3;
    2531     ohciR3PhysReadCacheClear(pThisCC->pCacheED);
    2532     ohciR3PhysReadCacheClear(pThisCC->pCacheTD);
     2522    ohciR3PhysReadCacheInvalidate(&pThisCC->CacheED);
     2523    ohciR3PhysReadCacheInvalidate(&pThisCC->CacheTD);
    25332524# endif
    25342525}
     
    25492540     */
    25502541    POHCICC pThisCC = pThis->pThisR3;
    2551     ohciR3PhysReadCacheClear(pThisCC->pCacheED);
    2552     ohciR3PhysReadCacheClear(pThisCC->pCacheTD);
     2542    ohciR3PhysReadCacheInvalidate(&pThisCC->CacheED);
     2543    ohciR3PhysReadCacheInvalidate(&pThisCC->CacheTD);
    25532544# endif
    25542545
     
    31623153# ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
    31633154    POHCICC pThisCC = PDMINS_2_DATA_CC(pDevIns, POHCICC);
    3164     ohciR3PhysReadCacheClear(pThisCC->pCacheTD);
     3155    ohciR3PhysReadCacheInvalidate(&pThisCC->CacheTD);
    31653156# endif
    31663157
     
    41094100            {
    41104101# ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
    4111                 ohciR3PhysReadCacheClear(pThisCC->pCacheTD);
     4102                ohciR3PhysReadCacheInvalidate(&pThisCC->CacheTD);
    41124103# endif
    41134104                do
     
    59635954    PDMDEV_CHECK_VERSIONS_RETURN_QUIET(pDevIns);
    59645955    POHCI   pThis   = PDMINS_2_DATA(pDevIns, POHCI);
    5965 #ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
    5966     POHCIR3 pThisCC = PDMINS_2_DATA_CC(pDevIns, POHCIR3);
    5967 
    5968     ohciR3PhysReadCacheFree(pThisCC->pCacheED);
    5969     pThisCC->pCacheED = NULL;
    5970     ohciR3PhysReadCacheFree(pThisCC->pCacheTD);
    5971     pThisCC->pCacheTD = NULL;
    5972 #endif
    59735956
    59745957    if (RTCritSectIsInitialized(&pThis->CritSect))
     
    61456128        return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
    61466129                                   N_("OHCI: Failed to create critical section"));
    6147 
    6148 #ifdef VBOX_WITH_OHCI_PHYS_READ_CACHE
    6149     pThisCC->pCacheED = ohciR3PhysReadCacheAlloc();
    6150     pThisCC->pCacheTD = ohciR3PhysReadCacheAlloc();
    6151     if (pThisCC->pCacheED == NULL || pThisCC->pCacheTD == NULL)
    6152         return PDMDevHlpVMSetError(pDevIns, VERR_NO_MEMORY, RT_SRC_POS, N_("OHCI: Failed to allocate PhysRead cache"));
    6153 #endif
    61546130
    61556131    /*
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