On Fri, Jul 23, 2010 at 09:23:01AM +0200, Ingo Molnar wrote:
Agree. I am looking for the right set of abstractions for this.
No. Unfortunately the function __acpi_map_tables() is not called on the
path that does the permanent mappings. The code is (somewhat simplified):
drivers/acpi/osl.c:
acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
{
if (acpi_gbl_permanent_mmap)
return ioremap((unsigned long)phys, size);
else
return __acpi_map_table((unsigned long)phys, size);
}
Early in boot before "acpi_gbl_permanent_mmap" is set, __acpi_map_table()
is called to map tables. __acpi_map_table() calls early_iomap() and all
early mappings are subsequently unmapped.
For the permanent mappings, we need a way to make the acpi code call
ioremap_cache() instead of ioremap() for all tables that are actually
in WB memory.
Timings made during boot show only a small benefit __acpi_map_table()
mapping tables cacheable. (I didn't check, but perhaps the early mapping
are only checking table IDs - not the full table).
The performance benefit of WB is for the permanent mapping made after
acpi_gbl_permanent_mmap is set. For some reason, most of the time
consuming references occur after this point. In addition ALL offnode
references occur after this point.
--- jack
--