<!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.2963" name=GENERATOR></HEAD>
<BODY>
<DIV><SPAN class=577450511-04092006><FONT face=Arial 
size=2>Fab</FONT></SPAN></DIV>
<DIV><SPAN class=577450511-04092006><FONT face=Arial 
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=577450511-04092006><FONT face=Arial size=2>The patch for the 
former problem indeed help </FONT></SPAN></DIV>
<DIV><SPAN class=577450511-04092006><FONT face=Arial size=2>( I guess 
that that the fact you are not calling to srp_free_hca solve the double 
freeing, I also did not understand fully why ).</FONT></SPAN></DIV>
<DIV><SPAN class=577450511-04092006><FONT face=Arial size=2>Still I was left 
with the LOCAL_PROTECTION_ERR , the reason for that is casting issue in 32 bit 
machines</FONT></SPAN></DIV>
<DIV><SPAN class=577450511-04092006><FONT face=Arial size=2>Because SRP register 
kernel memory the cast from 32 bit to 64 bit use sign extension and 
:</FONT></SPAN></DIV>
<DIV><SPAN class=577450511-04092006><FONT face=Arial size=2>0x89830000 move to 
0xffffffff89830000</FONT></SPAN></DIV>
<DIV><SPAN class=577450511-04092006><FONT face=Arial 
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=577450511-04092006><FONT face=Arial size=2>this change solve 
tyhe problem (its just suggestion but the idea is to force the cast to 
ignore sign of the address)</FONT></SPAN></DIV>
<DIV><SPAN class=577450511-04092006></SPAN><SPAN 
class=577450511-04092006></SPAN><SPAN class=577450511-04092006><FONT face=Arial 
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=577450511-04092006><FONT face=Arial 
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=577450511-04092006><FONT face=Arial size=2>Index: 
kernel/srp_descriptors.c<BR>===================================================================<BR>--- 
kernel/srp_descriptors.c (revision 1647)<BR>+++ 
kernel/srp_descriptors.c (working copy)<BR>@@ -91,10 +91,12 
@@<BR>  }<BR> <BR>  /* Register the data segments array 
memory */<BR>- mr_create.vaddr = 
p_descriptors->p_recv_data_segments_array;<BR>+ mr_create.vaddr = (void* 
__ptr64)(uint64_t)(ULONG_PTR)p_descriptors->p_recv_data_segments_array;<BR>  mr_create.length 
= p_descriptors->recv_descriptor_count * 
p_descriptors->recv_data_segment_size;<BR>  mr_create.access_ctrl = 
IB_AC_LOCAL_WRITE;<BR>@@ -124,7 +126,7 
@@<BR>   p_descriptor->wr.num_ds = 
1;<BR>   p_descriptor->wr.ds_array = 
p_descriptor->ds;<BR> <BR>-  p_descriptor->ds[0].vaddr = 
(uint64_t)((void* 
__ptr64)p_data_segment);<BR>+  p_descriptor->ds[0].vaddr = 
(uint64_t)(ULONG_PTR)p_data_segment;<BR>   p_descriptor->ds[0].length 

p_descriptors->recv_data_segment_size;<BR>   p_descriptor->ds[0].lkey 
= p_descriptors->recv_lkey;<BR> <BR></FONT></SPAN></DIV>
<DIV><SPAN class=577450511-04092006><FONT face=Arial 
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=577450511-04092006><FONT face=Arial 
size=2></FONT></SPAN> </DIV></BODY></HTML>