Messages in this thread | | | From | Andy Lutomirski <> | Date | Fri, 6 Nov 2015 16:49:19 -0800 | Subject | Re: [GIT] Networking |
| |
On Fri, Nov 6, 2015 at 7:27 AM, David Laight <David.Laight@aculab.com> wrote: >> From: Linus Torvalds >> Sent: 03 November 2015 20:45 >> On Tue, Nov 3, 2015 at 12:05 PM, Linus Torvalds >> <torvalds@linux-foundation.org> wrote: >> > result = add_overflow( >> > mul_overflow(sec, SEC_CONVERSION, &overflow), >> > mul_overflow(nsec, NSEC_CONVERSION, &overflow), >> > &overflow); >> > >> > return overflow ? MAX_JIFFIES : result; >> >> Thinking more about this example, I think the gcc interface for >> multiplication overflow is fine. >> >> It would end up something like >> >> if (mul_overflow(sec, SEC_CONVERSION, &sec)) >> return MAX_JIFFY_OFFSET; >> if (mul_overflow(nsec, NSEC_CONVERSION, &nsec)) >> return MAX_JIFFY_OFFSET; >> sum = sec + nsec; >> if (sum < sec || sum > MAX_JIFFY_OFFSET) >> return MAX_JIFFY_OFFSET; >> return sum; >> >> and that doesn't look horribly ugly to me. > > If mul_overflow() is a real function you've just forced some of the > values out to memory, generating a 'clobber' for all memory > (unless 'strict-aliasing' is enabled) and making a mess of other > optimisations. > (If it is a static inline that might not happen.)
I doubt anyone would ever make it a real function. On new gcc, it would be an inline backed by an intrinsic. On old gcc it would be a normal inline or perhaps an inline with inline asm in it.
--Andy
| |