Skip to content
  • Mike Travis's avatar
    x86: optimize resource lookups for ioremap · 67cf13ce
    Mike Travis authored
    
    
    We have a large university system in the UK that is experiencing very long
    delays modprobing the driver for a specific I/O device.  The delay is from
    8-10 minutes per device and there are 31 devices in the system.  This 4 to
    5 hour delay in starting up those I/O devices is very much a burden on the
    customer.
    
    There are two causes for requiring a restart/reload of the drivers.  First
    is periodic preventive maintenance (PM) and the second is if any of the
    devices experience a fatal error.  Both of these trigger this excessively
    long delay in bringing the system back up to full capability.
    
    The problem was tracked down to a very slow IOREMAP operation and the
    excessively long ioresource lookup to insure that the user is not
    attempting to ioremap RAM.  These patches provide a speed up to that
    function.
    
    The modprobe time appears to be affected quite a bit by previous activity
    on the ioresource list, which I suspect is due to cache preloading.  While
    the overall improvement is impacted by other overhead of starting the
    devices, this drastically improves the modprobe time.
    
    Also our system is considerably smaller so the percentages gained will not
    be the same.  Best case improvement with the modprobe on our 20 device
    smallish system was from 'real 5m51.913s' to 'real 0m18.275s'.
    
    This patch (of 2):
    
    Since the ioremap operation is verifying that the specified address range
    is NOT RAM, it will search the entire ioresource list if the condition is
    true.  To make matters worse, it does this one 4k page at a time.  For a
    128M BAR region this is 32 passes to determine the entire region does not
    contain any RAM addresses.
    
    This patch provides another resource lookup function, region_is_ram, that
    searches for the entire region specified, verifying that it is completely
    contained within the resource region.  If it is found, then it is checked
    to be RAM or not, within a single pass.
    
    The return result reflects if it was found or not (-1), and whether it is
    RAM (1) or not (0).  This allows the caller to fallback to the previous
    page by page search if it was not found.
    
    [akpm@linux-foundation.org: fix spellos and typos in comment]
    Signed-off-by: default avatarMike Travis <travis@sgi.com>
    Acked-by: default avatarAlex Thorlton <athorlton@sgi.com>
    Reviewed-by: default avatarCliff Wickman <cpw@sgi.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Mark Salter <msalter@redhat.com>
    Cc: Dave Young <dyoung@redhat.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    67cf13ce