VirtualBox

Changeset 35671 in vbox


Ignore:
Timestamp:
Jan 21, 2011 8:20:08 PM (14 years ago)
Author:
vboxsync
Message:

Storeage/tstVDIo: Fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Storage/testcase/tstVDIo.cpp

    r35664 r35671  
    1 /* $Id  */
     1/* $Id$ */
    22/** @file
    33 *
     
    110110    /** Flag whether the request is outstanding or not. */
    111111    volatile bool fOutstanding;
     112    /** Buffer to use for reads. */
     113    void          *pvBufRead;
    112114} VDIOREQ, *PVDIOREQ;
    113115
     
    126128    size_t      cbBlkIo;
    127129    /** Number of bytes to transfer. */
    128     size_t      cbIo;
     130    uint64_t    cbIo;
    129131    /** Chance in percent to get a write. */
    130132    unsigned    uWriteChance;
     
    143145            /** Pointer to the bitmap marking accessed blocks. */
    144146            uint8_t *pbMapAccessed;
     147            /** Number of unaccessed blocks. */
     148            uint32_t cBlocksLeft;
    145149        } Rnd;
    146150    } u;
     
    357361}
    358362
    359 static int tstVDIoTestInit(PVDIOTEST pIoTest, PVDTESTGLOB pGlob, bool fRandomAcc, size_t cbIo,
     363static int tstVDIoTestInit(PVDIOTEST pIoTest, PVDTESTGLOB pGlob, bool fRandomAcc, uint64_t cbIo,
    360364                           size_t cbBlkSize, uint64_t offStart, uint64_t offEnd,
    361365                           unsigned uWriteChance, unsigned uReadChance);
     
    562566                uint64_t NanoTS = RTTimeNanoTS();
    563567
     568                /* Init requests. */
    564569                for (unsigned i = 0; i < cMaxTasksOutstanding; i++)
     570                {
    565571                    paIoReq[i].idx = i;
    566 
    567                 while (tstVDIoTestRunning(&IoTest))
     572                    paIoReq[i].pvBufRead = RTMemAlloc(cbBlkSize);
     573                    if (!paIoReq[i].pvBufRead)
     574                    {
     575                        rc = VERR_NO_MEMORY;
     576                        break;
     577                    }
     578                }
     579
     580                while (   tstVDIoTestRunning(&IoTest)
     581                       && RT_SUCCESS(rc))
    568582                {
    569583                    bool fTasksOutstanding = false;
     
    588602                                        {
    589603                                            rc = VDRead(pGlob->pVD, paIoReq[idx].off, paIoReq[idx].DataSeg.pvSeg, paIoReq[idx].cbReq);
    590                                             RTMemFree(paIoReq[idx].DataSeg.pvSeg);
    591604                                            break;
    592605                                        }
     
    613626                                            rc = VDAsyncRead(pGlob->pVD, paIoReq[idx].off, paIoReq[idx].cbReq, &paIoReq[idx].SgBuf,
    614627                                                             tstVDIoTestReqComplete, &paIoReq[idx], EventSem);
    615                                             if (rc == VINF_VD_ASYNC_IO_FINISHED)
    616                                                 RTMemFree(paIoReq[idx].DataSeg.pvSeg);
    617628                                            break;
    618629                                        }
     
    11701181}
    11711182
    1172 static int tstVDIoTestInit(PVDIOTEST pIoTest, PVDTESTGLOB pGlob, bool fRandomAcc, size_t cbIo,
     1183static int tstVDIoTestInit(PVDIOTEST pIoTest, PVDTESTGLOB pGlob, bool fRandomAcc, uint64_t cbIo,
    11731184                           size_t cbBlkSize, uint64_t offStart, uint64_t offEnd,
    11741185                           unsigned uWriteChance, unsigned uReadChance)
     
    11831194    pIoTest->uWriteChance  = uWriteChance;
    11841195    pIoTest->pIoRnd        = pGlob->pIoRnd;
     1196
    11851197    if (fRandomAcc)
    11861198    {
    1187         pIoTest->u.Rnd.cBlocks = cbIo / cbBlkSize + ((cbIo % cbBlkSize) ? 1 : 0);
     1199        uint64_t cbRange = pIoTest->offEnd < pIoTest->offStart
     1200                           ? pIoTest->offStart - pIoTest->offEnd
     1201                           : pIoTest->offEnd - pIoTest->offStart;
     1202
     1203        pIoTest->u.Rnd.cBlocks = cbRange / cbBlkSize + ((cbRange % cbBlkSize) ? 1 : 0);
     1204        pIoTest->u.Rnd.cBlocksLeft = pIoTest->u.Rnd.cBlocks;
    11881205        pIoTest->u.Rnd.pbMapAccessed = (uint8_t *)RTMemAllocZ(pIoTest->u.Rnd.cBlocks / 8
    11891206                                                              + ((pIoTest->u.Rnd.cBlocks % 8)
     
    12481265        {
    12491266            /* Read */
    1250             pIoReq->DataSeg.pvSeg = RTMemAlloc(pIoReq->cbReq);
    1251             if (!pIoReq->DataSeg.pvSeg)
    1252                 rc = VERR_NO_MEMORY;
     1267            pIoReq->DataSeg.pvSeg = pIoReq->pvBufRead;
    12531268        }
    12541269
     
    12641279
    12651280                /* In case this is the last request we don't need to search further. */
    1266                 if (pIoTest->cbIo > 0)
     1281                if (pIoTest->u.Rnd.cBlocksLeft > 1)
    12671282                {
    12681283                    int idxIo;
     
    12851300                Assert(idx != -1);
    12861301                pIoReq->off = idx * pIoTest->cbBlkIo;
    1287                 ASMBitSet(pIoTest->u.Rnd.pbMapAccessed, idx);
     1302                pIoTest->u.Rnd.cBlocksLeft--;
     1303                if (!pIoTest->u.Rnd.cBlocksLeft)
     1304                {
     1305                    /* New round, clear everthing. */
     1306                    ASMBitClearRange(pIoTest->u.Rnd.pbMapAccessed, 0, pIoTest->u.Rnd.cBlocks);
     1307                    pIoTest->u.Rnd.cBlocksLeft = pIoTest->u.Rnd.cBlocks;
     1308                }
     1309                else
     1310                    ASMBitSet(pIoTest->u.Rnd.pbMapAccessed, idx);
    12881311            }
    12891312            else
    12901313            {
    1291                 pIoReq->off        = pIoTest->u.offNext;
    1292                 pIoTest->u.offNext = pIoTest->offEnd < pIoTest->offStart
    1293                                      ? RT_MAX(pIoTest->offEnd, pIoTest->u.offNext - pIoTest->cbBlkIo)
    1294                                      : RT_MIN(pIoTest->offEnd, pIoTest->u.offNext + pIoTest->cbBlkIo);
     1314                pIoReq->off = pIoTest->u.offNext;
     1315                if (pIoTest->offEnd < pIoTest->offStart)
     1316                {
     1317                    pIoTest->u.offNext = pIoTest->u.offNext == 0
     1318                                         ? pIoTest->offEnd - pIoTest->cbBlkIo
     1319                                         : RT_MAX(pIoTest->offEnd, pIoTest->u.offNext - pIoTest->cbBlkIo);
     1320                }
     1321                else
     1322                {
     1323                    pIoTest->u.offNext = pIoTest->u.offNext + pIoTest->cbBlkIo >= pIoTest->offEnd
     1324                                         ? 0
     1325                                         : RT_MIN(pIoTest->offEnd, pIoTest->u.offNext + pIoTest->cbBlkIo);
     1326                }
    12951327            }
    12961328            pIoReq->fOutstanding = true;
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