summaryrefslogtreecommitdiff
path: root/drivers/android
diff options
context:
space:
mode:
authorAndrew Bresticker <abrestic@chromium.org>2015-10-23 15:13:42 -0700
committerVikram Mulukutla <markivx@codeaurora.org>2016-07-26 16:39:51 -0700
commit821e02f204974b2358dfc950d8de5bd19af7fbf2 (patch)
treece3875e3dc10220ee87012f71f0539387af0e731 /drivers/android
parente4045d607a59cc03033afe51b8e6fac51732db1d (diff)
CHROMIUM: android: binder: Fix potential scheduling-while-atomic
Commit f1e7f0a724f6 ("android: binder: Disable preemption while holding the global binder lock.") re-enabled preemption around most of the sites where calls to potentially sleeping functions were made, but missed __alloc_fd(), which can sleep if the fdtable needs to be resized. Re-enable preemption around __alloc_fd() as well as __fd_install() which can now sleep in upstream kernels as of commit 8a81252b774b ("fs/file.c: don't acquire files->file_lock in fd_install()"). BUG=chrome-os-partner:44012 TEST=Build and boot on Smaug. Change-Id: I9819c4b95876f697e75b1b84810b6c520d9c33ec Signed-off-by: Andrew Bresticker <abrestic@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/308582 Reviewed-by: Stephen Barber <smbarber@chromium.org> Reviewed-by: Riley Andrews <riandrews@google.com> Git-repo: https://source.codeaurora.org/quic/la/kernel/msm-4.4 Git-commit: c267ff1d548ed1bdad6a08f1c70776c5e60d569e Signed-off-by: Vikram Mulukutla <markivx@codeaurora.org>
Diffstat (limited to 'drivers/android')
-rw-r--r--drivers/android/binder.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index 61df1ea0659d..20d17906fc9b 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -379,6 +379,7 @@ static int task_get_unused_fd_flags(struct binder_proc *proc, int flags)
struct files_struct *files = proc->files;
unsigned long rlim_cur;
unsigned long irqs;
+ int ret;
if (files == NULL)
return -ESRCH;
@@ -389,7 +390,11 @@ static int task_get_unused_fd_flags(struct binder_proc *proc, int flags)
rlim_cur = task_rlimit(proc->tsk, RLIMIT_NOFILE);
unlock_task_sighand(proc->tsk, &irqs);
- return __alloc_fd(files, 0, rlim_cur, flags);
+ preempt_enable_no_resched();
+ ret = __alloc_fd(files, 0, rlim_cur, flags);
+ preempt_disable();
+
+ return ret;
}
/*
@@ -398,8 +403,11 @@ static int task_get_unused_fd_flags(struct binder_proc *proc, int flags)
static void task_fd_install(
struct binder_proc *proc, unsigned int fd, struct file *file)
{
- if (proc->files)
+ if (proc->files) {
+ preempt_enable_no_resched();
__fd_install(proc->files, fd, file);
+ preempt_disable();
+ }
}
/*