smc: allocate RMBs as compound pages
authorStefan Raspl <stefan.raspl@linux.ibm.com>
Thu, 3 May 2018 16:12:38 +0000 (18:12 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 4 May 2018 15:45:06 +0000 (11:45 -0400)
Preparatory work for splice() support.

Signed-off-by: Stefan Raspl <raspl@linux.ibm.com>
Signed-off-by: Ursula Braun <ubraun@linux.ibm.com><
Signed-off-by: David S. Miller <davem@davemloft.net>
net/smc/smc_core.c
net/smc/smc_core.h

index 79aa7d312d6bfb93524b5583f32552de4b5c570d..9c74844e20089c657654d166a79f5df296205d6f 100644 (file)
@@ -290,8 +290,8 @@ static void smc_buf_free(struct smc_buf_desc *buf_desc, struct smc_link *lnk,
                                    DMA_TO_DEVICE);
        }
        sg_free_table(&buf_desc->sgt[SMC_SINGLE_LINK]);
-       if (buf_desc->cpu_addr)
-               free_pages((unsigned long)buf_desc->cpu_addr, buf_desc->order);
+       if (buf_desc->pages)
+               __free_pages(buf_desc->pages, buf_desc->order);
        kfree(buf_desc);
 }
 
@@ -566,16 +566,16 @@ static struct smc_buf_desc *smc_new_buf_create(struct smc_link_group *lgr,
        if (!buf_desc)
                return ERR_PTR(-ENOMEM);
 
-       buf_desc->cpu_addr =
-               (void *)__get_free_pages(GFP_KERNEL | __GFP_NOWARN |
-                                        __GFP_NOMEMALLOC |
-                                        __GFP_NORETRY | __GFP_ZERO,
-                                        get_order(bufsize));
-       if (!buf_desc->cpu_addr) {
+       buf_desc->order = get_order(bufsize);
+       buf_desc->pages = alloc_pages(GFP_KERNEL | __GFP_NOWARN |
+                                     __GFP_NOMEMALLOC | __GFP_COMP |
+                                     __GFP_NORETRY | __GFP_ZERO,
+                                     buf_desc->order);
+       if (!buf_desc->pages) {
                kfree(buf_desc);
                return ERR_PTR(-EAGAIN);
        }
-       buf_desc->order = get_order(bufsize);
+       buf_desc->cpu_addr = (void *)page_address(buf_desc->pages);
 
        /* build the sg table from the pages */
        lnk = &lgr->lnk[SMC_SINGLE_LINK];
index 70ef4f47dc8da49b4b2bae0cdaef9326c62230e2..fca8624e5e71ba33fe72ba0e81c71a1daf92992a 100644 (file)
@@ -120,6 +120,7 @@ struct smc_link {
 struct smc_buf_desc {
        struct list_head        list;
        void                    *cpu_addr;      /* virtual address of buffer */
+       struct page             *pages;
        struct sg_table         sgt[SMC_LINKS_PER_LGR_MAX];/* virtual buffer */
        struct ib_mr            *mr_rx[SMC_LINKS_PER_LGR_MAX];
                                                /* for rmb only: memory region