Messages in this thread | | | Date | Fri, 27 Jan 2006 20:14:59 +0000 | From | Russell King <> | Subject | Re: How to map high memory for block io |
| |
On Fri, Jan 27, 2006 at 09:04:33PM +0100, Pierre Ossman wrote: > Russell King wrote: > > I don't see what the problem is. A sg entry is a list of struct page > > pointers, an offset, and a size. As such, it can't describe a transfer > > which crosses a page because such a structure does not imply that one > > struct page follows another struct page. > > If the pages do not strictly follow each other then there is a lot of > broken code in the kernel. drivers/mmc/mmci.c and drivers/block/ub.c > being two occurences since both assume they can access the entire entry > through a single mapping.
We don't make that assumption. What we do is:
- map the current sg using kmap_atomic() - copy up to sg->length into or out of that mapping - unmap current sg - if we have reached the end of this sg, move on to the next
What this means is that we assume sg->offset + sg->length <= PAGE_SIZE in all cases, which is the same assumption architecture DMA code makes. If that's invalid, there's likely to be a lot of architecture DMA support which is broken.
-- Russell King Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/ maintainer of: 2.6 Serial core - 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/
| |