Oddness in i_shared_lock and page_table_lock nesting hierarchies ?
Subsystems (4)
Quoted 4 lines
The fix we agreed on back then is easy (make rest of kernel match vmtruncate()'s locking order), it just takes time to implement and test.
David,
I was looking into the vmm code and trying to work out exactly how to fix
this, and there are
some questions in my mind - mainly a few cases (involving multiple vma
updates) which
I'm not sure about the cleanest way to tackle.
But before I bother anyone with those, I thought I ought to go through
the earlier discussions
that you had while coming up with what the fix should be. Maybe you've
already gone over
this once.
Could you point me to those ? Somehow I haven't been successful in
locating them.
Regards
Suparna
Suparna Bhattacharya
Systems Software Group, IBM Global Services, India E-mail : [email protected]
Phone : 91-80-5267117, Extn : 2525
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/
From: [email protected]
Date: Thu, 9 Nov 2000 17:46:53 +0530
I was looking into the vmm code and trying to work out exactly
how to fix this
Let me save you some time, below is the fix I sent to Linus this evening:
include/linux/mm.h renamed from linux/include/linux/mm.h +3 -0
@@ -417,8 +417,11 @@extern void swapin_readahead (swp_entry_t );/* mmap.c */ +extern void lock_vma_mappings (struct vm_area_struct *); +extern void unlock_vma_mappings (struct vm_area_struct *);extern void merge_segments (struct mm_struct *,unsigned long ,unsigned long );extern void insert_vm_struct (struct mm_struct *,struct vm_area_struct *); +extern void __insert_vm_struct (struct mm_struct *,struct vm_area_struct *);extern void build_mmap_avl (struct mm_struct *);extern void exit_mmap (struct mm_struct *);extern unsigned long get_unmapped_area (unsigned long ,unsigned long );
mm/filemap.c renamed from linux/mm/filemap.c +10 -4
@@ -1813,11 +1813,13 @@get_file (n->vm_file);if (n->vm_ops && n->vm_ops->open) n->vm_ops->open (n); +lock_vma_mappings (vma);spin_lock (&vma->vm_mm->page_table_lock); vma->vm_pgoff += (end - vma->vm_start) >>PAGE_SHIFT ; vma->vm_start = end; -insert_vm_struct (current->mm, n); +__insert_vm_struct (current->mm, n);spin_unlock (&vma->vm_mm->page_table_lock); +unlock_vma_mappings (vma);return 0 ; }
@@ -1837,10 +1839,12 @@get_file (n->vm_file);if (n->vm_ops && n->vm_ops->open) n->vm_ops->open (n); +lock_vma_mappings (vma);spin_lock (&vma->vm_mm->page_table_lock); vma->vm_end = start; -insert_vm_struct (current->mm, n); +__insert_vm_struct (current->mm, n);spin_unlock (&vma->vm_mm->page_table_lock); +unlock_vma_mappings (vma);return 0 ; }
@@ -1870,15 +1874,17 @@ vma->vm_ops->open (left); vma->vm_ops->open (right); } +lock_vma_mappings (vma);spin_lock (&vma->vm_mm->page_table_lock); vma->vm_pgoff += (start - vma->vm_start) >>PAGE_SHIFT ; vma->vm_start = start; vma->vm_end = end;setup_read_behavior (vma, behavior); vma->vm_raend =0 ; -insert_vm_struct (current->mm, left); -insert_vm_struct (current->mm, right); +__insert_vm_struct (current->mm, left); +__insert_vm_struct (current->mm, right);spin_unlock (&vma->vm_mm->page_table_lock); +unlock_vma_mappings (vma);return 0 ; }
mm/mlock.c renamed from linux/mm/mlock.c +10 -4
@@ -36,11 +36,13 @@get_file (n->vm_file);if (n->vm_ops && n->vm_ops->open) n->vm_ops->open (n); +lock_vma_mappings (vma);spin_lock (&vma->vm_mm->page_table_lock); vma->vm_pgoff += (end - vma->vm_start) >>PAGE_SHIFT ; vma->vm_start = end; -insert_vm_struct (current->mm, n); +__insert_vm_struct (current->mm, n);spin_unlock (&vma->vm_mm->page_table_lock); +unlock_vma_mappings (vma);return 0 ; }
@@ -61,10 +63,12 @@get_file (n->vm_file);if (n->vm_ops && n->vm_ops->open) n->vm_ops->open (n); +lock_vma_mappings (vma);spin_lock (&vma->vm_mm->page_table_lock); vma->vm_end = start; -insert_vm_struct (current->mm, n); +__insert_vm_struct (current->mm, n);spin_unlock (&vma->vm_mm->page_table_lock); +unlock_vma_mappings (vma);return 0 ; }
@@ -96,15 +100,17 @@ vma->vm_ops->open (left); vma->vm_ops->open (right); } +lock_vma_mappings (vma);spin_lock (&vma->vm_mm->page_table_lock); vma->vm_pgoff += (start - vma->vm_start) >>PAGE_SHIFT ; vma->vm_start = start; vma->vm_end = end; vma->vm_flags = newflags; vma->vm_raend =0 ; -insert_vm_struct (current->mm, left); -insert_vm_struct (current->mm, right); +__insert_vm_struct (current->mm, left); +__insert_vm_struct (current->mm, right);spin_unlock (&vma->vm_mm->page_table_lock); +unlock_vma_mappings (vma);return 0 ; }
mm/mmap.c renamed from linux/mm/mmap.c +67 -13
168 lines not on this page · raw message
mm/mprotect.c renamed from linux/mm/mprotect.c +10 -4
@@ -118,11 +118,13 @@get_file (n->vm_file);if (n->vm_ops && n->vm_ops->open) n->vm_ops->open (n); +lock_vma_mappings (vma);spin_lock (&vma->vm_mm->page_table_lock); vma->vm_pgoff += (end - vma->vm_start) >>PAGE_SHIFT ; vma->vm_start = end; -insert_vm_struct (current->mm, n); +__insert_vm_struct (current->mm, n);spin_unlock (&vma->vm_mm->page_table_lock); +unlock_vma_mappings (vma);return 0 ; }
@@ -145,10 +147,12 @@get_file (n->vm_file);if (n->vm_ops && n->vm_ops->open) n->vm_ops->open (n); +lock_vma_mappings (vma);spin_lock (&vma->vm_mm->page_table_lock); vma->vm_end = start; -insert_vm_struct (current->mm, n); +__insert_vm_struct (current->mm, n);spin_unlock (&vma->vm_mm->page_table_lock); +unlock_vma_mappings (vma);return 0 ; }
@@ -179,6 +183,7 @@ vma->vm_ops->open (left); vma->vm_ops->open (right); } +lock_vma_mappings (vma);spin_lock (&vma->vm_mm->page_table_lock); vma->vm_pgoff += (start - vma->vm_start) >>PAGE_SHIFT ; vma->vm_start = start;
@@ -186,9 +191,10 @@ vma->vm_flags = newflags; vma->vm_raend =0 ; vma->vm_page_prot = prot; -insert_vm_struct (current->mm, left); -insert_vm_struct (current->mm, right); +__insert_vm_struct (current->mm, left); +__insert_vm_struct (current->mm, right);spin_unlock (&vma->vm_mm->page_table_lock); +unlock_vma_mappings (vma);return 0 ; }
mm/mremap.c renamed from linux/mm/mremap.c +3 -1
@@ -141,10 +141,12 @@get_file (new_vma->vm_file);if (new_vma->vm_ops && new_vma->vm_ops->open) new_vma->vm_ops->open (new_vma); +lock_vma_mappings (vma);spin_lock (¤t->mm->page_table_lock); -insert_vm_struct (current->mm, new_vma); +__insert_vm_struct (current->mm, new_vma);merge_segments (current->mm, new_vma->vm_start, new_vma->vm_end);spin_unlock (¤t->mm->page_table_lock); +unlock_vma_mappings (vma);do_munmap (current->mm, addr, old_len); current->mm->total_vm += new_len >>PAGE_SHIFT ;if (new_vma->vm_flags &VM_LOCKED ) {
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/