On Sun, Dec 08, 2019 at 07:33:37PM -0800, Haren Myneni wrote:
> +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;
> +     /*
> +      * process will be polling on csb.flags after request is sent to
> +      * NX. So generally CSB update should not fail except when an
> +      * application does not follow the process properly. So an error
> +      * message will be displayed and leave it to user space whether
> +      * to ignore or handle this signal.
> +      */
> +     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);
> +}

I think you want to pass in the struct pid * here instead of looking
up again, given that..

> +     if (tsk) {
> +             if (tsk->flags & PF_EXITING)
> +                     task_exit = 1;
> +             put_task_struct(tsk);
> +             pid = vas_window_pid(window);

We already have the struct pid in the window structure here.

> +     } else {
> +             pid = window->tgid;
> +
> +             rcu_read_lock();
> +             tsk = find_task_by_vpid(pid);
> +             if (!tsk) {

.. and could have easily stored on here.  Or at least only do the
look up once, given that already looks it up.

> +     /* Do not notify if the task is exiting. */
> +     if (!task_exit) {
> +             pr_err("Invalid CSB address 0x%p signalling pid(%d)\n",
> +                             csb_addr, pid);
> +             notify_process(pid, (u64)csb_addr);
> +     }

I suspect inlining notify_process and just existing early for the
task_exit case also makes the code a bit easier to follow.

Reply via email to