]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
IB/mlx5: Use fragmented SRQ's buffer for in-kernel users
authorGuy Levi <guyle@mellanox.com>
Mon, 26 Nov 2018 06:15:39 +0000 (08:15 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Fri, 30 Nov 2018 00:12:13 +0000 (17:12 -0700)
The current implementation of create SRQ requires contiguous memory, such
a requirement is problematic once the memory is fragmented or the system
is low in memory, it causes failures in dma_zalloc_coherent().

This patch takes the advantage of the new mlx5_core API which allocates a
fragmented buffer, and makes the SRQ creation much more resilient to
memory fragmentation. Data-path code was adapted to the fact that WQEs can
cross buffers.

Signed-off-by: Guy Levi <guyle@mellanox.com>
Reviewed-by: Majd Dibbiny <majd@mellanox.com>
Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/hw/mlx5/srq.c

index a2b35a1a5031e7c31594c3e2ab9bde5d6d74c52f..caed1fe76102ddd16808bac81cfebb89c5c6d79e 100644 (file)
@@ -523,6 +523,7 @@ struct mlx5_ib_srq {
        struct mlx5_core_srq    msrq;
        struct mlx5_frag_buf    buf;
        struct mlx5_db          db;
+       struct mlx5_frag_buf_ctrl fbc;
        u64                    *wrid;
        /* protect SRQ hanlding
         */
index d012e7dbcc38150053a5fc71fca8f41f3ea5421f..cc8273d0f66ab920b5378b835a1d1e7cddce4c2f 100644 (file)
@@ -44,7 +44,7 @@ static int srq_signature;
 
 static void *get_wqe(struct mlx5_ib_srq *srq, int n)
 {
-       return mlx5_buf_offset(&srq->buf, n << srq->msrq.wqe_shift);
+       return mlx5_frag_buf_get_wqe(&srq->fbc, n);
 }
 
 static void mlx5_ib_srq_event(struct mlx5_core_srq *srq, enum mlx5_event type)
@@ -173,12 +173,16 @@ static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,
                return err;
        }
 
-       if (mlx5_buf_alloc(dev->mdev, buf_size, &srq->buf)) {
+       if (mlx5_frag_buf_alloc_node(dev->mdev, buf_size, &srq->buf,
+                                    dev->mdev->priv.numa_node)) {
                mlx5_ib_dbg(dev, "buf alloc failed\n");
                err = -ENOMEM;
                goto err_db;
        }
 
+       mlx5_init_fbc(srq->buf.frags, srq->msrq.wqe_shift, ilog2(srq->msrq.max),
+                     &srq->fbc);
+
        srq->head    = 0;
        srq->tail    = srq->msrq.max - 1;
        srq->wqe_ctr = 0;
@@ -195,7 +199,7 @@ static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,
                err = -ENOMEM;
                goto err_buf;
        }
-       mlx5_fill_page_array(&srq->buf, in->pas);
+       mlx5_fill_page_frag_array(&srq->buf, in->pas);
 
        srq->wrid = kvmalloc_array(srq->msrq.max, sizeof(u64), GFP_KERNEL);
        if (!srq->wrid) {
@@ -215,7 +219,7 @@ static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,
        kvfree(in->pas);
 
 err_buf:
-       mlx5_buf_free(dev->mdev, &srq->buf);
+       mlx5_frag_buf_free(dev->mdev, &srq->buf);
 
 err_db:
        mlx5_db_free(dev->mdev, &srq->db);
@@ -232,7 +236,7 @@ static void destroy_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq)
 static void destroy_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq)
 {
        kvfree(srq->wrid);
-       mlx5_buf_free(dev->mdev, &srq->buf);
+       mlx5_frag_buf_free(dev->mdev, &srq->buf);
        mlx5_db_free(dev->mdev, &srq->db);
 }