mm, proc: fix region lost in /proc/self/smaps
[cascardo/linux.git] / fs / proc / task_mmu.c
index f6fa99e..6909582 100644 (file)
@@ -147,7 +147,7 @@ m_next_vma(struct proc_maps_private *priv, struct vm_area_struct *vma)
 static void m_cache_vma(struct seq_file *m, struct vm_area_struct *vma)
 {
        if (m->count < m->size) /* vma is copied successfully */
-               m->version = m_next_vma(m->private, vma) ? vma->vm_start : -1UL;
+               m->version = m_next_vma(m->private, vma) ? vma->vm_end : -1UL;
 }
 
 static void *m_start(struct seq_file *m, loff_t *ppos)
@@ -175,8 +175,10 @@ static void *m_start(struct seq_file *m, loff_t *ppos)
        priv->tail_vma = get_gate_vma(mm);
 
        if (last_addr) {
-               vma = find_vma(mm, last_addr);
-               if (vma && (vma = m_next_vma(priv, vma)))
+               vma = find_vma(mm, last_addr - 1);
+               if (vma && vma->vm_start <= last_addr)
+                       vma = m_next_vma(priv, vma);
+               if (vma)
                        return vma;
        }
 
@@ -1070,7 +1072,7 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf,
                        }
                        mmu_notifier_invalidate_range_start(mm, 0, -1);
                }
-               walk_page_range(0, ~0UL, &clear_refs_walk);
+               walk_page_range(0, mm->highest_vm_end, &clear_refs_walk);
                if (type == CLEAR_REFS_SOFT_DIRTY)
                        mmu_notifier_invalidate_range_end(mm, 0, -1);
                flush_tlb_mm(mm);