<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from rtf -->
<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
</head>
<body>
<font face="Arial" size="2"><span style="font-size:10pt;">
<div>Hi Paul,</div>
<div> </div>
<div>When testing the latest patch I added, I came across couple issues in the driver:</div>
<div>1. In the patch you sent out on July 13 (later tagged as misc_bug_fixes_and_enum), within NVMeAllocIoQueues function, you reset the QueueID for each NUMA node loop as below:</div>
<div>        for (Node = 0; Node < pRMT->NumNumaNodes; Node++) {</div>
<div>            pNNT = pRMT->pNumaNodeTbl + Node;</div>
<div>            <font color="red">QueueID = 0;</font></div>
<div>            for (Core = pNNT->FirstCoreNum; Core <= pNNT->LastCoreNum; Core++) {</div>
<div>It turns out only allocating the number of cores of a given NUMA node for the entire system. I wonder why?</div>
<div> </div>
<div>2. When the driver is in learning phase where it tries to find out the mappings between cores and MSI vectors, in IoCompletionDpcRoutine, the driver limits the pending completion entry checking based on MsgID:</div>
<div>        if (!learning) {</div>
<div>            firstCheckQueue = lastCheckQueue = pMMT->CplQueueNum;</div>
<div>        } else {</div>
<div>            <font color="red">firstCheckQueue = lastCheckQueue = (USHORT)MsgID;</font></div>
<div>        }</div>
<div>Since it's still in learning phase, shouldn't it look up every created completion queue to find out the mapping?</div>
<div> </div>
<div>3. In NVMeInitialize, the driver call StorPortInitializePerfOpts in both normal and Crashdump/Hibernation cases. The routine returns failure and I wonder if it makes sense to call it in Crashdump/Hibernation case.</div>
<div> </div>
<div>Thanks,</div>
<div>Alex</div>
<div> </div>
</span></font>
</body>
</html>