<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Has this been tested with a significant I/O load?&nbsp; We had tried a similar approach but ran into subsequent errors and connection drops when the ib_post_send() failed.&nbsp; The code assumes that the original init_qp_attr-&gt;cap.max_send_wr value
 succeeded.&nbsp; Is there a second part to this patch?<br>
<br>
<o:p></o:p></p>
<p class="MsoNormal">Dave<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal">On Sun, Aug 31, 2014 at 2:53 AM, Eli Cohen &lt;eli@dev.mellanox.co.il&gt; wrote:<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal">&gt; Lustre code tries to create a QP with max_send_wr which depends on a module<o:p></o:p></p>
<p class="MsoNormal">&gt; parameter.&nbsp; The device capabilities do provide the maximum number of send work<o:p></o:p></p>
<p class="MsoNormal">&gt; requests that the device supports but the actual number of work requests that<o:p></o:p></p>
<p class="MsoNormal">&gt; can be supported in a specific case depends on other characteristics of the<o:p></o:p></p>
<p class="MsoNormal">&gt; work queue, the transport type, etc. This is in compliance with the IB spec:<o:p></o:p></p>
<p class="MsoNormal">&gt; <o:p></o:p></p>
<p class="MsoNormal">&gt; 11.2.1.2 QUERY HCA<o:p></o:p></p>
<p class="MsoNormal">&gt; Description:<o:p></o:p></p>
<p class="MsoNormal">&gt; Returns the attributes for the specified HCA.<o:p></o:p></p>
<p class="MsoNormal">&gt; The maximum values defined in this section are guaranteed<o:p></o:p></p>
<p class="MsoNormal">&gt; not-to-exceed values. It is possible for an implementation to allocate<o:p></o:p></p>
<p class="MsoNormal">&gt; some HCA resources from the same space. In that case, the maximum<o:p></o:p></p>
<p class="MsoNormal">&gt; values returned are not guaranteed for all of those resources<o:p></o:p></p>
<p class="MsoNormal">&gt; simultaneously.<o:p></o:p></p>
<p class="MsoNormal">&gt; <o:p></o:p></p>
<p class="MsoNormal">&gt; This patch tries to decrease the number of requested work requests to a level<o:p></o:p></p>
<p class="MsoNormal">&gt; that can be supported by the HCA. This prevents unnecessary failures.<o:p></o:p></p>
<p class="MsoNormal">&gt; <o:p></o:p></p>
<p class="MsoNormal">&gt; Signed-off-by: Eli Cohen &lt;eli at mellanox.com&gt;<o:p></o:p></p>
<p class="MsoNormal">&gt; ---<o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp; lnet/klnds/o2iblnd/o2iblnd.c | 25 &#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;-------<o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp; 1 file changed, 18 insertions(&#43;), 7 deletions(-)<o:p></o:p></p>
<p class="MsoNormal">&gt; <o:p></o:p></p>
<p class="MsoNormal">&gt; diff --git a/lnet/klnds/o2iblnd/o2iblnd.c b/lnet/klnds/o2iblnd/o2iblnd.c<o:p></o:p></p>
<p class="MsoNormal">&gt; index 4061db00cba2..ef1c6e07cb45 100644<o:p></o:p></p>
<p class="MsoNormal">&gt; --- a/lnet/klnds/o2iblnd/o2iblnd.c<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&#43;&#43; b/lnet/klnds/o2iblnd/o2iblnd.c<o:p></o:p></p>
<p class="MsoNormal">&gt; @@ -736,6 &#43;736,7 @@ kiblnd_create_conn(kib_peer_t *peer, struct rdma_cm_id *cmid,<o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cpt;<o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rc;<o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i;<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; orig_wr;<o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp; <o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LASSERT(net != NULL);<o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LASSERT(!in_interrupt());<o:p></o:p></p>
<p class="MsoNormal">&gt; @@ -862,13 &#43;863,23 @@ kiblnd_create_conn(kib_peer_t *peer, struct rdma_cm_id *cmid,<o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp; <o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn-&gt;ibc_sched = sched;<o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp; <o:p></o:p></p>
<p class="MsoNormal">&gt; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rc = rdma_create_qp(cmid, conn-&gt;ibc_hdev-&gt;ibh_pd, init_qp_attr);<o:p></o:p></p>
<p class="MsoNormal">&gt; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rc != 0) {<o:p></o:p></p>
<p class="MsoNormal">&gt; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CERROR(&quot;Can't create QP: %d, send_wr: %d, recv_wr: %d\n&quot;,<o:p></o:p></p>
<p class="MsoNormal">&gt; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rc, init_qp_attr-&gt;cap.max_send_wr,<o:p></o:p></p>
<p class="MsoNormal">&gt; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init_qp_attr-&gt;cap.max_recv_wr);<o:p></o:p></p>
<p class="MsoNormal">&gt; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto failed_2;<o:p></o:p></p>
<p class="MsoNormal">&gt; -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; orig_wr = init_qp_attr-&gt;cap.max_send_wr;<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; do {<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rc = rdma_create_qp(cmid, conn-&gt;ibc_hdev-&gt;ibh_pd, init_qp_attr);<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!rc || init_qp_attr-&gt;cap.max_send_wr &lt; 16)<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init_qp_attr-&gt;cap.max_send_wr /= 2;<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; } while (rc);<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; if (rc != 0) {<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CERROR(&quot;Can't create QP: %d, send_wr: %d, recv_wr: %d\n&quot;,<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rc, init_qp_attr-&gt;cap.max_send_wr,<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init_qp_attr-&gt;cap.max_recv_wr);<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto failed_2;<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp; if (orig_wr != init_qp_attr-&gt;cap.max_send_wr)<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pr_info(&quot;original send wr %d, created with %d\n&quot;,<o:p></o:p></p>
<p class="MsoNormal">&gt; &#43;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; orig_wr, init_qp_attr-&gt;cap.max_send_wr);<o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp; <o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LIBCFS_FREE(init_qp_attr, sizeof(*init_qp_attr));<o:p></o:p></p>
<p class="MsoNormal">&gt;&nbsp; <o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
</body>
</html>