Re: [2.6.16-rc6 patch] fix interactive task starvation
From: Andrew Morton
Date: Sat Mar 18 2006 - 01:22:40 EST
Mike Galbraith <efault@xxxxxx> wrote:
>
> > Does this have to be a macro?
> >
>
> I suppose not, now inlined.
>
It would be nice to uninline the function and then to modify it in a
followup patch. That way, we get to see what changed, which is one of the
reasons to not use megamacros (sorry).
> +static inline int expired_starving(runqueue_t *rq)
> +{
> + int limit = STARVATION_LIMIT * rq->nr_running, starving;
> +
> + if (!limit || !rq->expired_timestamp)
> + return 0;
> + starving = jiffies - rq->expired_timestamp >= limit;
> + starving += rq->curr->static_prio > rq->best_expired_prio;
> +
> + return starving;
> +}
ick. Is that really what that macros does??
The function returns a boolean, so we should short-circuit the evaluation
where possible.
static inline int expired_starving(runqueue_t *rq)
{
int limit;
/* Comment goes here */
if (!rq->expired_timestamp)
return 0;
limit = STARVATION_LIMIT * rq->nr_running;
/* Here too */
if (!limit)
return 0;
/* And here */
if (jiffies - rq->expired_timestamp >= limit)
return 1;
/* And here */
if (rq->curr->static_prio > rq->best_expired_prio)
return 1;
/* And here */
return 0;
}
This way
a) We get somewhere to put comments describing each step of the logic.
b) We get to select the order of the comparisons in decreasing
(probability*expensiveness) order.
See how you're performing an unneeded multiplication if
!rq->expired_timestamp?
c) See how the first test of `limit' comes after that multiplication?
STARVATION_LIMIT is a constant (isn't it?) If so, we need only test
rq->nr_running.
d) The next guy who comes along has to update the comments ;)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/