Re: Question: how to copy to user space from a tasklet

From: Tom Brown
Date: Mon Oct 18 2010 - 11:45:50 EST


On 15/10/2010 06:57, Stefan Richter wrote:

One way would be to use mmap() to allocate the DMA buffer and insert it into
the user address space before DMA commences. An additional poll/read/write
based protocol or so can be used for buffer management during DMA.

Thanks, think I'm there:

1 - The user calls mmap() with a specific offset to flag that he wants a DMA buffer

2 - I then 'vmalloc' the buffer, and call 'setPageReserved' for each page

I then step over each page, and:

3 - call 'vmalloc_to_pfn' to get a PFN for each page, and then

4 - call 'remap_page_range' for that page (I instead call 'remap_pfn_range' for kernels >= 2.6.10, but I'm on 2.6.9)

This gives me the buffer, and the interrupt handler then just uses 'memcpy' to copy data to the user.

I've got to say, this was incredibly hard work. I can't find any useful documentation and it can take a couple of hours on Google to write a few lines of code. LDD is next to useless. There's no 'vmalloc_to_pfn' on 2.6.9, so I copied an old deprecated one from 2.6.10 (which was also in a kernel prior to 2.6.9, I think). I'm not yet convinced that all this is working; I think I've seen one instance when the 'memcpy' to the buffer didn't work, so I think there might potentially be a problem with setting the reserved bit (and isn't the reserved bit deprecated in 2.6.15??)

On the other stuff, thanks Yong for the 'probe_kernel_' suggestion, but I can't find any documentation on it.

linux-newbie only had one thread on it for the entire month when I checked a couple of days ago, apart from a couple of 419 scams.

Thanks -

Tom
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/