Example usage of contig pages.

Signed-off-by: Yishai Hadas <yish...@mellanox.com>
---
 examples/rc_pingpong.c | 47 ++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 36 insertions(+), 11 deletions(-)

diff --git a/examples/rc_pingpong.c b/examples/rc_pingpong.c
index 90a8320..ca8e16f 100644
--- a/examples/rc_pingpong.c
+++ b/examples/rc_pingpong.c
@@ -56,6 +56,7 @@ enum {
 
 static int page_size;
 static int use_odp;
+static int use_contiguous_mr;
 
 struct pingpong_context {
        struct ibv_context      *context;
@@ -326,15 +327,14 @@ static struct pingpong_context *pp_init_ctx(struct 
ibv_device *ib_dev, int size,
        ctx->send_flags = IBV_SEND_SIGNALED;
        ctx->rx_depth   = rx_depth;
 
-       ctx->buf = memalign(page_size, size);
-       if (!ctx->buf) {
-               fprintf(stderr, "Couldn't allocate work buf.\n");
-               goto clean_ctx;
+       if (!use_contiguous_mr) {
+               ctx->buf = memalign(page_size, size);
+               if (!ctx->buf) {
+                       fprintf(stderr, "Couldn't allocate work buf.\n");
+                       goto clean_ctx;
+               }
        }
 
-       /* FIXME memset(ctx->buf, 0, size); */
-       memset(ctx->buf, 0x7b, size);
-
        ctx->context = ibv_open_device(ib_dev);
        if (!ctx->context) {
                fprintf(stderr, "Couldn't get context for %s\n",
@@ -374,13 +374,24 @@ static struct pingpong_context *pp_init_ctx(struct 
ibv_device *ib_dev, int size,
                }
                access_flags |= IBV_ACCESS_ON_DEMAND;
        }
-       ctx->mr = ibv_reg_mr(ctx->pd, ctx->buf, size, access_flags);
+
+       if (use_contiguous_mr)
+               ctx->mr = ibv_reg_mr(ctx->pd, NULL, size,
+                               IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_ALLOC_MR);
+       else
+               ctx->mr = ibv_reg_mr(ctx->pd, ctx->buf, size, access_flags);
 
        if (!ctx->mr) {
                fprintf(stderr, "Couldn't register MR\n");
                goto clean_pd;
        }
 
+       if (use_contiguous_mr)
+               ctx->buf = ctx->mr->addr;
+
+       /* FIXME memset(ctx->buf, 0, size); */
+       memset(ctx->buf, 0x7b, size);
+
        ctx->cq = ibv_create_cq(ctx->context, rx_depth + 1, NULL,
                                ctx->channel, 0);
        if (!ctx->cq) {
@@ -454,7 +465,8 @@ clean_device:
        ibv_close_device(ctx->context);
 
 clean_buffer:
-       free(ctx->buf);
+       if (!use_contiguous_mr)
+               free(ctx->buf);
 
 clean_ctx:
        free(ctx);
@@ -496,7 +508,9 @@ int pp_close_ctx(struct pingpong_context *ctx)
                return 1;
        }
 
-       free(ctx->buf);
+       if (!use_contiguous_mr)
+               free(ctx->buf);
+
        free(ctx);
 
        return 0;
@@ -561,6 +575,7 @@ static void usage(const char *argv0)
        printf("  -e, --events           sleep on CQ events (default poll)\n");
        printf("  -g, --gid-idx=<gid index> local port gid index\n");
        printf("  -o, --odp                 use on demand paging\n");
+       printf("  -c, --contiguous-mr    use contiguous mr\n");
 }
 
 int main(int argc, char *argv[])
@@ -604,10 +619,11 @@ int main(int argc, char *argv[])
                        { .name = "events",   .has_arg = 0, .val = 'e' },
                        { .name = "gid-idx",  .has_arg = 1, .val = 'g' },
                        { .name = "odp",      .has_arg = 0, .val = 'o' },
+                       { .name = "contiguous-mr", .has_arg = 0, .val = 'c' },
                        { 0 }
                };
 
-               c = getopt_long(argc, argv, "p:d:i:s:m:r:n:l:eg:o",
+               c = getopt_long(argc, argv, "p:d:i:s:m:r:n:l:eg:oc",
                                                        long_options, NULL);
 
                if (c == -1)
@@ -670,6 +686,10 @@ int main(int argc, char *argv[])
                        use_odp = 1;
                        break;
 
+               case 'c':
+                       ++use_contiguous_mr;
+                       break;
+
                default:
                        usage(argv[0]);
                        return 1;
@@ -683,6 +703,11 @@ int main(int argc, char *argv[])
                return 1;
        }
 
+       if (use_contiguous_mr && use_odp) {
+               fprintf(stderr, "contiguous mr should not be used with ODP\n");
+               return 1;
+       }
+
        page_size = sysconf(_SC_PAGESIZE);
 
        dev_list = ibv_get_device_list(NULL);
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to