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 8a81252b77
("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>
This commit is contained in:
parent
e4045d607a
commit
821e02f204
1 changed files with 10 additions and 2 deletions
|
@ -379,6 +379,7 @@ static int task_get_unused_fd_flags(struct binder_proc *proc, int flags)
|
||||||
struct files_struct *files = proc->files;
|
struct files_struct *files = proc->files;
|
||||||
unsigned long rlim_cur;
|
unsigned long rlim_cur;
|
||||||
unsigned long irqs;
|
unsigned long irqs;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (files == NULL)
|
if (files == NULL)
|
||||||
return -ESRCH;
|
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);
|
rlim_cur = task_rlimit(proc->tsk, RLIMIT_NOFILE);
|
||||||
unlock_task_sighand(proc->tsk, &irqs);
|
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(
|
static void task_fd_install(
|
||||||
struct binder_proc *proc, unsigned int fd, struct file *file)
|
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);
|
__fd_install(proc->files, fd, file);
|
||||||
|
preempt_disable();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue