linux/mm
Vasily Tarasov f772b3d9ca block: blk_max_pfn is somtimes wrong
There is a small problem in handling page bounce.

At the moment blk_max_pfn equals max_pfn, which is in fact not maximum
possible _number_ of a page frame, but the _amount_ of page frames.  For
example for the 32bit x86 node with 4Gb RAM, max_pfn = 0x100000, but not
0xFFFF.

request_queue structure has a member q->bounce_pfn and queue needs bounce
pages for the pages _above_ this limit.  This routine is handled by
blk_queue_bounce(), where the following check is produced:

	if (q->bounce_pfn >= blk_max_pfn)
		return;

Assume, that a driver has set q->bounce_pfn to 0xFFFF, but blk_max_pfn
equals 0x10000.  In such situation the check above fails and for each bio
we always fall down for iterating over pages tied to the bio.

I want to notice, that for quite a big range of device drivers (ide, md,
...) such problem doesn't happen because they use BLK_BOUNCE_ANY for
bounce_pfn.  BLK_BOUNCE_ANY is defined as blk_max_pfn << PAGE_SHIFT, and
then the check above doesn't fail.  But for other drivers, which obtain
reuired value from drivers, it fails.  For example sata_nv uses
ATA_DMA_MASK or dev->dma_mask.

I propose to use (max_pfn - 1) for blk_max_pfn.  And the same for
blk_max_low_pfn.  The patch also cleanses some checks related with
bounce_pfn.

Signed-off-by: Vasily Tarasov <vtaras@openvz.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
2007-03-27 08:52:47 +02:00
..
allocpercpu.c
backing-dev.c [PATCH] nfs: fix congestion control 2007-03-16 19:25:05 -07:00
bootmem.c
bounce.c block: blk_max_pfn is somtimes wrong 2007-03-27 08:52:47 +02:00
fadvise.c
filemap_xip.c
filemap.c [PATCH] dio: invalidate clean pages before dio write 2007-03-16 19:25:04 -07:00
filemap.h
fremap.c
highmem.c
hugetlb.c
internal.h
Kconfig [PATCH] Set CONFIG_ZONE_DMA for arches with GENERIC_ISA_DMA 2007-02-11 10:51:19 -08:00
madvise.c [PATCH] mm: fix madvise infinine loop 2007-03-16 19:25:04 -07:00
Makefile
memory_hotplug.c
memory.c [PATCH] Add NOPFN_REFAULT result from vm_ops->nopfn() 2007-02-12 09:48:27 -08:00
mempolicy.c [PATCH] Page migration: Fix vma flag checking 2007-03-05 07:57:51 -08:00
mempool.c [PATCH] Numerous fixes to kernel-doc info in source files. 2007-02-11 10:51:32 -08:00
migrate.c [PATCH] Page migration: Fix vma flag checking 2007-03-05 07:57:51 -08:00
mincore.c [PATCH] mincore: vma crossing fix 2007-02-15 09:57:03 -08:00
mlock.c
mmap.c [PATCH] Bug in MM_RB debugging 2007-03-01 14:53:38 -08:00
mmzone.c
mprotect.c
mremap.c
msync.c
nommu.c [PATCH] NOMMU: make SYSV SHM nattch work correctly 2007-03-22 19:39:06 -07:00
oom_kill.c [PATCH] oom fix: prevent oom from killing a process with children/sibling unkillable 2007-03-16 19:25:06 -07:00
page_alloc.c [PATCH] Rename PG_checked to PG_owner_priv_1 2007-03-01 14:53:37 -08:00
page_io.c
page-writeback.c [PATCH] throttle_vm_writeout(): don't loop on GFP_NOFS and GFP_NOIO allocations 2007-03-01 14:53:38 -08:00
pdflush.c
prio_tree.c
readahead.c
rmap.c [PATCH] adapt page_lock_anon_vma() to PREEMPT_RCU 2007-03-01 14:53:39 -08:00
shmem_acl.c
shmem.c [PATCH] shmem and simple const super_operations 2007-03-05 07:57:51 -08:00
slab.c [PATCH] kernel-doc fixes for 2.6.20-git15 (non-drivers) 2007-03-01 14:53:37 -08:00
slob.c
sparse.c
swap_state.c
swap.c
swapfile.c
thrash.c
tiny-shmem.c [PATCH] mm/{,tiny-}shmem.c cleanups 2007-03-01 14:53:35 -08:00
truncate.c [PATCH] VM: invalidate_inode_pages2_range() should not exit early 2007-03-01 14:53:39 -08:00
util.c
vmalloc.c [PATCH] Numerous fixes to kernel-doc info in source files. 2007-02-11 10:51:32 -08:00
vmscan.c [PATCH] throttle_vm_writeout(): don't loop on GFP_NOFS and GFP_NOIO allocations 2007-03-01 14:53:38 -08:00
vmstat.c [PATCH] optional ZONE_DMA: optional ZONE_DMA in the VM 2007-02-11 10:51:18 -08:00