mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-11 16:29:05 +00:00
x86, pat: Sanity check remap_pfn_range for RAM region
Add sanity check for remap_pfn_range of RAM regions using lookup_memtype(). Previously, we did not have anyway to get the type of RAM memory regions as they were tracked using a single bit in page_struct (WB, nonWB). Now we can get the actual type from page struct (WB, WC, UC_MINUS) and make sure the requester gets that type. Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
1087637616
commit
d886c73cd4
@ -783,11 +783,29 @@ static int reserve_pfn_range(u64 paddr, unsigned long size, pgprot_t *vma_prot,
|
|||||||
is_ram = pat_pagerange_is_ram(paddr, paddr + size);
|
is_ram = pat_pagerange_is_ram(paddr, paddr + size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* reserve_pfn_range() doesn't support RAM pages. Maintain the current
|
* reserve_pfn_range() for RAM pages. We do not refcount to keep
|
||||||
* behavior with RAM pages by returning success.
|
* track of number of mappings of RAM pages. We can assert that
|
||||||
|
* the type requested matches the type of first page in the range.
|
||||||
*/
|
*/
|
||||||
if (is_ram != 0)
|
if (is_ram) {
|
||||||
|
if (!pat_enabled)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
flags = lookup_memtype(paddr);
|
||||||
|
if (want_flags != flags) {
|
||||||
|
printk(KERN_WARNING
|
||||||
|
"%s:%d map pfn RAM range req %s for %Lx-%Lx, got %s\n",
|
||||||
|
current->comm, current->pid,
|
||||||
|
cattr_name(want_flags),
|
||||||
|
(unsigned long long)paddr,
|
||||||
|
(unsigned long long)(paddr + size),
|
||||||
|
cattr_name(flags));
|
||||||
|
*vma_prot = __pgprot((pgprot_val(*vma_prot) &
|
||||||
|
(~_PAGE_CACHE_MASK)) |
|
||||||
|
flags);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
ret = reserve_memtype(paddr, paddr + size, want_flags, &flags);
|
ret = reserve_memtype(paddr, paddr + size, want_flags, &flags);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user