void CIDAcceptedIOSQ_r10b::RunCoreTest() { /** \verbatim * Assumptions: * None. * \endverbatim */ if (gCtrlrConfig->SetState(ST_DISABLE_COMPLETELY) == false) throw FrmwkEx(HERE); LOG_NRM("Create ACQ and ASQ objects which have test life time"); SharedACQPtr acq = CAST_TO_ACQ(SharedACQPtr(new ACQ(gDutFd))) acq->Init(5); SharedASQPtr asq = CAST_TO_ASQ(SharedASQPtr(new ASQ(gDutFd))) asq->Init(5); IRQ::SetAnySchemeSpecifyNum(2); // throws upon error gCtrlrConfig->SetCSS(CtrlrConfig::CSS_NVM_CMDSET); if (gCtrlrConfig->SetState(ST_ENABLE) == false) throw FrmwkEx(HERE); vector<SharedIOSQPtr> iosqs; SharedIOCQPtr iocq; InitTstRsrcs(asq, acq, iosqs, iocq); SharedWritePtr writeCmd = CreateWriteCmd(); LOG_NRM("Learn initial unique command id assigned by dnvme"); uint16_t curCID; vector <SharedIOSQPtr>::iterator iosq; for (iosq = iosqs.begin(); iosq != iosqs.end(); iosq++) (*iosq)->Send(writeCmd, curCID); uint16_t prevCID = curCID; for (uint32_t nCmds = 0; nCmds < MAX_CMDS; nCmds++) { for (iosq = iosqs.begin(); iosq != iosqs.end(); iosq++) { LOG_NRM("(nCmds, curCID, prevCID, SQ ID) = (%d, %d, %d, %d)", nCmds, curCID, prevCID, (*iosq)->GetQId()); (*iosq)->Ring(); ReapVerifyCID(*iosq, iocq, prevCID); (*iosq)->Send(writeCmd, curCID); if (curCID != (uint16_t)(prevCID + 1)) { (*iosq)->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iosq.fail." + (*iosq)->GetQId()), "Dump Entire IOSQ"); iocq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iocq.fail." + iocq->GetQId()), "Dump Entire IOCQ"); throw FrmwkEx(HERE, "curCID(%d) != (prevCID + 1)(%d)", curCID, (prevCID + 1)); } } prevCID = curCID; } }
void PRPOffsetDualPgMultiBlk_r10b::RunCoreTest() { /** \verbatim * Assumptions: * None. * \endverbatim */ string work; int64_t X; bool enableLog; if (gCtrlrConfig->SetState(ST_DISABLE_COMPLETELY) == false) throw FrmwkEx(HERE); LOG_NRM("Create ACQ and ASQ objects which have test life time"); SharedACQPtr acq = CAST_TO_ACQ(SharedACQPtr(new ACQ(mFd))) acq->Init(5); SharedASQPtr asq = CAST_TO_ASQ(SharedASQPtr(new ASQ(mFd))) asq->Init(5); IRQ::SetAnySchemeSpecifyNum(2); // throws upon error gCtrlrConfig->SetCSS(CtrlrConfig::CSS_NVM_CMDSET); if (gCtrlrConfig->SetState(ST_ENABLE) == false) throw FrmwkEx(HERE); SharedIOCQPtr iocq; SharedIOSQPtr iosq; InitTstRsrcs(asq, acq, iosq, iocq); LOG_NRM("Compute memory page size from CC.MPS."); uint8_t mpsRegVal; if (gCtrlrConfig->GetMPS(mpsRegVal) == false) throw FrmwkEx(HERE, "Unable to get MPS value from CC."); uint64_t ccMPS = (uint64_t)(1 << (mpsRegVal + 12)); LOG_NRM("Get namspc and determine LBA size"); Informative::Namspc namspcData = gInformative->Get1stBareMetaE2E(); send_64b_bitmask prpBitmask = (send_64b_bitmask)(MASK_PRP1_PAGE | MASK_PRP2_PAGE); LBAFormat lbaFormat = namspcData.idCmdNamspc->GetLBAFormat(); uint64_t lbaDataSize = (1 << lbaFormat.LBADS); LOG_NRM("LBA data size is %ld.", lbaDataSize); LOG_NRM("Seeking max data xfer size for chosen namspc"); ConstSharedIdentifyPtr idCmdCtrlr = gInformative->GetIdentifyCmdCtrlr(); uint32_t maxDtXferSz = idCmdCtrlr->GetMaxDataXferSize(); SharedWritePtr writeCmd = SharedWritePtr(new Write()); writeCmd->SetNSID(namspcData.id); SharedReadPtr readCmd = SharedReadPtr(new Read()); readCmd->SetNSID(namspcData.id); SharedMemBufferPtr writeMem = SharedMemBufferPtr(new MemBuffer()); SharedMemBufferPtr readMem = SharedMemBufferPtr(new MemBuffer()); switch (namspcData.type) { case Informative::NS_BARE: X = ccMPS - lbaDataSize; break; case Informative::NS_METAS: X = ccMPS - lbaDataSize; LOG_NRM("Allocating separate meta data buffer."); if (gRsrcMngr->SetMetaAllocSize( lbaFormat.MS * ((2 * ccMPS) / lbaDataSize)) == false) { throw FrmwkEx(HERE, "Unable to allocate Meta buffers."); } writeCmd->AllocMetaBuffer(); readCmd->AllocMetaBuffer(); break; case Informative::NS_METAI: X = ccMPS - (lbaDataSize + lbaFormat.MS); break; case Informative::NS_E2ES: case Informative::NS_E2EI: throw FrmwkEx(HERE, "Deferring work to handle this case in future"); break; } if (X < 0) { LOG_WARN("CC.MPS < lba data size(LBADS); Can't run test."); return; } DataPattern dataPat; uint64_t wrVal; uint64_t Y; for (int64_t pgOff = 0; pgOff <= X; pgOff += 4) { switch (namspcData.type) { case Informative::NS_BARE: case Informative::NS_METAS: Y = ((2 * ccMPS) - pgOff) / lbaDataSize; break; case Informative::NS_METAI: Y = ((2 * ccMPS) - pgOff) / (lbaDataSize + lbaFormat.MS); break; case Informative::NS_E2ES: case Informative::NS_E2EI: throw FrmwkEx(HERE, "Deferring work to handle this case in future"); break; } for (uint64_t nLBAs = 1; nLBAs <= Y; nLBAs++) { LOG_NRM("Sending LBA #%ld of #%ld", nLBAs, Y); if ((maxDtXferSz != 0) && (maxDtXferSz < (lbaDataSize * nLBAs))) { // If the total data xfer exceeds the maximum data xfer // allowed then we break from the inner loop and continue // test with next offset (outer loop). LOG_WARN("Data xfer size exceeds max allowed, continuing.."); break; } if ((nLBAs % 2) != 0) { dataPat = DATAPAT_INC_32BIT; wrVal = pgOff + nLBAs; } else { dataPat = DATAPAT_CONST_16BIT; wrVal = pgOff + nLBAs; } uint64_t metabufSz = nLBAs * lbaFormat.MS; switch (namspcData.type) { case Informative::NS_BARE: writeMem->InitOffset1stPage((lbaDataSize * nLBAs), pgOff, false); readMem->InitOffset1stPage((lbaDataSize * nLBAs), pgOff, false); break; case Informative::NS_METAS: writeMem->InitOffset1stPage((lbaDataSize * nLBAs), pgOff, false); readMem->InitOffset1stPage((lbaDataSize * nLBAs), pgOff, false); writeCmd->SetMetaDataPattern(dataPat, wrVal, 0, metabufSz); break; case Informative::NS_METAI: writeMem->InitOffset1stPage( ((lbaDataSize + lbaFormat.MS) * nLBAs), pgOff, false); readMem->InitOffset1stPage( ((lbaDataSize + lbaFormat.MS) * nLBAs), pgOff, false); break; case Informative::NS_E2ES: case Informative::NS_E2EI: throw FrmwkEx(HERE, "Deferring work to handle this case in future"); break; } work = str(boost::format("pgOff.%d.nlba.%d") % pgOff % nLBAs); writeCmd->SetPrpBuffer(prpBitmask, writeMem); writeMem->SetDataPattern(dataPat, wrVal); writeCmd->SetNLB(nLBAs - 1); // convert to 0 based. enableLog = false; if ((pgOff <= 8) || (pgOff >= (X - 8))) enableLog = true; IO::SendAndReapCmd(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, iosq, iocq, writeCmd, work, enableLog); readCmd->SetPrpBuffer(prpBitmask, readMem); readCmd->SetNLB(nLBAs - 1); // convert to 0 based. IO::SendAndReapCmd(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, iosq, iocq, readCmd, work, enableLog); VerifyDataPat(readCmd, dataPat, wrVal, metabufSz); } } }