<!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.2900.3243" name=GENERATOR></HEAD>
<BODY>
<DIV><FONT face=Arial size=2><SPAN class=275104113-14052008>Hi 
Stan,</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN 
class=275104113-14052008></SPAN></FONT> </DIV>
<DIV><FONT face=Arial size=2><SPAN class=275104113-14052008>I've added to the 
branch the following fix in order to manage to get the RC4 train. 
:)</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><SPAN class=275104113-14052008><FONT face=Arial size=2>Please, 
review.</FONT></SPAN></DIV>
<DIV><SPAN class=275104113-14052008><FONT face=Arial 
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=275104113-14052008><FONT face=Arial size=2>The patch adds 
protection for the search of CQ while completion event.</FONT></SPAN></DIV>
<DIV><SPAN class=275104113-14052008><FONT face=Arial size=2>It really protects 
</FONT></SPAN><SPAN class=275104113-14052008><FONT face=Arial 
size=2>radix_tree_lookup() from <SPAN class=275104113-14052008><FONT face=Arial 
size=2>radix_tree_insert(), because the latter changes the 
tree.</FONT></SPAN></FONT></SPAN></DIV>
<DIV><SPAN class=275104113-14052008><FONT face=Arial size=2><SPAN 
class=275104113-14052008>When they run simultaneously, <SPAN 
class=275104113-14052008><FONT face=Arial size=2>radix_tree_lookup can miss a 
really existing CQ.</FONT></SPAN></SPAN></FONT></SPAN></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>Index: 
E:/svn.openib/gen1/branches/WOF1-1/hw/mlx4/kernel/bus/net/cq.c<BR>===================================================================<BR>--- 
E:/svn.openib/gen1/branches/WOF1-1/hw/mlx4/kernel/bus/net/cq.c (revision 
1155)<BR>+++ 
E:/svn.openib/gen1/branches/WOF1-1/hw/mlx4/kernel/bus/net/cq.c (revision 
1167)<BR>@@ -51,9 +51,12 @@<BR> void mlx4_cq_completion(struct mlx4_dev 
*dev, u32 cqn)<BR> {<BR>  struct mlx4_cq *cq;<BR>+ struct 
mlx4_cq_table *cq_table = 
&mlx4_priv(dev)->cq_table;<BR> <BR>- cq = 
radix_tree_lookup(&mlx4_priv(dev)->cq_table.tree,<BR>-          
cqn & (dev->caps.num_cqs - 
1));<BR>+ spin_lock_dpc(&cq_table->lock);<BR>+ cq = 
radix_tree_lookup(&cq_table->tree, cqn & (dev->caps.num_cqs - 
1));<BR>+ spin_unlock_dpc(&cq_table->lock);<BR>+<BR>  if 
(!cq) {<BR>   mlx4_warn(dev, "Completion event for bogus CQ 
%08x\n", cqn);<BR>   return;<BR></FONT></DIV></BODY></HTML>