Re: kernel mmap() and friends.

From: Robert Hancock
Date: Tue Mar 08 2005 - 21:04:33 EST

linux-os wrote:

> If one uses x = __get_dma_pages(GFP_KERNEL, nr), finds the physical
> address with b = virt_to_bus(x), then attempts to mmap(,,b,,,) the result
> _does_not_fail_, yet the user ends up with memory ...somewhere....
> that is R/W able and WRONG.

I don't think virt_to_bus is the correct function to be using for this translation (or pretty much anything, these days). What is this memory that you are attempting to do an mmap on, and where is this code going? Unless this is an ISA device and you need physical memory for DMA, __get_dma_pages is not correct either.

> Yet, if the code executes SetPageReserved(virt_to_page(x)), the
> mmap() works and the user gets the CORRECT page(s).
> I think that if mmap() needs a physical buffer to be reserved
> then that's fine. However, silently returning some different
> buffer is a BUG.
> Is anyone aware of this BUG? Does anybody else care?

The kernel isn't responsible for checking that the memory ranges you attempt to remap are what you intended - if you get this wrong, things can blow up, that's just the way it is.

I would suggest following some similar driver/code in the kernel as an example if possible..

Robert Hancock Saskatoon, SK, Canada
Home Page:

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at
Please read the FAQ at