]> err.no Git - linux-2.6/blobdiff - arch/x86/mm/pat.c
Merge branch 'linus' into x86/amd-iommu
[linux-2.6] / arch / x86 / mm / pat.c
index 281ac6489c08a720e5490b7b6f1f4a17871702f6..d4585077977a0bd1c6c7234b09051d671851a6aa 100644 (file)
@@ -281,32 +281,24 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type,
        /* Search for existing mapping that overlaps the current range */
        where = NULL;
        list_for_each_entry(entry, &memtype_list, nd) {
-               if (entry->start >= end) {
+               if (end <= entry->start) {
                        where = entry->nd.prev;
                        break;
-               }
-
-               if (start <= entry->start && end >= entry->start) {
+               } else if (start <= entry->start) { /* end > entry->start */
                        err = chk_conflict(new, entry, new_type);
-                       if (err) {
-                               break;
+                       if (!err) {
+                               dprintk("Overlap at 0x%Lx-0x%Lx\n",
+                                       entry->start, entry->end);
+                               where = entry->nd.prev;
                        }
-
-                       dprintk("Overlap at 0x%Lx-0x%Lx\n",
-                              entry->start, entry->end);
-                       where = entry->nd.prev;
                        break;
-               }
-
-               if (start < entry->end) {
+               } else if (start < entry->end) { /* start > entry->start */
                        err = chk_conflict(new, entry, new_type);
-                       if (err) {
-                               break;
+                       if (!err) {
+                               dprintk("Overlap at 0x%Lx-0x%Lx\n",
+                                       entry->start, entry->end);
+                               where = &entry->nd;
                        }
-
-                       dprintk("Overlap at 0x%Lx-0x%Lx\n",
-                                entry->start, entry->end);
-                       where = &entry->nd;
                        break;
                }
        }
@@ -457,7 +449,8 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
        if (retval < 0)
                return 0;
 
-       if (pfn <= max_pfn_mapped &&
+       if (((pfn < max_low_pfn_mapped) ||
+            (pfn >= (1UL<<(32 - PAGE_SHIFT)) && pfn < max_pfn_mapped)) &&
            ioremap_change_attr((unsigned long)__va(offset), size, flags) < 0) {
                free_memtype(offset, offset + size);
                printk(KERN_INFO