[PATCH] mm: add @gfp_mask parameter to vm_map_ram()

From: Fengguang Wu
Date: Wed Jun 13 2012 - 21:38:33 EST


XFS needs GFP_NOFS allocation.

Signed-off-by: Fengguang Wu <fengguang.wu@xxxxxxxxx>
---
drivers/firewire/ohci.c | 2 +-
drivers/media/video/videobuf2-dma-sg.c | 1 +
drivers/media/video/videobuf2-vmalloc.c | 2 +-
fs/xfs/xfs_buf.c | 2 +-
include/linux/vmalloc.h | 2 +-
mm/nommu.c | 3 ++-
mm/vmalloc.c | 7 ++++---
7 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c
index c1af05e..b53f5a9 100644
--- a/drivers/firewire/ohci.c
+++ b/drivers/firewire/ohci.c
@@ -1000,7 +1000,7 @@ static int ar_context_init(struct ar_context *ctx, struct fw_ohci *ohci,
for (i = 0; i < AR_WRAPAROUND_PAGES; i++)
pages[AR_BUFFERS + i] = ctx->pages[i];
ctx->buffer = vm_map_ram(pages, AR_BUFFERS + AR_WRAPAROUND_PAGES,
- -1, PAGE_KERNEL);
+ -1, GFP_KERNEL, PAGE_KERNEL);
if (!ctx->buffer)
goto out_of_memory;

diff --git a/drivers/media/video/videobuf2-dma-sg.c b/drivers/media/video/videobuf2-dma-sg.c
index 25c3b36..d087f52 100644
--- a/drivers/media/video/videobuf2-dma-sg.c
+++ b/drivers/media/video/videobuf2-dma-sg.c
@@ -209,6 +209,7 @@ static void *vb2_dma_sg_vaddr(void *buf_priv)
buf->vaddr = vm_map_ram(buf->pages,
buf->sg_desc.num_pages,
-1,
+ GFP_KERNEL,
PAGE_KERNEL);

/* add offset in case userptr is not page-aligned */
diff --git a/drivers/media/video/videobuf2-vmalloc.c b/drivers/media/video/videobuf2-vmalloc.c
index 6b5ca6c..548ebda 100644
--- a/drivers/media/video/videobuf2-vmalloc.c
+++ b/drivers/media/video/videobuf2-vmalloc.c
@@ -111,7 +111,7 @@ static void *vb2_vmalloc_get_userptr(void *alloc_ctx, unsigned long vaddr,
goto fail_get_user_pages;

buf->vaddr = vm_map_ram(buf->pages, buf->n_pages, -1,
- PAGE_KERNEL);
+ GFP_KERNEL, PAGE_KERNEL);
if (!buf->vaddr)
goto fail_get_user_pages;
}
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index 172d3cc..b3e7289 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -406,7 +406,7 @@ _xfs_buf_map_pages(

do {
bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count,
- -1, PAGE_KERNEL);
+ -1, GFP_NOFS, PAGE_KERNEL);
if (bp->b_addr)
break;
vm_unmap_aliases();
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h
index dcdfc2b..c811763 100644
--- a/include/linux/vmalloc.h
+++ b/include/linux/vmalloc.h
@@ -40,7 +40,7 @@ struct vm_struct {
*/
extern void vm_unmap_ram(const void *mem, unsigned int count);
extern void *vm_map_ram(struct page **pages, unsigned int count,
- int node, pgprot_t prot);
+ int node, gfp_t gfp_mask, pgprot_t prot);
extern void vm_unmap_aliases(void);

#ifdef CONFIG_MMU
diff --git a/mm/nommu.c b/mm/nommu.c
index d4b0c10..2fb4ec1 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -416,7 +416,8 @@ void vunmap(const void *addr)
}
EXPORT_SYMBOL(vunmap);

-void *vm_map_ram(struct page **pages, unsigned int count, int node, pgprot_t prot)
+void *vm_map_ram(struct page **pages, unsigned int count,
+ int node, gfp_t gfp_mask, pgprot_t prot)
{
BUG();
return NULL;
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 2aad499..3f736d1 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -1088,21 +1088,22 @@ EXPORT_SYMBOL(vm_unmap_ram);
*
* Returns: a pointer to the address that has been mapped, or %NULL on failure
*/
-void *vm_map_ram(struct page **pages, unsigned int count, int node, pgprot_t prot)
+void *vm_map_ram(struct page **pages, unsigned int count,
+ int node, gfp_t gfp_mask, pgprot_t prot)
{
unsigned long size = count << PAGE_SHIFT;
unsigned long addr;
void *mem;

if (likely(count <= VMAP_MAX_ALLOC)) {
- mem = vb_alloc(size, GFP_KERNEL);
+ mem = vb_alloc(size, gfp_mask);
if (IS_ERR(mem))
return NULL;
addr = (unsigned long)mem;
} else {
struct vmap_area *va;
va = alloc_vmap_area(size, PAGE_SIZE,
- VMALLOC_START, VMALLOC_END, node, GFP_KERNEL);
+ VMALLOC_START, VMALLOC_END, node, gfp_mask);
if (IS_ERR(va))
return NULL;

--
1.7.10

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/