Messages in this thread | | | Subject | Re: [PATCH net-next 2/2] reciprocal_divide: correction/update of the algorithm | From | Ben Hutchings <> | Date | Thu, 16 Jan 2014 00:17:50 +0000 |
| |
On Thu, 2014-01-16 at 00:23 +0100, Daniel Borkmann wrote: [...] > --- a/include/linux/reciprocal_div.h > +++ b/include/linux/reciprocal_div.h [...] > + * RECIPROCAL_VALUE_TO_ZERO can be used to express an element, which > + * used as the argument to reciprocal_divide always yields zero. > */ [...] > +#define RECIPROCAL_VALUE_RESULT_TO_ZERO ((struct reciprocal_value){.sh1 = 32}) [...] > +static inline u32 reciprocal_divide(u32 a, struct reciprocal_value R) > { > - return (u32)(((u64)A * R) >> 32); > + u32 t = (u32)(((u64)a * R.m) >> 32); > + return (t + ((a - t) >> R.sh1)) >> R.sh2; [...]
(a - t) has type u32. So (a - t) >> 32 has undefined behaviour.
Ben.
-- Ben Hutchings, Staff Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
| |