diff options
Diffstat (limited to 'drivers/android/binder_alloc.c')
| -rw-r--r-- | drivers/android/binder_alloc.c | 18 | 
1 files changed, 8 insertions, 10 deletions
| diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c index 6389467670a0..195f120c4e8c 100644 --- a/drivers/android/binder_alloc.c +++ b/drivers/android/binder_alloc.c @@ -927,14 +927,13 @@ enum lru_status binder_alloc_free_page(struct list_head *item,  	index = page - alloc->pages;  	page_addr = (uintptr_t)alloc->buffer + index * PAGE_SIZE; + +	mm = alloc->vma_vm_mm; +	if (!mmget_not_zero(mm)) +		goto err_mmget; +	if (!down_write_trylock(&mm->mmap_sem)) +		goto err_down_write_mmap_sem_failed;  	vma = binder_alloc_get_vma(alloc); -	if (vma) { -		if (!mmget_not_zero(alloc->vma_vm_mm)) -			goto err_mmget; -		mm = alloc->vma_vm_mm; -		if (!down_read_trylock(&mm->mmap_sem)) -			goto err_down_write_mmap_sem_failed; -	}  	list_lru_isolate(lru, item);  	spin_unlock(lock); @@ -945,10 +944,9 @@ enum lru_status binder_alloc_free_page(struct list_head *item,  		zap_page_range(vma, page_addr, PAGE_SIZE);  		trace_binder_unmap_user_end(alloc, index); - -		up_read(&mm->mmap_sem); -		mmput(mm);  	} +	up_write(&mm->mmap_sem); +	mmput(mm);  	trace_binder_unmap_kernel_start(alloc, index); |