> > +static void notify_process(pid_t pid, u64 fault_addr) > +{ > + int rc; > + struct kernel_siginfo info; > + > + memset(&info, 0, sizeof(info)); > + > + info.si_signo = SIGSEGV; > + info.si_errno = EFAULT; > + info.si_code = SEGV_MAPERR; > + > + info.si_addr = (void *)fault_addr; > + rcu_read_lock(); > + rc = kill_pid_info(SIGSEGV, &info, find_vpid(pid)); > + rcu_read_unlock(); > + > + pr_devel("%s(): pid %d kill_proc_info() rc %d\n", __func__, pid, rc); > +} Shouldn't this use force_sig_fault_to_task instead? > + /* > + * User space passed invalid CSB address, Notify process with > + * SEGV signal. > + */ > + tsk = get_pid_task(window->pid, PIDTYPE_PID); > + /* > + * Send window will be closed after processing all NX requests > + * and process exits after closing all windows. In multi-thread > + * applications, thread may not exists, but does not close FD > + * (means send window) upon exit. Parent thread (tgid) can use > + * and close the window later. > + */ > + if (tsk) { > + if (tsk->flags & PF_EXITING) > + task_exit = 1; > + put_task_struct(tsk); > + pid = vas_window_pid(window); The pid is later used for sending the signal again, why not keep the reference? > + } else { > + pid = vas_window_tgid(window); > + > + rcu_read_lock(); > + tsk = find_task_by_vpid(pid); > + if (!tsk) { > + rcu_read_unlock(); > + return; > + } > + if (tsk->flags & PF_EXITING) > + task_exit = 1; > + rcu_read_unlock(); Why does this not need a reference to the task, but the other one does?