Re: Fw: Re: [PATCH] fix page aging (2.4.9-ac12)

Ville Herva (vherva@mail.niksula.cs.hut.fi)
Thu, 20 Sep 2001 17:03:49 +0300


On Thu, Sep 20, 2001 at 03:48:06PM +0200, you [Stephan von Krawczynski] claimed:
> On Thu, 20 Sep 2001 15:32:26 +0200 Daniel Phillips <phillips@bonn-fries.net>
> wrote:
>
> > static inline void age_page_down(struct page *page)
> > {
> > page->age = max((int) (age - PAGE_AGE_DECL), 0);
> > }
>
> Aehm, Daniel. Just for a hint of what I know about C:
>
> IF age is unsigned long (like declared above) and PAGE_AGE_DECL is a define,
> then age-PAGE_AGE_DECL is of type unsigned long, which means it will not go
> below 0 but instead be huge positive, so your cast (int) before will not do any
> good, and you will not end up with 0 but somewhere above the clouds.
> So you just made Linus' max/min/cast point of view _very_ clear, I guess it was
> something like "people don't really think about using max/min and related
> problems".

age - PAGE_AGE_DECL may be a 2^32-1 or so, but when you cast it back to int,
it is at most 2^31 again. It rolls over, so you get the sign bit back.
Witness:

vherva@linux:/home/vherva>cat n.c
#define FOUR 4
void main()
{
unsigned three = 3;
printf("%u\n", three - FOUR);
printf("%i\n", (int)(three - FOUR));
printf("%i\n", (int)three - (int)FOUR);
}

vherva@linux:/home/vherva>./a.out
4294967295
-1
-1

Perhaps a lucky incidence, but it works as Daniel wrote it. (At least on
32-bit architecture.)

I agree that Rik's variant is much more readable.

-- v --

v@iki.fi
-
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/