> Date: Wed, 26 Dec 2018 19:47:41 -0800
> From: Jason Thorpe <thor...@me.com>
> 
> > On Dec 26, 2018, at 4:11 PM, Taylor R Campbell 
> > <campbell+netbsd-source-change...@mumble.net> wrote:
> > 
> > Caveat: Need to
> >   take care of the lwp name in threadpool_job_done so that we never
> >   point at the job_name of a job in oblivion.
> 
> Something like this.

Something like it, yes -- comments below.

> Index: kern_threadpool.c
> ===================================================================
> RCS file: /cvsroot/src/sys/kern/kern_threadpool.c,v
> retrieving revision 1.11
> diff -u -p -r1.11 kern_threadpool.c
> --- kern_threadpool.c 26 Dec 2018 22:16:26 -0000      1.11
> +++ kern_threadpool.c 27 Dec 2018 03:46:07 -0000
> @@ -695,6 +696,15 @@ threadpool_job_done(struct threadpool_jo
>  
>       cv_broadcast(&job->job_cv);
>       job->job_thread = NULL;
> +
> +     /*
> +      * We can safely read this field; it's only modified right before
> +      * we call the job work function, and we are only preserving it
> +      * use here; no one cares if it conains junk afterward.
> +      */
> +     lwp_lock(curlwp);
> +     curlwp->l_name = job->job_thread->tpt_lwp_savedname;
> +     lwp_unlock(curlwp);

Probably wanna dereference job->job_thread _before_ setting it to
NULL!

>  }
>  
>  void
> @@ -977,24 +987,22 @@ threadpool_thread(void *arg)
>  
>               struct threadpool_job *const job = thread->tpt_job;
>               KASSERT(job != NULL);
> -             mutex_spin_exit(&pool->tp_lock);
> -
> -             TP_LOG(("%s: running job '%s' on thread %p.\n",
> -                 __func__, job->job_name, thread));
>  
>               /* Set our lwp name to reflect what job we're doing.  */
>               lwp_lock(curlwp);
> -             char *const lwp_name = curlwp->l_name;
> +             thread->tpt_lwp_savedname = curlwp->l_name;
>               curlwp->l_name = job->job_name;
>               lwp_unlock(curlwp);
>  
> +             mutex_spin_exit(&pool->tp_lock);
> +
> +             TP_LOG(("%s: running job '%s' on thread %p.\n",
> +                 __func__, job->job_name, thread));
> +
>               /* Run the job.  */
>               (*job->job_fn)(job);
>  
> -             /* Restore our lwp name.  */
> -             lwp_lock(curlwp);
> -             curlwp->l_name = lwp_name;
> -             lwp_unlock(curlwp);
> +             /* lwp name restored in threadpool_job_done(). */

Don't just comment -- kassert!

KASSERTMSG((curlwp->l_name == lwp_name),
    "you forgot to call threadpool_job_done -- bad you!");

>               /* Job is done and its name is unreferenced.  Release it.  */
>               threadpool_job_rele(job);

Otherwise, yep, this looks like what I had in mind.

Reply via email to