diff options
Diffstat (limited to 'fs/exec.c')
| -rw-r--r-- | fs/exec.c | 17 |
1 files changed, 6 insertions, 11 deletions
| @@ -309,40 +309,36 @@ void install_arg_page(struct vm_area_struct *vma, | |||
| 309 | pud_t * pud; | 309 | pud_t * pud; |
| 310 | pmd_t * pmd; | 310 | pmd_t * pmd; |
| 311 | pte_t * pte; | 311 | pte_t * pte; |
| 312 | spinlock_t *ptl; | ||
| 312 | 313 | ||
| 313 | if (unlikely(anon_vma_prepare(vma))) | 314 | if (unlikely(anon_vma_prepare(vma))) |
| 314 | goto out_sig; | 315 | goto out; |
| 315 | 316 | ||
| 316 | flush_dcache_page(page); | 317 | flush_dcache_page(page); |
| 317 | pgd = pgd_offset(mm, address); | 318 | pgd = pgd_offset(mm, address); |
| 318 | |||
| 319 | spin_lock(&mm->page_table_lock); | ||
| 320 | pud = pud_alloc(mm, pgd, address); | 319 | pud = pud_alloc(mm, pgd, address); |
| 321 | if (!pud) | 320 | if (!pud) |
| 322 | goto out; | 321 | goto out; |
| 323 | pmd = pmd_alloc(mm, pud, address); | 322 | pmd = pmd_alloc(mm, pud, address); |
| 324 | if (!pmd) | 323 | if (!pmd) |
| 325 | goto out; | 324 | goto out; |
| 326 | pte = pte_alloc_map(mm, pmd, address); | 325 | pte = pte_alloc_map_lock(mm, pmd, address, &ptl); |
| 327 | if (!pte) | 326 | if (!pte) |
| 328 | goto out; | 327 | goto out; |
| 329 | if (!pte_none(*pte)) { | 328 | if (!pte_none(*pte)) { |
| 330 | pte_unmap(pte); | 329 | pte_unmap_unlock(pte, ptl); |
| 331 | goto out; | 330 | goto out; |
| 332 | } | 331 | } |
| 333 | inc_mm_counter(mm, rss); | 332 | inc_mm_counter(mm, anon_rss); |
| 334 | lru_cache_add_active(page); | 333 | lru_cache_add_active(page); |
| 335 | set_pte_at(mm, address, pte, pte_mkdirty(pte_mkwrite(mk_pte( | 334 | set_pte_at(mm, address, pte, pte_mkdirty(pte_mkwrite(mk_pte( |
| 336 | page, vma->vm_page_prot)))); | 335 | page, vma->vm_page_prot)))); |
| 337 | page_add_anon_rmap(page, vma, address); | 336 | page_add_anon_rmap(page, vma, address); |
| 338 | pte_unmap(pte); | 337 | pte_unmap_unlock(pte, ptl); |
| 339 | spin_unlock(&mm->page_table_lock); | ||
| 340 | 338 | ||
| 341 | /* no need for flush_tlb */ | 339 | /* no need for flush_tlb */ |
| 342 | return; | 340 | return; |
| 343 | out: | 341 | out: |
| 344 | spin_unlock(&mm->page_table_lock); | ||
| 345 | out_sig: | ||
| 346 | __free_page(page); | 342 | __free_page(page); |
| 347 | force_sig(SIGKILL, current); | 343 | force_sig(SIGKILL, current); |
| 348 | } | 344 | } |
| @@ -1207,7 +1203,6 @@ int do_execve(char * filename, | |||
| 1207 | /* execve success */ | 1203 | /* execve success */ |
| 1208 | security_bprm_free(bprm); | 1204 | security_bprm_free(bprm); |
| 1209 | acct_update_integrals(current); | 1205 | acct_update_integrals(current); |
| 1210 | update_mem_hiwater(current); | ||
| 1211 | kfree(bprm); | 1206 | kfree(bprm); |
| 1212 | return retval; | 1207 | return retval; |
| 1213 | } | 1208 | } |
