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