svn commit: r184216 - head/sys/kern

Attilio Rao attilio at freebsd.org
Fri Oct 24 16:01:16 UTC 2008


2008/10/24 David Xu <davidxu at freebsd.org>:
> Author: davidxu
> Date: Fri Oct 24 01:03:31 2008
> New Revision: 184216
> URL: http://svn.freebsd.org/changeset/base/184216
>
> Log:
>  partly revert revision 184199, because TDF_NEEDSIGCHK is persitent
>  when thread is in kernel mode, it can cause dead loop, now unlock
>  process lock after acquired sleep queue lock and thread lock to
>  avoid the problem. This means TDF_NEEDSIGCHK and TDF_NEEDSUSPCHK must
>  be set with process lock and thread lock being hold at same time.
>
> Modified:
>  head/sys/kern/subr_sleepqueue.c
>
> Modified: head/sys/kern/subr_sleepqueue.c
> ==============================================================================
> --- head/sys/kern/subr_sleepqueue.c     Thu Oct 23 21:50:16 2008        (r184215)
> +++ head/sys/kern/subr_sleepqueue.c     Fri Oct 24 01:03:31 2008        (r184216)
> @@ -396,7 +396,6 @@ sleepq_catch_signals(void *wchan, int pr
>                return (0);
>        }
>
> -catch_sig:
>        thread_unlock(td);
>        mtx_unlock_spin(&sc->sc_lock);
>        CTR3(KTR_PROC, "sleepq catching signals: thread %p (pid %ld, %s)",
> @@ -416,19 +415,15 @@ catch_sig:
>                        ret = ERESTART;
>                mtx_unlock(&ps->ps_mtx);
>        }
> -       PROC_UNLOCK(p);
>
>        mtx_lock_spin(&sc->sc_lock);
>        thread_lock(td);
> -       if (ret != 0)
> -               goto out;
> -       if ((td->td_flags & (TDF_NEEDSIGCHK | TDF_NEEDSUSPCHK)) != 0)
> -               goto catch_sig;
> -
> -       sleepq_switch(wchan, pri);
> -       return (0);
> +       PROC_UNLOCK(p);
> +       if (ret == 0) {
> +               sleepq_switch(wchan, pri);
> +               return (0);
> +       }
>
> -out:
>        /*
>         * There were pending signals and this thread is still
>         * on the sleep queue, remove it from the sleep queue.
>

As long as this is a variation about the usual scheme in the td_flags
locking, you should document that with a comment IMHO.

Thanks,
Attilio


-- 
Peace can only be achieved by understanding - A. Einstein


More information about the svn-src-head mailing list