2018-03-29 14:54 GMT+08:00 Minchan Kim <minc...@kernel.org>: > binder_update_page_range needs down_write of mmap_sem because > vm_insert_page need to change vma->vm_flags to VM_MIXEDMAP unless > it is set. However, when I profile binder working, it seems > every binder buffers should be mapped in advance by binder_mmap. > It means we could set VM_MIXEDMAP in binder_mmap time which is > already hold a mmap_sem as down_write so binder_update_page_range > doesn't need to hold a mmap_sem as down_write. > > Android suffers from mmap_sem contention so let's reduce mmap_sem > down_write.
Hi, Minchan: It seems there is performance regression of this patch. Do you have some test result of android app launch time or binderThroughput? Thanks. > > Cc: Joe Perches <j...@perches.com> > Cc: Arve Hjønnevåg <a...@android.com> > Cc: Todd Kjos <tk...@google.com> > Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org> > Reviewed-by: Martijn Coenen <m...@android.com> > Signed-off-by: Minchan Kim <minc...@kernel.org> > --- > From v4: > * Fix typo and VM flags clear handling - Joe > > From v3: > * Fix typo > > From v2: > * Fix vma->flag setting - Arve > > From v1: > * remove WARN_ON_ONCE - Greg > * add reviewed-by - Martijn > > Martijn, I took your LGTM of v1 as Reviewed-by. If you don't like it > or want to change it to acked-by, please, tell me. > > drivers/android/binder.c | 4 +++- > drivers/android/binder_alloc.c | 6 +++--- > 2 files changed, 6 insertions(+), 4 deletions(-) > > diff --git a/drivers/android/binder.c b/drivers/android/binder.c > index 764b63a5aade..bb63e3b54e0c 100644 > --- a/drivers/android/binder.c > +++ b/drivers/android/binder.c > @@ -4722,7 +4722,9 @@ static int binder_mmap(struct file *filp, struct > vm_area_struct *vma) > failure_string = "bad vm_flags"; > goto err_bad_arg; > } > - vma->vm_flags = (vma->vm_flags | VM_DONTCOPY) & ~VM_MAYWRITE; > + vma->vm_flags |= VM_DONTCOPY | VM_MIXEDMAP; > + vma->vm_flags &= ~VM_MAYWRITE; > + > vma->vm_ops = &binder_vm_ops; > vma->vm_private_data = proc; > > diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c > index 5a426c877dfb..4f382d51def1 100644 > --- a/drivers/android/binder_alloc.c > +++ b/drivers/android/binder_alloc.c > @@ -219,7 +219,7 @@ static int binder_update_page_range(struct binder_alloc > *alloc, int allocate, > mm = alloc->vma_vm_mm; > > if (mm) { > - down_write(&mm->mmap_sem); > + down_read(&mm->mmap_sem); > vma = alloc->vma; > } > > @@ -288,7 +288,7 @@ static int binder_update_page_range(struct binder_alloc > *alloc, int allocate, > /* vm_insert_page does not seem to increment the refcount */ > } > if (mm) { > - up_write(&mm->mmap_sem); > + up_read(&mm->mmap_sem); > mmput(mm); > } > return 0; > @@ -321,7 +321,7 @@ static int binder_update_page_range(struct binder_alloc > *alloc, int allocate, > } > err_no_vma: > if (mm) { > - up_write(&mm->mmap_sem); > + up_read(&mm->mmap_sem); > mmput(mm); > } > return vma ? -ENOMEM : -ESRCH; > -- > 2.17.0.rc1.321.gba9d0f2565-goog >