On Sun, 4 Sep 2016, Liav Rehana wrote: Please do not top post and trim your reply.
> The root of the problem is that in case the multiplication of delta and > tkr->mult in the line that I've changed is too big that the MSB of the > result is set, then the shift will cause an unwanted sign extension. I completely understand that, but as I said before: > > This typecast is just a baindaid. What happens if you double the > > suspend time? The multiplication will simply overflow. So the proper > > fix is to sanity check delta and do multiple conversions if delta is > > big enough. Preferrably this happens somewhere at the call site and > > not in this hotpath function. > That sign extension will be avoided completely if the variable nsec was > unsigned (u64 instead of s64), so I think the correct solution for this > is to change the type of nsec to u64. That's a different story and its not a solution for the general problem of delta * mult >= (1 << 31) or delta * mult >= (1 << 32) Thanks, tglx