• Kevin VanMaren's avatar
    [PATCH] x86_64: When allocation of merged SG lists fails in the IOMMU don't merge · a1002a48
    Kevin VanMaren authored
    [ AK: I redid Kevin's fix to be simpler, but the idea and original
      analysis of the problem is from Kevin]
    
    This avoid allocation failures on some SATA systems like Nvidia CK8
    when the IOMMU gets fragmented. Modern SATA devices have quite large queues
    (128 entries) and the FS with ext2/3 is good enough now that it often
    passes whole 128 page sg lists down to the driver. These require
    512K of continuous free space in the IOMMU aperture to map when merged.
    When the IOMMU is fragmented this could lead to spurious IO errors
    due to failing mappings.
    
    Short term fix is to just try to map the SG list again unmerged
    page by page - this way fragmentation doesn't matter anymore.
    The code for that was already there, but it just wasn't enabled for the
    merge case.
    
    According to Kevin at least the Nvidia device doesn't seem to benefit
    from merging much anyways, so the only slowdown is from trying
    to do an unnecessary merge attempt.
    
    Kevin plans to implement better fragmentation avoidance in the future,
    but that wouldn't be 2.6.16 material.
    
    TBD: should add some statistic counters to count how often that really
    happens.
    Signed-off-by: default avatarAndi Kleen <ak@suse.de>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    a1002a48
pci-gart.c 19.5 KB