<!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>