diff options
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/mm/memory.c b/mm/memory.c index 4b0144b24c12..d902d0e25edc 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -513,8 +513,7 @@ again: | |||
513 | if (progress >= 32) { | 513 | if (progress >= 32) { |
514 | progress = 0; | 514 | progress = 0; |
515 | if (need_resched() || | 515 | if (need_resched() || |
516 | need_lockbreak(src_ptl) || | 516 | spin_needbreak(src_ptl) || spin_needbreak(dst_ptl)) |
517 | need_lockbreak(dst_ptl)) | ||
518 | break; | 517 | break; |
519 | } | 518 | } |
520 | if (pte_none(*src_pte)) { | 519 | if (pte_none(*src_pte)) { |
@@ -853,7 +852,7 @@ unsigned long unmap_vmas(struct mmu_gather **tlbp, | |||
853 | tlb_finish_mmu(*tlbp, tlb_start, start); | 852 | tlb_finish_mmu(*tlbp, tlb_start, start); |
854 | 853 | ||
855 | if (need_resched() || | 854 | if (need_resched() || |
856 | (i_mmap_lock && need_lockbreak(i_mmap_lock))) { | 855 | (i_mmap_lock && spin_needbreak(i_mmap_lock))) { |
857 | if (i_mmap_lock) { | 856 | if (i_mmap_lock) { |
858 | *tlbp = NULL; | 857 | *tlbp = NULL; |
859 | goto out; | 858 | goto out; |
@@ -1768,8 +1767,7 @@ again: | |||
1768 | 1767 | ||
1769 | restart_addr = zap_page_range(vma, start_addr, | 1768 | restart_addr = zap_page_range(vma, start_addr, |
1770 | end_addr - start_addr, details); | 1769 | end_addr - start_addr, details); |
1771 | need_break = need_resched() || | 1770 | need_break = need_resched() || spin_needbreak(details->i_mmap_lock); |
1772 | need_lockbreak(details->i_mmap_lock); | ||
1773 | 1771 | ||
1774 | if (restart_addr >= end_addr) { | 1772 | if (restart_addr >= end_addr) { |
1775 | /* We have now completed this vma: mark it so */ | 1773 | /* We have now completed this vma: mark it so */ |
@@ -2756,3 +2754,34 @@ int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, in | |||
2756 | 2754 | ||
2757 | return buf - old_buf; | 2755 | return buf - old_buf; |
2758 | } | 2756 | } |
2757 | |||
2758 | /* | ||
2759 | * Print the name of a VMA. | ||
2760 | */ | ||
2761 | void print_vma_addr(char *prefix, unsigned long ip) | ||
2762 | { | ||
2763 | struct mm_struct *mm = current->mm; | ||
2764 | struct vm_area_struct *vma; | ||
2765 | |||
2766 | down_read(&mm->mmap_sem); | ||
2767 | vma = find_vma(mm, ip); | ||
2768 | if (vma && vma->vm_file) { | ||
2769 | struct file *f = vma->vm_file; | ||
2770 | char *buf = (char *)__get_free_page(GFP_KERNEL); | ||
2771 | if (buf) { | ||
2772 | char *p, *s; | ||
2773 | |||
2774 | p = d_path(f->f_dentry, f->f_vfsmnt, buf, PAGE_SIZE); | ||
2775 | if (IS_ERR(p)) | ||
2776 | p = "?"; | ||
2777 | s = strrchr(p, '/'); | ||
2778 | if (s) | ||
2779 | p = s+1; | ||
2780 | printk("%s%s[%lx+%lx]", prefix, p, | ||
2781 | vma->vm_start, | ||
2782 | vma->vm_end - vma->vm_start); | ||
2783 | free_page((unsigned long)buf); | ||
2784 | } | ||
2785 | } | ||
2786 | up_read(¤t->mm->mmap_sem); | ||
2787 | } | ||