]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/um/kernel/tlb.c
Merge commit '900cfa46191a7d87cf1891924cb90499287fd235'; branches 'timers/nohz',...
[linux-2.6-omap-h63xx.git] / arch / um / kernel / tlb.c
index ef5a2a20d3513052dde96c661f60994d79ffe72d..d175d0566af02d35acde18d805040c61a4bd29f2 100644 (file)
@@ -57,7 +57,7 @@ static int do_ops(struct host_vm_change *hvc, int end,
 
        for (i = 0; i < end && !ret; i++) {
                op = &hvc->ops[i];
-               switch(op->type) {
+               switch (op->type) {
                case MMAP:
                        ret = map(hvc->id, op->u.mmap.addr, op->u.mmap.len,
                                  op->u.mmap.prot, op->u.mmap.fd,
@@ -193,21 +193,21 @@ static inline int update_pte_range(pmd_t *pmd, unsigned long addr,
                if (!pte_young(*pte)) {
                        r = 0;
                        w = 0;
-               } else if (!pte_dirty(*pte)) {
+               } else if (!pte_dirty(*pte))
                        w = 0;
-               }
+
                prot = ((r ? UM_PROT_READ : 0) | (w ? UM_PROT_WRITE : 0) |
                        (x ? UM_PROT_EXEC : 0));
                if (hvc->force || pte_newpage(*pte)) {
                        if (pte_present(*pte))
                                ret = add_mmap(addr, pte_val(*pte) & PAGE_MASK,
                                               PAGE_SIZE, prot, hvc);
-                       else ret = add_munmap(addr, PAGE_SIZE, hvc);
-               }
-               else if (pte_newprot(*pte))
+                       else
+                               ret = add_munmap(addr, PAGE_SIZE, hvc);
+               else if (pte_newprot(*pte))
                        ret = add_mprotect(addr, PAGE_SIZE, prot, hvc);
                *pte = pte_mkuptodate(*pte);
-       } while (pte++, addr += PAGE_SIZE, ((addr != end) && !ret));
+       } while (pte++, addr += PAGE_SIZE, ((addr < end) && !ret));
        return ret;
 }
 
@@ -229,7 +229,7 @@ static inline int update_pmd_range(pud_t *pud, unsigned long addr,
                        }
                }
                else ret = update_pte_range(pmd, addr, next, hvc);
-       } while (pmd++, addr = next, ((addr != end) && !ret));
+       } while (pmd++, addr = next, ((addr < end) && !ret));
        return ret;
 }
 
@@ -251,7 +251,7 @@ static inline int update_pud_range(pgd_t *pgd, unsigned long addr,
                        }
                }
                else ret = update_pmd_range(pud, addr, next, hvc);
-       } while (pud++, addr = next, ((addr != end) && !ret));
+       } while (pud++, addr = next, ((addr < end) && !ret));
        return ret;
 }
 
@@ -274,7 +274,7 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr,
                        }
                }
                else ret = update_pud_range(pgd, addr, next, &hvc);
-       } while (pgd++, addr = next, ((addr != end_addr) && !ret));
+       } while (pgd++, addr = next, ((addr < end_addr) && !ret));
 
        if (!ret)
                ret = do_ops(&hvc, hvc.index, 1);
@@ -500,7 +500,8 @@ void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
        else fix_range(vma->vm_mm, start, end, 0);
 }
 
-void flush_tlb_mm(struct mm_struct *mm)
+void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start,
+                       unsigned long end)
 {
        /*
         * Don't bother flushing if this address space is about to be
@@ -509,7 +510,17 @@ void flush_tlb_mm(struct mm_struct *mm)
        if (atomic_read(&mm->mm_users) == 0)
                return;
 
-       fix_range(mm, 0, TASK_SIZE, 0);
+       fix_range(mm, start, end, 0);
+}
+
+void flush_tlb_mm(struct mm_struct *mm)
+{
+       struct vm_area_struct *vma = mm->mmap;
+
+       while (vma != NULL) {
+               fix_range(mm, vma->vm_start, vma->vm_end, 0);
+               vma = vma->vm_next;
+       }
 }
 
 void force_flush_all(void)