> Supplying an ibv_qp_cap.max_inline_data value of 460 for mlx4_create_qp
 > was getting back ENOMEM when the max should have been 928. Tracked the bug
 > to the inline segment calculation. Here's the fix.

I don't see what's wrong with the current code, or why your change is
anything but a more obfuscated way of calculating the same thing.  And
indeed, I just adapted a quick test program (below) which tries to
create QPs with max_inline_data of 460, and I get the results:

  RC: inline 460 ok (got 928)
  UC: inline 460 ok (got 928)
  UD: inline 460 ok (got 900)

so it seems to work on my system.

 - R.

Here's the test code:

#include <stdio.h>
#include <string.h>

#include <infiniband/verbs.h>

int main(int argc, char *argv)
{
        struct ibv_device      **dev_list;
        struct ibv_device_attr   dev_attr;
        struct ibv_context      *context;
        struct ibv_pd           *pd;
        struct ibv_cq           *cq;
        struct ibv_qp_init_attr  qp_attr;
        int                      t;
        static const struct {
                enum ibv_qp_type type;
                char            *name;
        }                        type_tab[] = {
                { IBV_QPT_RC, "RC" },
                { IBV_QPT_UC, "UC" },
                { IBV_QPT_UD, "UD" },
        };

        dev_list = ibv_get_device_list(NULL);
        if (!dev_list) {
                printf("No IB devices found\n");
                return 1;
        }

        for (; *dev_list; ++dev_list) {
                printf("%s:\n", ibv_get_device_name(*dev_list));

                context = ibv_open_device(*dev_list);
                if (!context) {
                        printf("  ibv_open_device failed\n");
                        continue;
                }

                if (ibv_query_device(context, &dev_attr)) {
                        printf("  ibv_query_device failed\n");
                        continue;
                }

                cq = ibv_create_cq(context, 1, NULL, NULL, 0);
                if (!cq) {
                        printf("  ibv_create_cq failed\n");
                        continue;
                }

                pd = ibv_alloc_pd(context);
                if (!pd) {
                        printf("  ibv_alloc_pd failed\n");
                        continue;
                }

                for (t = 0; t < sizeof type_tab / sizeof type_tab[0]; ++t) {
                        memset(&qp_attr, 0, sizeof qp_attr);

                        qp_attr.send_cq = cq;
                        qp_attr.recv_cq = cq;
                        qp_attr.cap.max_send_wr = 1;
                        qp_attr.cap.max_recv_wr = 1;
                        qp_attr.cap.max_send_sge = 1;
                        qp_attr.cap.max_recv_sge = 1;
                        qp_attr.cap.max_inline_data = 460;
                        qp_attr.qp_type = type_tab[t].type;

                        printf("  %s: inline %d ", type_tab[t].name, 
qp_attr.cap.max_inline_data);

                        if (ibv_create_qp(pd, &qp_attr))
                                printf("ok (got %d)\n",
                                       qp_attr.cap.max_inline_data);
                        else
                                printf("FAILED\n");
                }
        }

        return 0;
}
_______________________________________________
general mailing list
general@lists.openfabrics.org
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to