|
@@ -12,6 +12,7 @@
|
|
|
#include <linux/err.h>
|
|
|
#include <linux/cma.h>
|
|
|
#include <linux/scatterlist.h>
|
|
|
+#include <linux/highmem.h>
|
|
|
|
|
|
#include "ion.h"
|
|
|
|
|
@@ -42,6 +43,22 @@ static int ion_cma_allocate(struct ion_heap *heap, struct ion_buffer *buffer,
|
|
|
if (!pages)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
+ if (PageHighMem(pages)) {
|
|
|
+ unsigned long nr_clear_pages = nr_pages;
|
|
|
+ struct page *page = pages;
|
|
|
+
|
|
|
+ while (nr_clear_pages > 0) {
|
|
|
+ void *vaddr = kmap_atomic(page);
|
|
|
+
|
|
|
+ memset(vaddr, 0, PAGE_SIZE);
|
|
|
+ kunmap_atomic(vaddr);
|
|
|
+ page++;
|
|
|
+ nr_clear_pages--;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ memset(page_address(pages), 0, size);
|
|
|
+ }
|
|
|
+
|
|
|
table = kmalloc(sizeof(*table), GFP_KERNEL);
|
|
|
if (!table)
|
|
|
goto err;
|