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;

}

