Commit 5ee1af9f authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds

[PATCH] block: disable block layer bouncing for most memory on 64bit systems

The low level PCI DMA mapping functions should handle it in most cases.

This should fix problems with depleting the DMA zone early. The old
code used precious GFP_DMA memory in many cases where it was not needed.
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Cc: Jens Axboe <axboe@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent f9262c12
...@@ -625,26 +625,31 @@ static inline int ordered_bio_endio(struct request *rq, struct bio *bio, ...@@ -625,26 +625,31 @@ static inline int ordered_bio_endio(struct request *rq, struct bio *bio,
* Different hardware can have different requirements as to what pages * Different hardware can have different requirements as to what pages
* it can do I/O directly to. A low level driver can call * it can do I/O directly to. A low level driver can call
* blk_queue_bounce_limit to have lower memory pages allocated as bounce * blk_queue_bounce_limit to have lower memory pages allocated as bounce
* buffers for doing I/O to pages residing above @page. By default * buffers for doing I/O to pages residing above @page.
* the block layer sets this to the highest numbered "low" memory page.
**/ **/
void blk_queue_bounce_limit(request_queue_t *q, u64 dma_addr) void blk_queue_bounce_limit(request_queue_t *q, u64 dma_addr)
{ {
unsigned long bounce_pfn = dma_addr >> PAGE_SHIFT; unsigned long bounce_pfn = dma_addr >> PAGE_SHIFT;
int dma = 0;
/* q->bounce_gfp = GFP_NOIO;
* set appropriate bounce gfp mask -- unfortunately we don't have a #if BITS_PER_LONG == 64
* full 4GB zone, so we have to resort to low memory for any bounces. /* Assume anything <= 4GB can be handled by IOMMU.
* ISA has its own < 16MB zone. Actually some IOMMUs can handle everything, but I don't
*/ know of a way to test this here. */
if (bounce_pfn < blk_max_low_pfn) { if (bounce_pfn < (0xffffffff>>PAGE_SHIFT))
BUG_ON(dma_addr < BLK_BOUNCE_ISA); dma = 1;
q->bounce_pfn = max_low_pfn;
#else
if (bounce_pfn < blk_max_low_pfn)
dma = 1;
q->bounce_pfn = bounce_pfn;
#endif
if (dma) {
init_emergency_isa_pool(); init_emergency_isa_pool();
q->bounce_gfp = GFP_NOIO | GFP_DMA; q->bounce_gfp = GFP_NOIO | GFP_DMA;
} else
q->bounce_gfp = GFP_NOIO;
q->bounce_pfn = bounce_pfn; q->bounce_pfn = bounce_pfn;
}
} }
EXPORT_SYMBOL(blk_queue_bounce_limit); EXPORT_SYMBOL(blk_queue_bounce_limit);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment