On Sat, Nov 20, 2010 at 00:19, Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> wrote: > On Fri, 19 Nov 2010 15:04:11 -0800 > Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> wrote: > >> > Looks good to me. ÂI posted essentially the same thing some 3 months ago >> > (http://marc.info/?l=linux-kernel&m=128033094822201&w=2) but it then >> > failed to get any traction. ÂAt any rate, I like your version better as >> > it seems more readable. >> > >> >> I spose we should document it. Â Does this look complete and accurate? >> >> --- a/include/linux/kernel.h~include-linux-kernelh-abs-fix-handling-of-32-bit-unsigneds-on-64-bit-fix >> +++ a/include/linux/kernel.h >> @@ -143,6 +143,13 @@ extern int _cond_resched(void); >> >> Â#define might_sleep_if(cond) do { if (cond) might_sleep(); } while (0) >> >> +/* >> + * abs() handles unsigned and signed longs, ints, shorts and chars. ÂFor long >> + * types it returns a signed long. ÂFor int, short and char types it returns a >> + * signed int. >> + * abs() should not be used for 64-bit types (s64, u64, long long) - use abs64() >> + * for those. >> + */ >> Â#define abs(x) ({ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\ >> Â Â Â Â Â Â Â long ret; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \ >> Â Â Â Â Â Â Â if (sizeof(x) == sizeof(long)) { Â Â Â Â Â Â Â Â\ > > Well that was a load of bollocks. Â2nd attempt: Yeah, I was just gonna complain "but long _is_ 64-bit on 64-bit platforms"... > --- a/include/linux/kernel.h~include-linux-kernelh-abs-fix-handling-of-32-bit-unsigneds-on-64-bit-fix > +++ a/include/linux/kernel.h > @@ -143,6 +143,12 @@ extern int _cond_resched(void); > > Â#define might_sleep_if(cond) do { if (cond) might_sleep(); } while (0) > > +/* > + * abs() handles unsigned and signed longs, ints, shorts and chars. ÂFor all > + * input types abs() returns a signed long. > + * abs() should not be used for 64-bit types (s64, u64, long long) - use abs64() > + * for those. > + */ > Â#define abs(x) ({ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â\ > Â Â Â Â Â Â Â Âlong ret; Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â \ > Â Â Â Â Â Â Â Âif (sizeof(x) == sizeof(long)) { Â Â Â Â Â Â Â Â\ After some second thinking, I think this is OK... In the first patch: > of similarity between video modes. The arguments of abs() are sometimes > unsigned numbers. This worked fine until commit a49c59c0 ("Make sure the The "sometimes" is when the parameter is the difference of 2 numbers, which is a highly likely use case. Unlike most people's intuitive mathematical feelings, a difference is always unsigned in C (that was incorrect in the comment of Michal's first version). So I think it's worth mentioning that explicitly. ... and please llet me do the third thinking during the rest of the day ;-) Gr{oetje,eeting}s, Â Â Â Â Â Â Â Â Â Â Â Â Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. Â Â Â Â Â Â Â Â Â Â Â Â Â ÂÂ ÂÂ -- Linus Torvalds -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html