aboutsummaryrefslogtreecommitdiffstats
path: root/mm/dmapool.c
diff options
context:
space:
mode:
authorMatthew Wilcox <matthew@wil.cx>2007-12-03 12:10:24 -0500
committerMatthew Wilcox <matthew@wil.cx>2007-12-04 10:39:56 -0500
commit399154be2dcb6a58dbde9682162c38113cf3e40b (patch)
treee8f18356056729ef104db151703018d72e9ca929 /mm/dmapool.c
parent2cae367e4854ff055c4f5e8aacd56b0eeec9f6cb (diff)
dmapool: Validate parameters to dma_pool_create
Check that 'align' is a power of two, like the API specifies. Align 'size' to 'align' correctly -- the current code has an off-by-one. The ALIGN macro in kernel.h doesn't. Signed-off-by: Matthew Wilcox <willy@linux.intel.com> Acked-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'mm/dmapool.c')
-rw-r--r--mm/dmapool.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/mm/dmapool.c b/mm/dmapool.c
index b5ff9ce8765..744d541df86 100644
--- a/mm/dmapool.c
+++ b/mm/dmapool.c
@@ -106,17 +106,18 @@ struct dma_pool *dma_pool_create(const char *name, struct device *dev,
106{ 106{
107 struct dma_pool *retval; 107 struct dma_pool *retval;
108 108
109 if (align == 0) 109 if (align == 0) {
110 align = 1; 110 align = 1;
111 if (size == 0) 111 } else if (align & (align - 1)) {
112 return NULL; 112 return NULL;
113 else if (size < align)
114 size = align;
115 else if ((size % align) != 0) {
116 size += align + 1;
117 size &= ~(align - 1);
118 } 113 }
119 114
115 if (size == 0)
116 return NULL;
117
118 if ((size % align) != 0)
119 size = ALIGN(size, align);
120
120 if (allocation == 0) { 121 if (allocation == 0) {
121 if (PAGE_SIZE < size) 122 if (PAGE_SIZE < size)
122 allocation = size; 123 allocation = size;