Excerpts from Haren Myneni's message of May 21, 2021 7:32 pm:
> +
> +     pid = task_ref->pid;
> +     tsk = get_pid_task(pid, PIDTYPE_PID);
> +     /*
> +      * Process closes send window after all pending NX requests are
> +      * completed. In multi-thread applications, a child thread can
> +      * open a window and can exit without closing it. May be some
> +      * requests are pending or this window can be used by other
> +      * threads later. We should handle faults if NX encounters
> +      * pages faults on these requests. Update CSB with translation
> +      * error and fault address. If csb_addr passed by user space is
> +      * invalid, send SEGV signal to pid saved in window. If the
> +      * child thread is not running, send the signal to tgid.
> +      * Parent thread (tgid) will close this window upon its exit.
> +      *
> +      * pid and mm references are taken when window is opened by
> +      * process (pid). So tgid is used only when child thread opens
> +      * a window and exits without closing it.
> +      */
> +     if (!tsk) {
> +             pid = task_ref->tgid;
> +             tsk = get_pid_task(pid, PIDTYPE_PID);
> +             /*
> +              * Parent thread (tgid) will be closing window when it
> +              * exits. So should not get here.
> +              */
> +             if (WARN_ON_ONCE(!tsk))
> +                     return;
> +     }
> +
> +     /* Return if the task is exiting. */
> +     if (tsk->flags & PF_EXITING) {
> +             put_task_struct(tsk);
> +             return;
> +     }

Just as an aside, I know this is existing code, after this series it 
might be good to think about factoring out this above chunk of code 
(possibly +/- the kthread_use_mm() bit), and put it together with the 
rest of the task/mm refcounting stuff.

Thanks,
Nick

> +
> +     kthread_use_mm(task_ref->mm);
> +     rc = copy_to_user(csb_addr, &csb, sizeof(csb));
> +     /*
> +      * User space polls on csb.flags (first byte). So add barrier
> +      * then copy first byte with csb flags update.
> +      */
> +     if (!rc) {
> +             csb.flags = CSB_V;
> +             /* Make sure update to csb.flags is visible now */
> +             smp_mb();
> +             rc = copy_to_user(csb_addr, &csb, sizeof(u8));
> +     }
> +     kthread_unuse_mm(task_ref->mm);
> +     put_task_struct(tsk);
> +

Reply via email to