lkml.org 
[lkml]   [2010]   [Aug]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [RFC] - Mapping ACPI tables as CACHED
On Fri, Jul 23, 2010 at 09:23:01AM +0200, Ingo Molnar wrote:
>
> * ykzhao <yakui.zhao@intel.com> wrote:
>
> > From the above description maybe the E820_ACPI region can be mapped as
> > cached. But this still depends on the BIOS. If the some shared data resides
> > in the E820_ACPI region on some BIOS, maybe we can't map the E820_ACPI
> > region as cached again.
>
> I dont think we can do this safely unless some other OS (Windows) does it as
> well. (the reason is that if some BIOS messes this up then it will cause nasty
> bugs/problems only on Linux.)
>
> But the benefits of caching are very clear and well measured by Jack, so we
> want the feature. What we can do is to add an exception for 'known good' hw
> vendors - i.e. something quite close to Jack's RFC patch, but implemented a
> bit more cleanly:
>
> Exposing x86_platform and e820 details to generic ACPI code isnt particularly
> clean - there should be an ACPI accessor function for that or so: a new
> acpi_table_can_be_cached(table) function or so.

Agree. I am looking for the right set of abstractions for this.


>
> In fact since __acpi_map_table(addr,size) is defined by architectures already,
> this could be done purely within x86 code.

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


\
 
 \ /
  Last update: 2010-08-17 16:45    [W:1.413 / U:0.000 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site