• Vasily Tarasov's avatar
    block: blk_max_pfn is somtimes wrong · f772b3d9
    Vasily Tarasov authored
    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: default avatarVasily Tarasov <vtaras@openvz.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
    f772b3d9
ll_rw_blk.c 102 KB