x86, CPA: Change idmap attribute before ioremap attribute setup
Change the identity mapping with the requested attribute first, before we setup the virtual memory mapping with the new requested attribute. This makes sure that there is no window when identity map'ed attribute may disagree with ioremap range on the attribute type. This also avoids doing cpa on the ioremap'ed address twice (first in ioremap_page_range and then in ioremap_change_attr using vaddr), and should improve ioremap performance a bit. Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> LKML-Reference: <20090409212708.373330000@intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Родитель
a0d22f485a
Коммит
43a432b155
|
@ -280,15 +280,16 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr,
|
||||||
return NULL;
|
return NULL;
|
||||||
area->phys_addr = phys_addr;
|
area->phys_addr = phys_addr;
|
||||||
vaddr = (unsigned long) area->addr;
|
vaddr = (unsigned long) area->addr;
|
||||||
if (ioremap_page_range(vaddr, vaddr + size, phys_addr, prot)) {
|
|
||||||
|
if (kernel_map_sync_memtype(phys_addr, size, prot_val)) {
|
||||||
free_memtype(phys_addr, phys_addr + size);
|
free_memtype(phys_addr, phys_addr + size);
|
||||||
free_vm_area(area);
|
free_vm_area(area);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ioremap_change_attr(vaddr, size, prot_val) < 0) {
|
if (ioremap_page_range(vaddr, vaddr + size, phys_addr, prot)) {
|
||||||
free_memtype(phys_addr, phys_addr + size);
|
free_memtype(phys_addr, phys_addr + size);
|
||||||
vunmap(area->addr);
|
free_vm_area(area);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче