void CIDAcceptedIOSQ_r10b::ReapVerifyCID(SharedIOSQPtr iosq, SharedIOCQPtr iocq, uint16_t expCID) { uint32_t isrCount; uint32_t ceRemain; uint32_t numReaped; uint32_t numCE; if (iocq->ReapInquiryWaitSpecify(CALC_TIMEOUT_ms(1), 1, numCE, isrCount) == false) { iocq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iocq.fail"), "Dump Entire IOCQ"); iosq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iosq.fail"), "Dump Entire IOSQ"); throw FrmwkEx(HERE, "Unable to see CEs for issued cmd"); } SharedMemBufferPtr ceMem = SharedMemBufferPtr(new MemBuffer()); if ((numReaped = iocq->Reap(ceRemain, ceMem, isrCount, numCE, true)) != 1) { iocq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iocq.fail"), "Dump Entire IOCQ"); iosq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iosq.fail"), "Dump Entire IOSQ"); throw FrmwkEx(HERE, "Unable to reap on IOCQ"); } union CE *ce = (union CE *)ceMem->GetBuffer(); ProcessCE::Validate(*ce); // throws upon error if (ce->n.CID != expCID) { iocq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iocq.fail"), "Dump Entire IOCQ"); iosq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iosq.fail"), "Dump Entire IOSQ"); throw FrmwkEx(HERE, "Received CID %d but expected %d", ce->n.CID, expCID); } if (ce->n.SQID != iosq->GetQId()) { iocq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iocq.fail"), "Dump Entire IOCQ"); iosq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iosq.fail"), "Dump Entire IOSQ"); throw FrmwkEx(HERE, "Rx'd SDID %d but expt'd %d", ce->n.SQID, iosq->GetQId()); } }
void QIDVariations_r10b::ReapVerifyOnCQ(SharedIOCQPtr iocq, SharedIOSQPtr iosq) { uint32_t numCE; uint32_t ceRemain; uint32_t numReaped; uint32_t isrCount; LOG_NRM("Reap and verify CE."); SharedMemBufferPtr ceMemIOCQ = SharedMemBufferPtr(new MemBuffer()); for (uint32_t nCmds = 1; nCmds < iosq->GetNumEntries(); nCmds++) { LOG_NRM("Wait for the CE to arrive in IOCQ"); if (iocq->ReapInquiryWaitSpecify(CALC_TIMEOUT_ms(1), 1, numCE, isrCount) == false) { iocq->Dump( FileSystem::PrepDumpFile(mGrpName, mTestName, "iocq", "reapInq"), "Unable to see any CE's in IOCQ, dump entire CQ contents"); throw FrmwkEx(HERE, "Unable to see completion of cmd"); } LOG_NRM("The CQ's metrics B4 reaping holds head_ptr needed"); struct nvme_gen_cq iocqMetrics = iocq->GetQMetrics(); KernelAPI::LogCQMetrics(iocqMetrics); if ((numReaped = iocq->Reap(ceRemain, ceMemIOCQ, isrCount, 1, true)) != 1) { iocq->Dump( FileSystem::PrepDumpFile(mGrpName, mTestName, "iocq", "reap"), "Unable to see any CE's in IOCQ, dump entire CQ contents"); throw FrmwkEx(HERE, "Verified there was 1 CE, but reaping failed"); } LOG_NRM("The reaped CE is..."); iocq->LogCE(iocqMetrics.head_ptr); union CE ce = iocq->PeekCE(iocqMetrics.head_ptr); ProcessCE::Validate(ce); // throws upon error if (ce.n.SQID != iosq->GetQId()) { iocq->Dump( FileSystem::PrepDumpFile(mGrpName, mTestName, "iocq", "sqId"), "Wrong SQID in the CE of IOCQ, dump entire CQ contents"); throw FrmwkEx(HERE, "Invalid SQID %d in CE, expected SQID", ce.n.SQID, iosq->GetQId()); } } }
void MaxIOQMSIXManyTo1_r10b::SendCmdAndReap(SharedIOSQPtr iosq, SharedIOCQPtr iocq, SharedCmdPtr cmd, uint32_t anticipatedIrqs) { uint16_t uniqueId; uint32_t numCE; string work; uint32_t isrCount; LOG_NRM("Send the cmd to hdw via IOSQ #%d", iosq->GetQId()); iosq->Send(cmd, uniqueId); work = str(boost::format("ioqId.%d.%s") % iosq->GetQId() % cmd->GetName().c_str()); iosq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iosq", work), "Just B4 ringing doorbell, dump IOSQ"); iosq->Ring(); LOG_NRM("Wait for the CE to arrive in CQ %d", iocq->GetQId()); if (iocq->ReapInquiryWaitSpecify(DEFAULT_CMD_WAIT_ms, 1, numCE, isrCount) == false) { iocq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iocq.fail", work), "Dump Entire IOCQ"); iosq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iosq.fail", work), "Dump Entire IOSQ"); throw FrmwkEx(HERE, "Unable to see CEs for issued cmd"); } work = str(boost::format("iocq.%d") % uniqueId); IO::ReapCE(iocq, 1, isrCount, mGrpName, mTestName, work); if (isrCount != anticipatedIrqs) { iocq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iocq.fail", work), "Dump Entire IOCQ"); iosq->Dump(FileSystem::PrepDumpFile(mGrpName, mTestName, "iosq.fail", work), "Dump Entire IOSQ"); throw FrmwkEx(HERE, "Anticipated ISRs #%d but fired #%d", anticipatedIrqs, isrCount); } }
void CreateIOSQ::Init(const SharedIOSQPtr iosq) { // Setup the PRP buffer based upon contig or non-contig memory int prpField = MASK_PRP1_PAGE; if (iosq->GetIsContig() == false) prpField |= MASK_PRP1_LIST; SetPrpBuffer((send_64b_bitmask)prpField, iosq->GetQBuffer(), iosq->GetQSize()); { // Handle DWORD 10 uint32_t dword10 = GetDword(10); // Handle q size dword10 &= ~0xffff0000; dword10 |= (((uint32_t)iosq->GetNumEntries()) << 16); // Handle Q ID dword10 &= ~0x0000ffff; dword10 |= (uint32_t)iosq->GetQId(); SetDword(dword10, 10); } // Handle DWORD 10 { // Handle DWORD 11 uint32_t dword11 = GetDword(11); // Handle the PC bit if (iosq->GetIsContig()) dword11 |= 0x00000001; else dword11 &= ~0x00000001; // Handle Q priority dword11 &= ~0x00000006; dword11 |= (((uint32_t)iosq->GetPriority()) << 1); // Handle CQ ID dword11 &= ~0xffff0000; dword11 |= (((uint32_t)iosq->GetCqId()) << 16); SetDword(dword11, 11); } // Handle DWORD 11 }
void IOQRollChkDiff_r10b::IOQRollChkDiff(uint32_t numEntriesIOSQ, uint32_t numEntriesIOCQ) { uint16_t uniqueId; // Lookup objs which were created in a prior test within group SharedASQPtr asq = CAST_TO_ASQ(gRsrcMngr->GetObj(ASQ_GROUP_ID)) SharedACQPtr acq = CAST_TO_ACQ(gRsrcMngr->GetObj(ACQ_GROUP_ID)) SharedIOCQPtr iocq = Queues::CreateIOCQContigToHdw(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, asq, acq, IOQ_ID, numEntriesIOCQ, false, IOCQ_CONTIG_GROUP_ID, false, 1); SharedIOSQPtr iosq = Queues::CreateIOSQContigToHdw(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, asq, acq, IOQ_ID, numEntriesIOSQ, false, IOSQ_CONTIG_GROUP_ID, IOQ_ID, 0); LOG_NRM("(IOCQ Size, IOSQ Size)=(%d,%d)", iocq->GetNumEntries(), iosq->GetNumEntries()); SharedWritePtr writeCmd = SetWriteCmd(); LOG_NRM("Send #%d cmds to hdw via the contiguous IOSQ #%d", MAX(iosq->GetNumEntries(), iocq->GetNumEntries()) + 2, iosq->GetQId()); for (uint32_t numEntries = 0; numEntries < (uint32_t)(MAX (iosq->GetNumEntries(), iocq->GetNumEntries()) + 2); numEntries++) { LOG_NRM("Processing #%d entries", numEntries); iosq->Send(writeCmd, uniqueId); iosq->Ring(); ReapAndVerifyCE(iocq, (numEntries + 1) % iosq->GetNumEntries()); } VerifyQPointers(iosq, iocq); LOG_NRM("Delete IOSQ before the IOCQ to comply with spec."); Queues::DeleteIOSQToHdw(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, iosq, asq, acq); Queues::DeleteIOCQToHdw(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, iocq, asq, acq); }