|
@@ -2200,8 +2200,12 @@ static void binder_transaction(struct binder_proc *proc,
|
|
|
list_add_tail(&t->work.entry, target_list);
|
|
|
tcomplete->type = BINDER_WORK_TRANSACTION_COMPLETE;
|
|
|
list_add_tail(&tcomplete->entry, &thread->todo);
|
|
|
- if (target_wait)
|
|
|
- wake_up_interruptible(target_wait);
|
|
|
+ if (target_wait) {
|
|
|
+ if (reply || !(t->flags & TF_ONE_WAY))
|
|
|
+ wake_up_interruptible_sync(target_wait);
|
|
|
+ else
|
|
|
+ wake_up_interruptible(target_wait);
|
|
|
+ }
|
|
|
return;
|
|
|
|
|
|
err_translate_failed:
|
|
@@ -3247,10 +3251,6 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|
|
/*pr_info("binder_ioctl: %d:%d %x %lx\n",
|
|
|
proc->pid, current->pid, cmd, arg);*/
|
|
|
|
|
|
- if (unlikely(current->mm != proc->vma_vm_mm)) {
|
|
|
- pr_err("current mm mismatch proc mm\n");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
trace_binder_ioctl(cmd, arg);
|
|
|
|
|
|
ret = wait_event_interruptible(binder_user_error_wait, binder_stop_on_user_error < 2);
|
|
@@ -3464,9 +3464,8 @@ static int binder_open(struct inode *nodp, struct file *filp)
|
|
|
proc = kzalloc(sizeof(*proc), GFP_KERNEL);
|
|
|
if (proc == NULL)
|
|
|
return -ENOMEM;
|
|
|
- get_task_struct(current);
|
|
|
- proc->tsk = current;
|
|
|
- proc->vma_vm_mm = current->mm;
|
|
|
+ get_task_struct(current->group_leader);
|
|
|
+ proc->tsk = current->group_leader;
|
|
|
INIT_LIST_HEAD(&proc->todo);
|
|
|
init_waitqueue_head(&proc->wait);
|
|
|
proc->default_priority = task_nice(current);
|