<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?  We had tried a similar approach but ran into subsequent errors and connection drops when the ib_post_send() failed.  The code assumes that the original init_qp_attr->cap.max_send_wr value
 succeeded.  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> </o:p></p>
<p class="MsoNormal">On Sun, Aug 31, 2014 at 2:53 AM, Eli Cohen <eli@dev.mellanox.co.il> wrote:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">> Lustre code tries to create a QP with max_send_wr which depends on a module<o:p></o:p></p>
<p class="MsoNormal">> parameter.  The device capabilities do provide the maximum number of send work<o:p></o:p></p>
<p class="MsoNormal">> requests that the device supports but the actual number of work requests that<o:p></o:p></p>
<p class="MsoNormal">> can be supported in a specific case depends on other characteristics of the<o:p></o:p></p>
<p class="MsoNormal">> work queue, the transport type, etc. This is in compliance with the IB spec:<o:p></o:p></p>
<p class="MsoNormal">> <o:p></o:p></p>
<p class="MsoNormal">> 11.2.1.2 QUERY HCA<o:p></o:p></p>
<p class="MsoNormal">> Description:<o:p></o:p></p>
<p class="MsoNormal">> Returns the attributes for the specified HCA.<o:p></o:p></p>
<p class="MsoNormal">> The maximum values defined in this section are guaranteed<o:p></o:p></p>
<p class="MsoNormal">> not-to-exceed values. It is possible for an implementation to allocate<o:p></o:p></p>
<p class="MsoNormal">> some HCA resources from the same space. In that case, the maximum<o:p></o:p></p>
<p class="MsoNormal">> values returned are not guaranteed for all of those resources<o:p></o:p></p>
<p class="MsoNormal">> simultaneously.<o:p></o:p></p>
<p class="MsoNormal">> <o:p></o:p></p>
<p class="MsoNormal">> This patch tries to decrease the number of requested work requests to a level<o:p></o:p></p>
<p class="MsoNormal">> that can be supported by the HCA. This prevents unnecessary failures.<o:p></o:p></p>
<p class="MsoNormal">> <o:p></o:p></p>
<p class="MsoNormal">> Signed-off-by: Eli Cohen <eli at mellanox.com><o:p></o:p></p>
<p class="MsoNormal">> ---<o:p></o:p></p>
<p class="MsoNormal">>  lnet/klnds/o2iblnd/o2iblnd.c | 25 ++++++++++++++++++-------<o:p></o:p></p>
<p class="MsoNormal">>  1 file changed, 18 insertions(+), 7 deletions(-)<o:p></o:p></p>
<p class="MsoNormal">> <o:p></o:p></p>
<p class="MsoNormal">> diff --git a/lnet/klnds/o2iblnd/o2iblnd.c b/lnet/klnds/o2iblnd/o2iblnd.c<o:p></o:p></p>
<p class="MsoNormal">> index 4061db00cba2..ef1c6e07cb45 100644<o:p></o:p></p>
<p class="MsoNormal">> --- a/lnet/klnds/o2iblnd/o2iblnd.c<o:p></o:p></p>
<p class="MsoNormal">> +++ b/lnet/klnds/o2iblnd/o2iblnd.c<o:p></o:p></p>
<p class="MsoNormal">> @@ -736,6 +736,7 @@ kiblnd_create_conn(kib_peer_t *peer, struct rdma_cm_id *cmid,<o:p></o:p></p>
<p class="MsoNormal">>       int                     cpt;<o:p></o:p></p>
<p class="MsoNormal">>       int                     rc;<o:p></o:p></p>
<p class="MsoNormal">>       int                     i;<o:p></o:p></p>
<p class="MsoNormal">> +     int                     orig_wr;<o:p></o:p></p>
<p class="MsoNormal">>  <o:p></o:p></p>
<p class="MsoNormal">>       LASSERT(net != NULL);<o:p></o:p></p>
<p class="MsoNormal">>       LASSERT(!in_interrupt());<o:p></o:p></p>
<p class="MsoNormal">> @@ -862,13 +863,23 @@ kiblnd_create_conn(kib_peer_t *peer, struct rdma_cm_id *cmid,<o:p></o:p></p>
<p class="MsoNormal">>  <o:p></o:p></p>
<p class="MsoNormal">>       conn->ibc_sched = sched;<o:p></o:p></p>
<p class="MsoNormal">>  <o:p></o:p></p>
<p class="MsoNormal">> -        rc = rdma_create_qp(cmid, conn->ibc_hdev->ibh_pd, init_qp_attr);<o:p></o:p></p>
<p class="MsoNormal">> -        if (rc != 0) {<o:p></o:p></p>
<p class="MsoNormal">> -                CERROR("Can't create QP: %d, send_wr: %d, recv_wr: %d\n",<o:p></o:p></p>
<p class="MsoNormal">> -                       rc, init_qp_attr->cap.max_send_wr,<o:p></o:p></p>
<p class="MsoNormal">> -                       init_qp_attr->cap.max_recv_wr);<o:p></o:p></p>
<p class="MsoNormal">> -                goto failed_2;<o:p></o:p></p>
<p class="MsoNormal">> -        }<o:p></o:p></p>
<p class="MsoNormal">> +     orig_wr = init_qp_attr->cap.max_send_wr;<o:p></o:p></p>
<p class="MsoNormal">> +     do {<o:p></o:p></p>
<p class="MsoNormal">> +             rc = rdma_create_qp(cmid, conn->ibc_hdev->ibh_pd, init_qp_attr);<o:p></o:p></p>
<p class="MsoNormal">> +             if (!rc || init_qp_attr->cap.max_send_wr < 16)<o:p></o:p></p>
<p class="MsoNormal">> +                     break;<o:p></o:p></p>
<p class="MsoNormal">> +<o:p></o:p></p>
<p class="MsoNormal">> +             init_qp_attr->cap.max_send_wr /= 2;<o:p></o:p></p>
<p class="MsoNormal">> +     } while (rc);<o:p></o:p></p>
<p class="MsoNormal">> +     if (rc != 0) {<o:p></o:p></p>
<p class="MsoNormal">> +             CERROR("Can't create QP: %d, send_wr: %d, recv_wr: %d\n",<o:p></o:p></p>
<p class="MsoNormal">> +                    rc, init_qp_attr->cap.max_send_wr,<o:p></o:p></p>
<p class="MsoNormal">> +                    init_qp_attr->cap.max_recv_wr);<o:p></o:p></p>
<p class="MsoNormal">> +             goto failed_2;<o:p></o:p></p>
<p class="MsoNormal">> +     }<o:p></o:p></p>
<p class="MsoNormal">> +     if (orig_wr != init_qp_attr->cap.max_send_wr)<o:p></o:p></p>
<p class="MsoNormal">> +             pr_info("original send wr %d, created with %d\n",<o:p></o:p></p>
<p class="MsoNormal">> +                     orig_wr, init_qp_attr->cap.max_send_wr);<o:p></o:p></p>
<p class="MsoNormal">>  <o:p></o:p></p>
<p class="MsoNormal">>          LIBCFS_FREE(init_qp_attr, sizeof(*init_qp_attr));<o:p></o:p></p>
<p class="MsoNormal">>  <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>