<br><tt><font size=2>Dave Hansen &lt;haveblue@us.ibm.com&gt; wrote on 15.02.2008
17:55:38:</font></tt>
<br>
<br><tt><font size=2>&gt; I've been thinking about that, and I don't think
you really *need* to</font></tt>
<br><tt><font size=2>&gt; keep a comprehensive map like that. &nbsp;</font></tt>
<br><tt><font size=2>&gt; </font></tt>
<br><tt><font size=2>&gt; When the memory is in a particular configuration
(range of memory</font></tt>
<br><tt><font size=2>&gt; present along with unique set of holes) you get
a unique ehea_bmap</font></tt>
<br><tt><font size=2>&gt; configuration. &nbsp;That layout is completely
predictable.</font></tt>
<br><tt><font size=2>&gt; </font></tt>
<br><tt><font size=2>&gt; So, if at any time you want to figure out what
the ehea_bmap address for</font></tt>
<br><tt><font size=2>&gt; a particular *Linux* virtual address is, you
just need to pretend that</font></tt>
<br><tt><font size=2>&gt; you're creating the entire ehea_bmap, use the
same algorithm and figure</font></tt>
<br><tt><font size=2>&gt; out host you would have placed things, and use
that result.</font></tt>
<br><tt><font size=2>&gt; </font></tt>
<br><tt><font size=2>&gt; Now, that's going to be a slow, crappy linear
search (but maybe not as</font></tt>
<br><tt><font size=2>&gt; slow as recreating the silly thing). &nbsp;So,
you might eventually run into</font></tt>
<br><tt><font size=2>&gt; some scalability problems with a lot of packets
going around. &nbsp;But, I'd</font></tt>
<br><tt><font size=2>&gt; be curious if you do in practice.</font></tt>
<br>
<br><tt><font size=2>Up to 14 addresses translation per packet (sg_list)
might be required on the</font></tt>
<br><tt><font size=2>transmit side. On receive side it is only 1. Most
packets require only very few</font></tt>
<br><tt><font size=2>translations (1 or sometimes more) &nbsp;translations.
However, with more then 700.000 </font></tt>
<br><tt><font size=2>packets per second this approach does not seem reasonable
from performance</font></tt>
<br><tt><font size=2>perspective when memory is fragmented as you described.</font></tt>
<br>
<br><tt><font size=2>&gt; </font></tt>
<br><tt><font size=2>&gt; The other idea is that you create a mapping that
is precisely 1:1 with</font></tt>
<br><tt><font size=2>&gt; kernel memory. &nbsp;Let's say you have two sections
present, 0 and 100. &nbsp;You</font></tt>
<br><tt><font size=2>&gt; have a high_section_index of 100, and you vmalloc()
a 100 entry array.</font></tt>
<br><tt><font size=2>&gt; </font></tt>
<br><tt><font size=2>&gt; You need to create a *CONTIGUOUS* ehea map? &nbsp;Create
one like this:</font></tt>
<br><tt><font size=2>&gt; </font></tt>
<br><tt><font size=2>&gt; EHEA_VADDR-&gt;Linux Section</font></tt>
<br><tt><font size=2>&gt; 0-&gt;0</font></tt>
<br><tt><font size=2>&gt; 1-&gt;0</font></tt>
<br><tt><font size=2>&gt; 2-&gt;0</font></tt>
<br><tt><font size=2>&gt; 3-&gt;0</font></tt>
<br><tt><font size=2>&gt; ...</font></tt>
<br><tt><font size=2>&gt; 100-&gt;100</font></tt>
<br><tt><font size=2>&gt; </font></tt>
<br><tt><font size=2>&gt; It's contiguous. &nbsp;Each area points to a
valid Linux memory address.</font></tt>
<br><tt><font size=2>&gt; It's also discernable in O(1) to what EHEA address
a given Linux address</font></tt>
<br><tt><font size=2>&gt; is mapped. &nbsp;You just have a couple of duplicate
entries. &nbsp;</font></tt>
<br>
<br><tt><font size=2>This has a serious issues with constraint I mentions
in the previous mail: </font></tt>
<br><tt><font size=2>&quot;- MRs can have a maximum size of the memory
available under linux&quot;</font></tt>
<br>
<br><tt><font size=2>The requirement is not met that the memory region
must not be </font></tt>
<br><tt><font size=2>larger then the available memory for that partition.
The &quot;create MR&quot; H_CALL</font></tt>
<br><tt><font size=2>will fails (we tried this and discussed with FW development)</font></tt>
<br>
<br>
<br><tt><font size=2>Regards,</font></tt>
<br><tt><font size=2>Jan-Bernd &amp; Christoph</font></tt>