LJ Archive

Listing 3. Goodness Function

/* linux/kernel/sched.c
* This is the function that decides how desirable a process is.
* You can weigh different processes against each other depending
 * on what CPU they've run on lately etc to try to handle cache
 * and TLB miss penalties.
 *
 * Return values:
 *  -1000: never select this
 *      0: out of time, recalculate counters (but it might still
 *      be
 *    selected)
 *    +ve: "goodness" value (the larger, the better)
 *  +1000: realtime process, select this.
 */
static inline int goodness(struct task_struct * p, int this_cpu, struct
mm_struct *this_mm)
{
   int weight;
   /*
    * Realtime process, select the first one on the
    * runqueue (taking priorities within processes
    * into account).
    */
   if (p->policy != SCHED_OTHER) {
      weight = 1000 + p->rt_priority;
      goto out;
   }
   /*
    * Give the process a first-approximation goodness value
    * according to the number of clock-ticks it has left.
    *
    * Don't do any other calculations if the time slice is
    * over..
    */
   weight = p->counter;
   if (!weight)
      goto out;

#ifdef __SMP__
   /* Give a largish advantage to the same processor...  */
   /* (this is equivalent to penalizing other processors) */
   if (p->processor == this_cpu)
      weight += PROC_CHANGE_PENALTY;
#endif
   /* .. and a slight advantage to the current MM */
   if (p->mm == this_mm)
      weight += 1;
   weight += p->priority;
out:
   return weight;
}
LJ Archive