diff options
Diffstat (limited to 'mm/rmap.c')
| -rw-r--r-- | mm/rmap.c | 9 | 
1 files changed, 5 insertions, 4 deletions
| @@ -133,8 +133,8 @@ int anon_vma_prepare(struct vm_area_struct *vma) | |||
| 133 | goto out_enomem_free_avc; | 133 | goto out_enomem_free_avc; | 
| 134 | allocated = anon_vma; | 134 | allocated = anon_vma; | 
| 135 | } | 135 | } | 
| 136 | spin_lock(&anon_vma->lock); | ||
| 137 | 136 | ||
| 137 | spin_lock(&anon_vma->lock); | ||
| 138 | /* page_table_lock to protect against threads */ | 138 | /* page_table_lock to protect against threads */ | 
| 139 | spin_lock(&mm->page_table_lock); | 139 | spin_lock(&mm->page_table_lock); | 
| 140 | if (likely(!vma->anon_vma)) { | 140 | if (likely(!vma->anon_vma)) { | 
| @@ -144,14 +144,15 @@ int anon_vma_prepare(struct vm_area_struct *vma) | |||
| 144 | list_add(&avc->same_vma, &vma->anon_vma_chain); | 144 | list_add(&avc->same_vma, &vma->anon_vma_chain); | 
| 145 | list_add(&avc->same_anon_vma, &anon_vma->head); | 145 | list_add(&avc->same_anon_vma, &anon_vma->head); | 
| 146 | allocated = NULL; | 146 | allocated = NULL; | 
| 147 | avc = NULL; | ||
| 147 | } | 148 | } | 
| 148 | spin_unlock(&mm->page_table_lock); | 149 | spin_unlock(&mm->page_table_lock); | 
| 149 | |||
| 150 | spin_unlock(&anon_vma->lock); | 150 | spin_unlock(&anon_vma->lock); | 
| 151 | if (unlikely(allocated)) { | 151 | |
| 152 | if (unlikely(allocated)) | ||
| 152 | anon_vma_free(allocated); | 153 | anon_vma_free(allocated); | 
| 154 | if (unlikely(avc)) | ||
| 153 | anon_vma_chain_free(avc); | 155 | anon_vma_chain_free(avc); | 
| 154 | } | ||
| 155 | } | 156 | } | 
| 156 | return 0; | 157 | return 0; | 
| 157 | 158 | ||
