Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/mm: Honour passed pgprot in track_pfn_insert() and track_pfn_remap()

track_pfn_insert() overwrites the pgprot that is passed in with a value
based on the VMA's page_prot. This is a problem for people trying to
do clever things with the new vm_insert_pfn_prot() as it will simply
overwrite the passed protection flags. If we use the current value of
the pgprot as the base, then it will behave as people are expecting.

Also fix track_pfn_remap() in the same way.

Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
Acked-by: Andy Lutomirski <luto@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Kees Cook <keescook@chromium.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-mm@kvack.org
Link: http://lkml.kernel.org/r/1453742717-10326-2-git-send-email-matthew.r.wilcox@intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>

authored by

Matthew Wilcox and committed by
Ingo Molnar
dd7b6847 8dd5032d

+2 -2
+2 -2
arch/x86/mm/pat.c
··· 943 943 return -EINVAL; 944 944 } 945 945 946 - *prot = __pgprot((pgprot_val(vma->vm_page_prot) & (~_PAGE_CACHE_MASK)) | 946 + *prot = __pgprot((pgprot_val(*prot) & (~_PAGE_CACHE_MASK)) | 947 947 cachemode2protval(pcm)); 948 948 949 949 return 0; ··· 959 959 960 960 /* Set prot based on lookup */ 961 961 pcm = lookup_memtype(pfn_t_to_phys(pfn)); 962 - *prot = __pgprot((pgprot_val(vma->vm_page_prot) & (~_PAGE_CACHE_MASK)) | 962 + *prot = __pgprot((pgprot_val(*prot) & (~_PAGE_CACHE_MASK)) | 963 963 cachemode2protval(pcm)); 964 964 965 965 return 0;