]> git.baikalelectronics.ru Git - kernel.git/commit
x86, ioremap: Speed up check for RAM pages
authorRoland Dreier <roland@purestorage.com>
Fri, 2 May 2014 18:18:41 +0000 (11:18 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Fri, 2 May 2014 18:52:26 +0000 (11:52 -0700)
commit4224512b2ecd893cccfa742330ea87af4e271789
treea7d9b726d541a287068225dbbb407612b26f8f12
parent8a7efecca8752544e9f6270342895ba5648edc94
x86, ioremap: Speed up check for RAM pages

In __ioremap_caller() (the guts of ioremap), we loop over the range of
pfns being remapped and checks each one individually with page_is_ram().
For large ioremaps, this can be very slow.  For example, we have a
device with a 256 GiB PCI BAR, and ioremapping this BAR can take 20+
seconds -- sometimes long enough to trigger the soft lockup detector!

Internally, page_is_ram() calls walk_system_ram_range() on a single
page.  Instead, we can make a single call to walk_system_ram_range()
from __ioremap_caller(), and do our further checks only for any RAM
pages that we find.  For the common case of MMIO, this saves an enormous
amount of work, since the range being ioremapped doesn't intersect
system RAM at all.

With this change, ioremap on our 256 GiB BAR takes less than 1 second.

Signed-off-by: Roland Dreier <roland@purestorage.com>
Link: http://lkml.kernel.org/r/1399054721-1331-1-git-send-email-roland@kernel.org
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
arch/x86/mm/ioremap.c