<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri","sans-serif";
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>I’ve performed a detailed analysis of the NVMe initialization sequence, with the OFA driver, and posted a video here:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><a href="http://www.bustrace.com/bustrace10/videos/NVMeBootCapture/">http://www.bustrace.com/bustrace10/videos/NVMeBootCapture/</a><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The NVMe passive initialization phase uses a background state machine to initialize the NVMe controller after the controller has been enabled. On my two NUMA node system, with 16 logical processors, the passive initialization phase takes ~1.859 seconds. However, if I analyze the time spent communicating with the NVMe controller, plus the time spent waiting for the NVMe controller to process the request, I come up with less than 170 milliseconds. The bulk of that 1.859 seconds is spent with an idle state machine waiting for the next timer callback, and an idle passive initialization phase waiting for the state machine to complete. One of the primary reasons for this is the use of StorPortNotification - RequestTimerCall. The miniport is using the value of STORPORT_TIMER_CB_us for the delay which equals:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#define STORPORT_TIMER_CB_us 5000 /* .005 seconds */<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Even though the miniport driver is requesting 5 msec, the actual time to receive the callback is typically 15 msec. The reason for this is noted in the STORPORT documentation:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><i>The system timer resolution is approximately 10 milliseconds.<o:p></o:p></i></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>This may not be a significant issue but I know some OEMs have concerns about time to ready so I thought I would post my analysis.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Mike Berhan<o:p></o:p></p><p class=MsoNormal>busTRACE Technologies<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>ps: If you notice the “Not in memory” for the PERF_CONFIGURATION_DATA structure, that is caused by the miniport driver not setting the Version and Size fields of the data structure.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>