schedcpu() in /sys/kern/sched_4bsd.c calls thread_lock() on thread with un-initialized td_lock

Svatopluk Kraus onwahe at gmail.com
Fri Apr 1 11:05:22 UTC 2011


> Here is a larger patch:
>
> Index: kern/kern_ktrace.c
> ===================================================================
> --- kern/kern_ktrace.c  (revision 220190)
> +++ kern/kern_ktrace.c  (working copy)
> @@ -882,7 +882,8 @@
>                nfound = 0;
>                LIST_FOREACH(p, &pg->pg_members, p_pglist) {
>                        PROC_LOCK(p);
> -                       if (p_cansee(td, p) != 0) {
> +                       if (p->p_state == PRS_NEW ||
> +                           p_cansee(td, p) != 0) {
>                                PROC_UNLOCK(p);
>                                continue;
>                        }
> Index: kern/kern_sig.c
> ===================================================================
> --- kern/kern_sig.c     (revision 220190)
> +++ kern/kern_sig.c     (working copy)
> @@ -1799,7 +1799,8 @@
>                PGRP_LOCK_ASSERT(pgrp, MA_OWNED);
>                LIST_FOREACH(p, &pgrp->pg_members, p_pglist) {
>                        PROC_LOCK(p);
> -                       if (checkctty == 0 || p->p_flag & P_CONTROLT)
> +                       if (p->p_state == PRS_NORMAL &&
> +                           (checkctty == 0 || p->p_flag & P_CONTROLT))
>                                pksignal(p, sig, ksi);
>                        PROC_UNLOCK(p);
>                }
> @@ -3313,7 +3314,8 @@
>                PGRP_LOCK(sigio->sio_pgrp);
>                LIST_FOREACH(p, &sigio->sio_pgrp->pg_members, p_pglist) {
>                        PROC_LOCK(p);
> -                       if (CANSIGIO(sigio->sio_ucred, p->p_ucred) &&
> +                       if (p->p_state == PRS_NORMAL &&
> +                           CANSIGIO(sigio->sio_ucred, p->p_ucred) &&
>                            (checkctty == 0 || (p->p_flag & P_CONTROLT)))
>                                psignal(p, sig);
>                        PROC_UNLOCK(p);
> Index: kern/kern_clock.c
> ===================================================================
> --- kern/kern_clock.c   (revision 220190)
> +++ kern/kern_clock.c   (working copy)
> @@ -201,6 +201,10 @@
>                tryl = 0;
>                FOREACH_PROC_IN_SYSTEM(p) {
>                        PROC_LOCK(p);
> +                       if (p->p_state == PRS_NEW) {
> +                               PROC_UNLOCK(p);
> +                               continue;
> +                       }
>                        FOREACH_THREAD_IN_PROC(p, td) {
>
>                                /*
> Index: kern/sched_4bsd.c
> ===================================================================
> --- kern/sched_4bsd.c   (revision 220190)
> +++ kern/sched_4bsd.c   (working copy)
> @@ -463,6 +463,10 @@
>        sx_slock(&allproc_lock);
>        FOREACH_PROC_IN_SYSTEM(p) {
>                PROC_LOCK(p);
> +               if (p->p_state == PRS_NEW) {
> +                       PROC_UNLOCK(p);
> +                       continue;
> +               }
>                FOREACH_THREAD_IN_PROC(p, td) {
>                        awake = 0;
>                        thread_lock(td);
> Index: kern/kern_resource.c
> ===================================================================
> --- kern/kern_resource.c        (revision 220190)
> +++ kern/kern_resource.c        (working copy)
> @@ -129,7 +129,8 @@
>                sx_sunlock(&proctree_lock);
>                LIST_FOREACH(p, &pg->pg_members, p_pglist) {
>                        PROC_LOCK(p);
> -                       if (p_cansee(td, p) == 0) {
> +                       if (p->p_state == PRS_NORMAL &&
> +                           p_cansee(td, p) == 0) {
>                                if (p->p_nice < low)
>                                        low = p->p_nice;
>                        }
> @@ -215,7 +216,8 @@
>                sx_sunlock(&proctree_lock);
>                LIST_FOREACH(p, &pg->pg_members, p_pglist) {
>                        PROC_LOCK(p);
> -                       if (p_cansee(td, p) == 0) {
> +                       if (p->p_state == PRS_NORMAL &&
> +                           p_cansee(td, p) == 0) {
>                                error = donice(td, p, uap->prio);
>                                found++;
>                        }
> @@ -230,7 +232,8 @@
>                sx_slock(&allproc_lock);
>                FOREACH_PROC_IN_SYSTEM(p) {
>                        PROC_LOCK(p);
> -                       if (p->p_ucred->cr_uid == uap->who &&
> +                       if (p->p_state == PRS_NORMAL &&
> +                           p->p_ucred->cr_uid == uap->who &&
>                            p_cansee(td, p) == 0) {
>                                error = donice(td, p, uap->prio);
>                                found++;
> Index: vm/vm_glue.c
> ===================================================================
> --- vm/vm_glue.c        (revision 220190)
> +++ vm/vm_glue.c        (working copy)
> @@ -730,7 +730,8 @@
>        sx_slock(&allproc_lock);
>        FOREACH_PROC_IN_SYSTEM(p) {
>                PROC_LOCK(p);
> -               if (p->p_flag & (P_SWAPPINGOUT | P_SWAPPINGIN | P_INMEM)) {
> +               if (p->p_state == PRS_NEW ||
> +                   p->p_flag & (P_SWAPPINGOUT | P_SWAPPINGIN | P_INMEM)) {
>                        PROC_UNLOCK(p);
>                        continue;
>                }
>
> --
> John Baldwin
>

Thanks for larger patch. If the problem persists on another place, I
send a word.


More information about the freebsd-current mailing list