Skip to content

Commit d0b8616

Browse files
lrh2000gregkh
authored andcommitted
usb: usbfs: Use consistent mmap functions
When hcd->localmem_pool is non-null, localmem_pool is used to allocate DMA memory. In this case, the dma address will be properly returned (in dma_handle), and dma_mmap_coherent should be used to map this memory into the user space. However, the current implementation uses pfn_remap_range, which is supposed to map normal pages. Instead of repeating the logic in the memory allocation function, this patch introduces a more robust solution. Here, the type of allocated memory is checked by testing whether dma_handle is properly set. If dma_handle is properly returned, it means some DMA pages are allocated and dma_mmap_coherent should be used to map them. Otherwise, normal pages are allocated and pfn_remap_range should be called. This ensures that the correct mmap functions are used consistently, independently with logic details that determine which type of memory gets allocated. Fixes: a0e710a ("USB: usbfs: fix mmap dma mismatch") Cc: [email protected] Signed-off-by: Ruihan Li <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 0143d14 commit d0b8616

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

drivers/usb/core/devio.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ static int usbdev_mmap(struct file *file, struct vm_area_struct *vma)
235235
size_t size = vma->vm_end - vma->vm_start;
236236
void *mem;
237237
unsigned long flags;
238-
dma_addr_t dma_handle;
238+
dma_addr_t dma_handle = DMA_MAPPING_ERROR;
239239
int ret;
240240

241241
ret = usbfs_increase_memory_usage(size + sizeof(struct usb_memory));
@@ -265,7 +265,14 @@ static int usbdev_mmap(struct file *file, struct vm_area_struct *vma)
265265
usbm->vma_use_count = 1;
266266
INIT_LIST_HEAD(&usbm->memlist);
267267

268-
if (hcd->localmem_pool || !hcd_uses_dma(hcd)) {
268+
/*
269+
* In DMA-unavailable cases, hcd_buffer_alloc_pages allocates
270+
* normal pages and assigns DMA_MAPPING_ERROR to dma_handle. Check
271+
* whether we are in such cases, and then use remap_pfn_range (or
272+
* dma_mmap_coherent) to map normal (or DMA) pages into the user
273+
* space, respectively.
274+
*/
275+
if (dma_handle == DMA_MAPPING_ERROR) {
269276
if (remap_pfn_range(vma, vma->vm_start,
270277
virt_to_phys(usbm->mem) >> PAGE_SHIFT,
271278
size, vma->vm_page_prot) < 0) {

0 commit comments

Comments
 (0)