Prev: [47/89] Fix race in tty_fasync() properly
Next: [21/89] page allocator: update NR_FREE_PAGES only when necessary
From: Greg KH on 30 Mar 2010 20:30 2.6.31-stable review patch. If anyone has any objections, please let us know. ------------------ From: Suresh Siddha <suresh.b.siddha(a)intel.com> commit 2992e545ea006992ec9dc91c4fa996ce1e15f921 upstream. Thomas Schlichter reported: > X.org uses libpciaccess which tries to mmap with write combining enabled via > /sys/bus/pci/devices/*/resource0_wc. Currently, when PAT is not enabled, the > kernel does fall back to uncached mmap. Then libpciaccess thinks it succeeded > mapping with write combining enabled and does not set up suited MTRR entries. > ;-( Instead of silently mapping pci mmap region as UC minus in the case of !pat_enabled and wc request, we can return error. Eric Anholt mentioned that caller (like X) typically follows up with UC minus pci mmap request and if there is a free mtrr slot, caller will manage adding WC mtrr. Jesse Barnes says: > Older versions of libpciaccess will behave better if we do it that way > (iirc it only allocates an MTRR if the resource_wc file doesn't exist or > fails to get mapped). Reported-by: Thomas Schlichter <thomas.schlichter(a)web.de> Signed-off-by: Thomas Schlichter <thomas.schlichter(a)web.de> Signed-off-by: Suresh Siddha <suresh.b.siddha(a)intel.com> Acked-by: Eric Anholt <eric(a)anholt.net> Acked-by: Jesse Barnes <jbarnes(a)virtuousgeek.org> Signed-off-by: Jesse Barnes <jbarnes(a)virtuousgeek.org> Signed-off-by: Greg Kroah-Hartman <gregkh(a)suse.de> --- arch/x86/pci/i386.c | 9 +++++++++ 1 file changed, 9 insertions(+) --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c @@ -282,6 +282,15 @@ int pci_mmap_page_range(struct pci_dev * return -EINVAL; prot = pgprot_val(vma->vm_page_prot); + + /* + * Return error if pat is not enabled and write_combine is requested. + * Caller can followup with UC MINUS request and add a WC mtrr if there + * is a free mtrr slot. + */ + if (!pat_enabled && write_combine) + return -EINVAL; + if (pat_enabled && write_combine) prot |= _PAGE_CACHE_WC; else if (pat_enabled || boot_cpu_data.x86 > 3) -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |