diff options
| -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 | ||
