Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 821e02f2 authored by Andrew Bresticker's avatar Andrew Bresticker Committed by Vikram Mulukutla
Browse files

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 8a81252b ("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: default avatarAndrew Bresticker <abrestic@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/308582


Reviewed-by: default avatarStephen Barber <smbarber@chromium.org>
Reviewed-by: default avatarRiley Andrews <riandrews@google.com>
Git-repo: https://source.codeaurora.org/quic/la/kernel/msm-4.4


Git-commit: c267ff1d548ed1bdad6a08f1c70776c5e60d569e
Signed-off-by: default avatarVikram Mulukutla <markivx@codeaurora.org>
parent e4045d60
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -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();
	}
}

/*