Commit 2ef4f27a authored by Stefan Raspl's avatar Stefan Raspl Committed by David S. Miller

smc: allocate RMBs as compound pages

Preparatory work for splice() support.
Signed-off-by: default avatarStefan Raspl <raspl@linux.ibm.com>
Signed-off-by: Ursula Braun <ubraun@linux.ibm.com><
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b51fa1b1
...@@ -290,8 +290,8 @@ static void smc_buf_free(struct smc_buf_desc *buf_desc, struct smc_link *lnk, ...@@ -290,8 +290,8 @@ static void smc_buf_free(struct smc_buf_desc *buf_desc, struct smc_link *lnk,
DMA_TO_DEVICE); DMA_TO_DEVICE);
} }
sg_free_table(&buf_desc->sgt[SMC_SINGLE_LINK]); sg_free_table(&buf_desc->sgt[SMC_SINGLE_LINK]);
if (buf_desc->cpu_addr) if (buf_desc->pages)
free_pages((unsigned long)buf_desc->cpu_addr, buf_desc->order); __free_pages(buf_desc->pages, buf_desc->order);
kfree(buf_desc); kfree(buf_desc);
} }
...@@ -566,16 +566,16 @@ static struct smc_buf_desc *smc_new_buf_create(struct smc_link_group *lgr, ...@@ -566,16 +566,16 @@ static struct smc_buf_desc *smc_new_buf_create(struct smc_link_group *lgr,
if (!buf_desc) if (!buf_desc)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
buf_desc->cpu_addr = buf_desc->order = get_order(bufsize);
(void *)__get_free_pages(GFP_KERNEL | __GFP_NOWARN | buf_desc->pages = alloc_pages(GFP_KERNEL | __GFP_NOWARN |
__GFP_NOMEMALLOC | __GFP_NOMEMALLOC | __GFP_COMP |
__GFP_NORETRY | __GFP_ZERO, __GFP_NORETRY | __GFP_ZERO,
get_order(bufsize)); buf_desc->order);
if (!buf_desc->cpu_addr) { if (!buf_desc->pages) {
kfree(buf_desc); kfree(buf_desc);
return ERR_PTR(-EAGAIN); 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 */ /* build the sg table from the pages */
lnk = &lgr->lnk[SMC_SINGLE_LINK]; lnk = &lgr->lnk[SMC_SINGLE_LINK];
......
...@@ -120,6 +120,7 @@ struct smc_link { ...@@ -120,6 +120,7 @@ struct smc_link {
struct smc_buf_desc { struct smc_buf_desc {
struct list_head list; struct list_head list;
void *cpu_addr; /* virtual address of buffer */ void *cpu_addr; /* virtual address of buffer */
struct page *pages;
struct sg_table sgt[SMC_LINKS_PER_LGR_MAX];/* virtual buffer */ struct sg_table sgt[SMC_LINKS_PER_LGR_MAX];/* virtual buffer */
struct ib_mr *mr_rx[SMC_LINKS_PER_LGR_MAX]; struct ib_mr *mr_rx[SMC_LINKS_PER_LGR_MAX];
/* for rmb only: memory region /* for rmb only: memory region
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment