<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content="MSHTML 6.00.6000.16640" name=GENERATOR></HEAD>
<BODY>
<DIV><FONT face=Arial color=#0000ff size=2><SPAN 
class=453030012-26062008></SPAN></FONT> </DIV><BR>
<DIV class=OutlookMessageHeader lang=en-us dir=ltr align=left>
<HR tabIndex=-1>
</DIV>
<DIV></DIV>
<DIV><FONT face=Arial>
<P><SPAN class=984172411-25062008><FONT size=2>Hi all,</FONT></SPAN></P>
<P><SPAN class=984172411-25062008><FONT size=2>The original problem was IPoIB 
failure (link up/down) during the operation of  'heavy' 
applications.</FONT></SPAN></P><SPAN class=984172411-25062008>
<DIV><SPAN class=801402317-24062008><FONT size=2><SPAN 
class=984172411-25062008>After our investigation, we found when</SPAN> one 
execute application with heavy load on the HCA, driver always have non-empty 
CQs, so it continues to work with its DPCs and not allows to other DPC to be 
performed.</FONT></SPAN></DIV>
<DIV><SPAN class=801402317-24062008><FONT size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=801402317-24062008><FONT size=2>The 
solution</FONT></SPAN></DIV>
<DIV><SPAN class=801402317-24062008><FONT size=2>Based on an anologous solution 
for mthca driver, driver has to enable other than its own DPC to be performed. 
It's possible to count certain amount of time that driver spent on DPC handling, 
than exit, thus allowing other DPC to run :</FONT></SPAN></DIV></SPAN>
<P><FONT size=2></FONT> </P>
<P><FONT size=2></FONT> </P>
<P><FONT size=2>Index: hw/mlx4/kernel/bus/net/eq.c</FONT></P><FONT 
face="Courier New (Hebrew)">
<P><FONT 
size=2>===================================================================</FONT></P>
<P><FONT size=2>--- </FONT></FONT><FONT size=2><FONT 
face="Times New Roman">hw/mlx4/kernel/bus/net/eq.c</FONT><FONT 
face="Courier New (Hebrew)"> (</FONT><FONT face="Times New Roman">revision 
2634</FONT></FONT><FONT face="Courier New (Hebrew)"><FONT size=2>)</FONT></P>
<P><FONT size=2>+++ </FONT></FONT><FONT size=2><FONT 
face="Times New Roman">hw/mlx4/kernel/bus/net/eq.c</FONT><FONT 
face="Courier New (Hebrew)"> (</FONT><FONT face="Times New Roman">revision 
2635</FONT></FONT><FONT face="Courier New (Hebrew)"><FONT size=2>)</FONT></P>
<P><FONT size=2>@@ -160,6 +160,9 @@</FONT></P>
<P></FONT><FONT face="Times New Roman" size=2>int cqn</FONT><FONT 
face="Courier New (Hebrew)"><FONT size=2>;</FONT></P>
<P></FONT><FONT face="Times New Roman" size=2>int eqes_found = 0</FONT><FONT 
face="Courier New (Hebrew)"><FONT size=2>;</FONT></P>
<P></FONT><FONT face="Times New Roman" size=2>int set_ci = 0</FONT><FONT 
face="Courier New (Hebrew)"><FONT size=2>;</FONT></P>
<P><FONT size=2>+ </FONT></FONT><FONT face="Times New Roman" size=2>static const 
uint32_t cDpcMaxTime = 10000; //max time to spend in a while 
loop</FONT></P><FONT face="Courier New (Hebrew)">
<P><FONT size=2>+ </FONT></P>
<P><FONT size=2>+ </FONT></FONT><FONT face="Times New Roman" size=2>uint64_t 
start = cl_get_time_stamp</FONT><FONT face="Courier New (Hebrew)"><FONT 
size=2>();</FONT></P>
<P><FONT size=2></FONT></P>
<P></FONT><FONT face="Times New Roman" size=2>while ((eqe = 
next_eqe_sw(eq</FONT><FONT face="Courier New (Hebrew)"><FONT size=2>))) 
{</FONT></P>
<P><FONT size=2>/*</FONT></P>
<P><FONT size=2>@@ -222,6 +225,7 @@</FONT></P>
<P></FONT><FONT face="Times New Roman" size=2>default</FONT><FONT 
face="Courier New (Hebrew)"><FONT size=2>:</FONT></P>
<P></FONT><FONT face="Times New Roman" size=2>mlx4_warn(dev, "Unhandled event 
%02x(%02x) on EQ %d at index %u\n</FONT><FONT face="Courier New (Hebrew)"><FONT 
size=2>",</FONT></P>
<P></FONT><FONT face="Times New Roman" size=2>eqe->type, eqe->subtype, 
eq->eqn, eq->cons_index</FONT><FONT face="Courier New (Hebrew)"><FONT 
size=2>);</FONT></P>
<P><FONT size=2>+ </FONT></P>
<P></FONT><FONT face="Times New Roman" size=2>break</FONT><FONT 
face="Courier New (Hebrew)"><FONT size=2>;</FONT></P>
<P><FONT size=2>};</FONT></P>
<P><FONT size=2></FONT></P>
<P><FONT size=2>@@ -244,6 +248,10 @@</FONT></P>
<P></FONT><FONT face="Times New Roman" size=2>eq_set_ci(eq, 0</FONT><FONT 
face="Courier New (Hebrew)"><FONT size=2>);</FONT></P>
<P></FONT><FONT face="Times New Roman" size=2>set_ci = 0</FONT><FONT 
face="Courier New (Hebrew)"><FONT size=2>;</FONT></P>
<P><FONT size=2>}</FONT></P>
<P><FONT size=2>+ </FONT></P>
<P><FONT size=2>+ </FONT></FONT><FONT face="Times New Roman" size=2>if 
(cl_get_time_stamp() - start > cDpcMaxTime</FONT><FONT 
face="Courier New (Hebrew)"><FONT size=2> ) {</FONT></P>
<P><FONT size=2>+ </FONT></FONT><FONT face="Times New Roman" size=2>break; 
//allow other DPCs as well</FONT></P><FONT face="Courier New (Hebrew)">
<P><FONT size=2>+ }</FONT></P>
<P><FONT size=2>}</FONT></P>
<P><FONT size=2></FONT></P>
<P></FONT><FONT size=2><FONT face="Times New Roman">eq_set_ci(eq, 1</FONT><FONT 
face="Courier New (Hebrew)">);</P></FONT></FONT></FONT></DIV></BODY></HTML>