Q:

Difference between 'Niceness' and 'Goodness' in linux kernel 2.4.27

I am trying to understand linux kernel code for task scheduler. 
I am not able to figure out what is goodness value and how it differs from niceness? 
Also, how each of them contribute to scheduling? 

A:

AFAIK: Each process in the run queue is assigned a "goodness" value which determines how good a process is for running.  This value is calculated by the goodness() function.  
The process with higher goodness will be the next process to run.  If no process is available for running, then the operating system selects a special idle task. 
A first-approximation of "goodness" is calculated according to the number of ticks left in the process quantum.  This means that the goodness of a process decreases with time, until it becomes zero when the time quantum of the task expires. 
The final goodness is calculated in function of the niceness of the process.  So basically goodness of a process is a combination of the Time slice left logic and nice value. 
static inline int goodness(struct task_struct * p, int this_cpu, struct mm_struct *this_mm)
{
        int weight;

        /*
         * select the current process after every other
         * runnable process, but before the idle thread. 
         * Also, dont trigger a counter recalculation. 
         */

        weight = -1;
        if (p->policy & SCHED_YIELD)
                goto out;
        if (p->policy == SCHED_OTHER) {
                /*
                 * 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;
                ...
                weight += 20 - p->nice;
                goto out;
        }

        /* code for real-time processes goes here */

  out:
        return weight;
}

TO UNDERSTAND and REMEMBER NICE value: remember this. 
The etymology of Nice value is that a "nicer" process allows for more time for other processes to run, hence lower nice value translates to higher priority. 
So, 
Higher the goodness value -> More likely to Run
    Higher the nice value  -> Less likely to run. 

Also Goodness value is calculated using the nice value as 
20 - p->nice

Since nice value ranges from -20 ( highest priority) to 19 ( lowest priority)
lets assume a nice value of -20 ( EXTREMELY NOT NICE).  hence 20 - (-20) = 40

Which means the goodness value has increased, hence this process will be chosen.