Messages in this thread | | | Date | Fri, 27 Jan 2006 21:22:06 +0100 | From | Jens Axboe <> | Subject | Re: How to map high memory for block io |
| |
On Fri, Jan 27 2006, Russell King wrote: > 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.
That is definitely valid, same goes for the bio_vec structure. They map _a_ page, after all :-)
-- Jens Axboe
- 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/
| |