> -----Original Message----- > From: netdev-ow...@vger.kernel.org [mailto:netdev-ow...@vger.kernel.org] On > Behalf Of Arnd Bergmann > Sent: Monday, February 25, 2019 6:46 AM > To: Kirsher, Jeffrey T <jeffrey.t.kirs...@intel.com> > Cc: David Miller <da...@davemloft.net>; Brandeburg, Jesse > <jesse.brandeb...@intel.com>; Networking <netdev@vger.kernel.org>; > nhor...@redhat.com; sassm...@redhat.com; jogre...@redhat.com > Subject: Re: [net-next 05/14] i40e: fix up 32 bit timespec references > > On Wed, Jul 26, 2017 at 12:33 PM Jeff Kirsher > <jeffrey.t.kirs...@intel.com> wrote: > > > > From: Jesse Brandeburg <jesse.brandeb...@intel.com> > > > > As it turns out there was only a small set of errors > > on 32 bit, and we just needed to be using the right calls > > for dealing with timespec64 variables. > > I just stumbled over code added by this older patch, and can't make sense > of the commit description here. Was this an attempt to fix a bug, or > just a cleanup? > > > > > - then = ns_to_timespec64(delta); > > mutex_lock(&pf->tmreg_lock); > > > > i40e_ptp_read(pf, &now); > > - now = timespec64_add(now, then); > > + timespec64_add_ns(&now, delta); > > i40e_ptp_write(pf, (const struct timespec64 *)&now); > > The problem I noticed here is that 'delta' is a user provided 64-bit > number from clock_adjtime(), and timespec64_add_ns() performs uses > a repeated addition instead of a div/mod pair. When the number > is large, we may end up adding a single second 8 billion times, > which may take a while even on a fast CPU. >
It looked like the timespec64_add_ns does a div/mod pair...? Or am I mis-reading how the function is implemented? Quite probably. Either way, the code is incorrect, because timespec64_add_ns doesn't actually work with signed values. A negative delta actually ends up resulting in a significant positive addition. Woops! > Should the commit 0ac30ce43323 ("i40e: fix up 32 bit timespec > references") just be reverted? > Yea, let's revert it. Thanks, Jake > Arnd