Messages in this thread Patch in this message | | | Date | Wed, 14 Jan 2009 10:48:34 -0800 | From | Suresh Siddha <> | Subject | [patch] x86, pat: fix free_memtype() for legacy 1MB range |
| |
commit 0e95c190cf1b4adbf1fc67decff3f2bb20158ba8 in tip tree is n't complete, as we left out adding similar logic to free_memtype().
Appended is the delta patch against tip.
thanks, suresh ---
[patch] x86, pat: fix free_memtype() for legacy 1MB range
Starting this commit:
> commit 0e95c190cf1b4adbf1fc67decff3f2bb20158ba8 > Author: Suresh Siddha <suresh.b.siddha@intel.com> > Date: Fri Jan 9 14:35:20 2009 -0800 > > x86, pat: fix reserve_memtype() for legacy 1MB range
Attribute requests with in this 1MB region are tracked in reserve_memtype() using linear linked list (and don't bother if the range is RAM or non-RAM or mixed).
free_memtype() also needs to follow similar logic.
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> Cc: stable@kernel.org ---
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index ec8cd49..3be3990 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c @@ -446,11 +446,19 @@ int free_memtype(u64 start, u64 end) if (is_ISA_range(start, end - 1)) return 0; - is_range_ram = pagerange_is_ram(start, end); - if (is_range_ram == 1) - return free_ram_pages_type(start, end); - else if (is_range_ram < 0) - return -EINVAL; + /* + * For legacy reasons, some parts of the physical address range in the + * legacy 1MB region is treated as non-RAM (even when listed as RAM in + * the e820 tables). So we will track the memory attributes of this + * legacy 1MB region using the linear memtype_list always. + */ + if (end >= ISA_END_ADDRESS) { + is_range_ram = pagerange_is_ram(start, end); + if (is_range_ram == 1) + return free_ram_pages_type(start, end); + else if (is_range_ram < 0) + return -EINVAL; + } spin_lock(&memtype_lock); list_for_each_entry(entry, &memtype_list, nd) {
| |