vchiq_arm: Sort out the vmalloc case

See: https://github.com/raspberrypi/linux/issues/1055
This commit is contained in:
Phil Elwell
2015-07-14 11:11:51 +01:00
committed by popcornmix
parent c44ca0bd5a
commit 98ab473b54

View File

@@ -394,21 +394,21 @@ create_pagelist(char __user *buf, size_t count, unsigned short type,
if (is_vmalloc_addr(buf)) { if (is_vmalloc_addr(buf)) {
int dir = (type == PAGELIST_WRITE) ? int dir = (type == PAGELIST_WRITE) ?
DMA_TO_DEVICE : DMA_FROM_DEVICE; DMA_TO_DEVICE : DMA_FROM_DEVICE;
unsigned long length = pagelist->length; unsigned long length = count;
unsigned int offset = pagelist->offset; unsigned int off = offset;
for (actual_pages = 0; actual_pages < num_pages; for (actual_pages = 0; actual_pages < num_pages;
actual_pages++) { actual_pages++) {
struct page *pg = vmalloc_to_page(buf + (actual_pages * struct page *pg = vmalloc_to_page(buf + (actual_pages *
PAGE_SIZE)); PAGE_SIZE));
size_t bytes = PAGE_SIZE - offset; size_t bytes = PAGE_SIZE - off;
if (bytes > length) if (bytes > length)
bytes = length; bytes = length;
pages[actual_pages] = pg; pages[actual_pages] = pg;
dmac_map_area(page_address(pg) + offset, bytes, dir); dmac_map_area(page_address(pg) + off, bytes, dir);
length -= bytes; length -= bytes;
offset = 0; off = 0;
} }
*need_release = 0; /* do not try and release vmalloc pages */ *need_release = 0; /* do not try and release vmalloc pages */
} else { } else {