mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
vchiq_arm: Sort out the vmalloc case
See: https://github.com/raspberrypi/linux/issues/1055
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user