![]() | |||||||||||
Messages in this thread |
On Fri, 18 May 2007 12:41:24 -0700 bugme-daemon@bugzilla.kernel.org wrote: > http://bugzilla.kernel.org/show_bug.cgi?id=8501 Problem. gcc-4.3 appears to have cunningly converted this: static inline void timespec_add_ns(struct timespec *a, u64 ns) { ns += a->tv_nsec; while(unlikely(ns >= NSEC_PER_SEC)) { ns -= NSEC_PER_SEC; a->tv_sec++; } a->tv_nsec = ns; } into a divide-by-1000000000 operation, so it emits a call to udivdi3 and we don't link. I expect that this optimisation will remain in gcc-4.3 and we'll end up having major kernel releases which don't build on i386 with major gcc releases, which isn't altogether desirable. I suspect we'll need to fix this fairly urgently, and to backport the fix into a number of kernel releases. We use the above idiom in several places. A suitable fix might be to hunt down those various sites and then make them call a helper function which does if (unlikely(ns >= NSEC_PER_SEC)) { do_div(...) } (Better would be to inline the comparison and to uninline the do_div(), if it's a 32-bit arch. Doing all this in a backportable fashion may prove tricky) - 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/ | ||||||||||
| Last update: 2007-05-19 00:35 [from the cache] ©2003-2008 | |||||||||||