Subject: Re: more on exit performance
To: David Laight <david@l8s.co.uk>
From: Jaromir Dolecek <jdolecek@NetBSD.org>
List: tech-perform
Date: 11/02/2003 11:59:10
David Laight wrote:
> > (2) for (pid == -1), we can keep the stopped and dead children on
> > separate lists, and only look at the list(s) that we care about.
>
> Why not just requeue a stopped child at the top of the sibling list?
> It will save all the extra pointers (and data structures to get wrong!).
> I don't know how how many children the benchmark process has, but I
> suspet it is a lot! Even then this gains <10%, for a normal process
> (and system workload) it must be noise.
It would be very easy to optimize the WAIT_ANY zombie lookup by looking
at zombproc - that list should be mostly empty and the lookup
should be faster than loop over children.
> > (3) for (pid < -1), we can similarly look up the pgrp in pid_table
> > and keep the stopped and dead children on separate lists in the pgrp.
>
> Can't possibly happen often enough to worry about.
Yeah, I don't think wait on pgrp is used very often.
> David
>
> Index: kern_exit.c
> ===================================================================
> RCS file: /cvsroot/src/sys/kern/kern_exit.c,v
> retrieving revision 1.124
> diff -u -p -r1.124 kern_exit.c
> --- kern_exit.c 2003/09/16 13:46:24 1.124
> +++ kern_exit.c 2003/11/02 10:39:49
> @@ -718,10 +727,16 @@ find_stopped_child(struct proc *parent,
> for (;;) {
> c_found = 0;
> LIST_FOREACH(child, &parent->p_children, p_sibling) {
> - if (pid != WAIT_ANY &&
> - child->p_pid != pid &&
> - child->p_pgid != -pid)
> - continue;
> + if (pid >= 0) {
> + if (child->p_pid != pid) {
> + child = pfind(pid);
> + if (child == NULL
> + || child->p_parent != parent)
> + break;
This should be outside the LIST_FOREACH() loop. Also, this only
optimizes asleep child lookup, not zombie lookup. Given that
more frequent operation is wait for deceased child, we should
optimize that operation too.
> + }
> + } else
> + if (pid != WAIT_ANY && child->p_pgid != -pid)
> + continue;
> /*
> * Wait for processes with p_exitsig != SIGCHLD
> * processes only if WALTSIG is set; wait for
> @@ -730,8 +745,11 @@ find_stopped_child(struct proc *parent,
> */
> if (((options & WALLSIG) == 0) &&
> (options & WALTSIG ? child->p_exitsig == SIGCHLD
> - : P_EXITSIG(child) != SIGCHLD))
> + : P_EXITSIG(child) != SIGCHLD)){
> + if (child->p_pid == pid)
> + break;
> continue;
> + }
>
> c_found = 1;
> if (child->p_stat == SZOMB &&
> @@ -748,6 +766,8 @@ find_stopped_child(struct proc *parent,
> *child_p = child;
> return 0;
> }
> + if (child->p_pid == pid)
> + break;
> }
> if (c_found == 0)
> return ECHILD;
> --
> David Laight: david@l8s.co.uk
>
--
Jaromir Dolecek <jdolecek@NetBSD.org> http://www.NetBSD.cz/
-=- We should be mindful of the potential goal, but as the tantric -=-
-=- Buddhist masters say, ``You may notice during meditation that you -=-
-=- sometimes levitate or glow. Do not let this distract you.'' -=-