Re: PATCH(?): linux-2.4.4-pre2: fork should run child first

From: Hubertus Franke (frankeh@us.ibm.com)
Date: Fri Apr 13 2001 - 11:28:58 EST


First you are wrong by assuming that setting current->counter=0
will guarantee that the child runs first. In an SMP it only means
that this might initiate another recalculate and could run from
there in parallel with the child.

Actually quickly looking at the source code here.
You don't have to call schedule() at all.
A bit further down wake_up_process(p) is called, which in turn
calls reschedule_idle(p). Hence we don't have to call schedule.

If one satisfies the conditions:

(preemption_goodness(current,p,p->processor) > 1) then the child should
run.
[ with (child==p) and (parent==current) ].

This is for the uniprocessor system. In the SMP both could continue
to run. Looking at goodness computation, since p->mm == current->mm,
p->nice == current->nice and p->processor == current->processor,
all what matters is the difference in the counter values.
My proposed patch always yield 1, which ofcourse doesn't have the desired
effect.

Here is a patch that always yields a diff of 2. However for odd number of
current->counter it looses a token between the two.

     {
          long parcnt = current->counter;
          p->counter = (parcnt+((parcnt&1)?1:2)) >> 1;
          parcnt >>= 1;
          if (parcnt>0) {
               current->counter = 0;
               current->need_resched = 1;
          } else {
               current->counter = parcnt - 1;
     }

There is the other view that I should not loose a token.
In that case the following code will add a token in the odd counter case.
I think that this is preferrable over the first solution.

     p->counter = (current->counter+3)>>1;
     current->counter = (current->counter >> 1) - 1;
     if (current->counter <= 0) {
          current->counter = 0;
          current->need_resched = 1;
     }

Hubertus Franke
Enterprise Linux Group (Mgr), Linux Technology Center (Member Scalability)
, OS-PIC (Chair)
email: frankeh@us.ibm.com
(w) 914-945-2003 (fax) 914-945-4425 TL: 862-2003

"Adam J. Richter" <adam@yggdrasil.com> on 04/12/2001 08:42:12 PM

To: Hubertus Franke/Watson/IBM@IBMUS
cc:
Subject: Re: PATCH(?): linux-2.4.4-pre2: fork should run child first

> p->counter = (current->counter + 1) >> 1;
> current->counter = (current->counter - 1) >> 1;
> schedule();

     I don't have time to try this right now and I'm not sure
what locks are held at that point in the code or whether schedule()
will actually schedule a different process if the current one
has current->counter > 0 (even if current->need_resched is set and
even if another process has a higher proc->counter value).

     Even if it did work, your code is more complex and makes it
less likely that the child will reach exec() before the parent
runs again. So, I am not sure I would see the advantage if it did work.

Adam J. Richter __ ______________ 4880 Stevens Creek Blvd, Suite
104
adam@yggdrasil.com \ / San Jose, California 95129-1034
+1 408 261-6630 | g g d r a s i l United States of America
fax +1 408 261-6631 "Free Software For The Rest Of Us."

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Apr 15 2001 - 21:00:21 EST