From 83c2279e6b03b040408c834438ab850788e60f09 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Tue, 6 Jan 2009 14:43:08 -0800 Subject: [PATCH] --- yaml --- r: 126417 b: refs/heads/master c: 0bef3c2dc7d0c8238330785c8f4504761b0e370b h: refs/heads/master i: 126415: 1e1056c79e13e0db822cc43dc65619db858dac1b v: v3 --- [refs] | 2 +- trunk/kernel/dma-coherent.c | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 4221530cd00b..e1481ecbb137 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8375d4909aee4c18798f373ecf24a79f040f75fc +refs/heads/master: 0bef3c2dc7d0c8238330785c8f4504761b0e370b diff --git a/trunk/kernel/dma-coherent.c b/trunk/kernel/dma-coherent.c index f013a0c2e111..4bdcea822b45 100644 --- a/trunk/kernel/dma-coherent.c +++ b/trunk/kernel/dma-coherent.c @@ -116,11 +116,25 @@ int dma_alloc_from_coherent(struct device *dev, ssize_t size, int page = bitmap_find_free_region(mem->bitmap, mem->size, order); if (page >= 0) { + /* + * Memory was found in the per-device arena. + */ *dma_handle = mem->device_base + (page << PAGE_SHIFT); *ret = mem->virt_base + (page << PAGE_SHIFT); memset(*ret, 0, size); - } else if (mem->flags & DMA_MEMORY_EXCLUSIVE) + } else if (mem->flags & DMA_MEMORY_EXCLUSIVE) { + /* + * The per-device arena is exhausted and we are not + * permitted to fall back to generic memory. + */ *ret = NULL; + } else { + /* + * The per-device arena is exhausted and we are + * permitted to fall back to generic memory. + */ + return 0; + } } return (mem != NULL); }