aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/android
diff options
context:
space:
mode:
authorTyler Hicks <tyhicks@canonical.com>2019-04-12 17:59:25 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-04-25 05:53:43 -0400
commit60d4885710836595192c42d3e04b27551d30ec91 (patch)
tree21efa1820f9c9907e6a22b04fece3394f308dead /drivers/android
parente60e9a4b231a20a199d7a61caadc48693c30d695 (diff)
binder: take read mode of mmap_sem in binder_alloc_free_page()
Restore the behavior of locking mmap_sem for reading in binder_alloc_free_page(), as was first done in commit 3013bf62b67a ("binder: reduce mmap_sem write-side lock"). That change was inadvertently reverted by commit 5cec2d2e5839 ("binder: fix race between munmap() and direct reclaim"). In addition, change the name of the label for the error path to accurately reflect that we're taking the lock for reading. Backporting note: This fix is only needed when *both* of the commits mentioned above are applied. That's an unlikely situation since they both landed during the development of v5.1 but only one of them is targeted for stable. Fixes: 5cec2d2e5839 ("binder: fix race between munmap() and direct reclaim") Signed-off-by: Tyler Hicks <tyhicks@canonical.com> Acked-by: Todd Kjos <tkjos@android.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/android')
-rw-r--r--drivers/android/binder_alloc.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c
index 195f120c4e8c..bb929eb87116 100644
--- a/drivers/android/binder_alloc.c
+++ b/drivers/android/binder_alloc.c
@@ -931,8 +931,8 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
931 mm = alloc->vma_vm_mm; 931 mm = alloc->vma_vm_mm;
932 if (!mmget_not_zero(mm)) 932 if (!mmget_not_zero(mm))
933 goto err_mmget; 933 goto err_mmget;
934 if (!down_write_trylock(&mm->mmap_sem)) 934 if (!down_read_trylock(&mm->mmap_sem))
935 goto err_down_write_mmap_sem_failed; 935 goto err_down_read_mmap_sem_failed;
936 vma = binder_alloc_get_vma(alloc); 936 vma = binder_alloc_get_vma(alloc);
937 937
938 list_lru_isolate(lru, item); 938 list_lru_isolate(lru, item);
@@ -945,7 +945,7 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
945 945
946 trace_binder_unmap_user_end(alloc, index); 946 trace_binder_unmap_user_end(alloc, index);
947 } 947 }
948 up_write(&mm->mmap_sem); 948 up_read(&mm->mmap_sem);
949 mmput(mm); 949 mmput(mm);
950 950
951 trace_binder_unmap_kernel_start(alloc, index); 951 trace_binder_unmap_kernel_start(alloc, index);
@@ -959,7 +959,7 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
959 mutex_unlock(&alloc->mutex); 959 mutex_unlock(&alloc->mutex);
960 return LRU_REMOVED_RETRY; 960 return LRU_REMOVED_RETRY;
961 961
962err_down_write_mmap_sem_failed: 962err_down_read_mmap_sem_failed:
963 mmput_async(mm); 963 mmput_async(mm);
964err_mmget: 964err_mmget:
965err_page_already_freed: 965err_page_already_freed: