···88 *99 * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>1010 */1111+#include <linux/kernel.h>1112#include <linux/rwsem.h>1213#include <linux/mutex.h>1314#include <linux/module.h>···3837{3938 if (xchg(&debug_locks, 0)) {4039 if (!debug_locks_silent) {4040+ oops_in_progress = 1;4141 console_verbose();4242 return 1;4343 }
+13-7
mm/mmap.c
···2273227322742274static DEFINE_MUTEX(mm_all_locks_mutex);2275227522762276-static void vm_lock_anon_vma(struct anon_vma *anon_vma)22762276+static void vm_lock_anon_vma(struct mm_struct *mm, struct anon_vma *anon_vma)22772277{22782278 if (!test_bit(0, (unsigned long *) &anon_vma->head.next)) {22792279 /*22802280 * The LSB of head.next can't change from under us22812281 * because we hold the mm_all_locks_mutex.22822282 */22832283- spin_lock(&anon_vma->lock);22832283+ spin_lock_nest_lock(&anon_vma->lock, &mm->mmap_sem);22842284 /*22852285 * We can safely modify head.next after taking the22862286 * anon_vma->lock. If some other vma in this mm shares···22962296 }22972297}2298229822992299-static void vm_lock_mapping(struct address_space *mapping)22992299+static void vm_lock_mapping(struct mm_struct *mm, struct address_space *mapping)23002300{23012301 if (!test_bit(AS_MM_ALL_LOCKS, &mapping->flags)) {23022302 /*···23102310 */23112311 if (test_and_set_bit(AS_MM_ALL_LOCKS, &mapping->flags))23122312 BUG();23132313- spin_lock(&mapping->i_mmap_lock);23132313+ spin_lock_nest_lock(&mapping->i_mmap_lock, &mm->mmap_sem);23142314 }23152315}23162316···23582358 for (vma = mm->mmap; vma; vma = vma->vm_next) {23592359 if (signal_pending(current))23602360 goto out_unlock;23612361- if (vma->anon_vma)23622362- vm_lock_anon_vma(vma->anon_vma);23632361 if (vma->vm_file && vma->vm_file->f_mapping)23642364- vm_lock_mapping(vma->vm_file->f_mapping);23622362+ vm_lock_mapping(mm, vma->vm_file->f_mapping);23652363 }23642364+23652365+ for (vma = mm->mmap; vma; vma = vma->vm_next) {23662366+ if (signal_pending(current))23672367+ goto out_unlock;23682368+ if (vma->anon_vma)23692369+ vm_lock_anon_vma(mm, vma->anon_vma);23702370+ }23712371+23662372 ret = 0;2367237323682374out_unlock: