Re: query regarding 'map_user_kiobuf'

David Woodhouse (dwmw2@infradead.org)
Tue, 29 May 2001 20:28:17 +0100


mdaljeet@in.ibm.com said:
> After using the 'map_user_kiobuf', I observed the followiing:
>
> 1. 'kiobuf->maplist[0]->virtual' contains a different virtual address than
> the user space buffer address
> 2. But these two addresses are mapped as when i write something using the
> address 'kiobuf->maplist[0]->virtual' inside the kernel, I see the same
> data in the user space buffer in my application.
> 3. I use the 'virt_to_phys' operation to the virtual address
> 'kiobuf->maplist[0]->virtual' to get the physical address.
> 4. I use this physical address for DMA operations.
>
> Now, using this information I do a DMA from card to system memory. What I
> have noticed is that DMA happens somewhere else in the system memory. I am
> not able to execute most of the commands (ls, chmod, cat, clear etc) after
> my user program exits.
>
> Am I doing the steps 3 and 4 above right?

After calling map_user_kiobuf(), I believe you should be locking the pages
in memory by calling lock_kiovec(). Otherwise, nothing prevents them from
being paged out again.

Also, the pages may be in high memory and not directly accessible. You should
use kmap() before touching them from the kernel rather than just using
page->virtual, and obviously kunmap() afterwards.

The PCI DMA interface is more complex than simply using virt_to_phys() too,
if you want to deal correctly with the highmem case. I'm sure others will
give you the details or pointers to the documentation.

--
dwmw2

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