From: Thomas Gleixner <tglx@linutronix.de>
To: Jeff Merkey <linux.mdb@gmail.com>
Cc: LKML <linux-kernel@vger.kernel.org>,
John Stultz <john.stultz@linaro.org>
Subject: Re: [BUG REPORT] ktime_get_ts64 causes Hard Lockup
Date: Wed, 20 Jan 2016 18:21:55 +0100 (CET) [thread overview]
Message-ID: <alpine.DEB.2.11.1601201754370.3575@nanos> (raw)
In-Reply-To: <CAO6TR8UnGPr+mLrOwk+Zc1zEDVa7K=igX48U0-N+ZBoMo66PuA@mail.gmail.com>
On Wed, 20 Jan 2016, Jeff Merkey wrote:
> On 1/20/16, Thomas Gleixner <tglx@linutronix.de> wrote:
> > On Tue, 19 Jan 2016, Jeff Merkey wrote:
> >> Nasty bug but trivial fix for this. What happens here is RAX (nsecs)
> >> gets set to a huge value (RAX = 0x17AE7F57C671EA7D) and passed through
> >
> > And how exactly does that happen?
> >
> > 0x17AE7F57C671EA7D = 1.70644e+18 nsec
> > = 1.70644e+09 sec
> > = 2.84407e+07 min
> > = 474011 hrs
> > = 19750.5 days
> > = 54.1109 years
> >
> > That's the real issue, not what you are trying to 'fix' in
> > timespec_add_ns()
> >
> >> Submitting a patch to fix this after I regress and test it. Since it
> >> makes no sense to loop on a simple calculation, fix should be:
> >>
> >> static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
> >> {
> >> a->tv_sec += div64_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns);
> >> a->tv_nsec = ns;
> >> }
> >
> > No. It's not that simple, because div64_u64_rem() is expensive on 32bit
> > architectures which have no hardware 64/32 division. And that's going to
> > hurt
> > for the normal tick case where we have at max one iteration.
> >
>
> It's less expensive than a hard coded loop that subtracts in a looping
> function as a substitute for dividing which is what is there. What a
> busted piece of shit .... LOL
Let's talk about shit.
timespec[64]_add_ns() is used for timekeeping and in all normal use cases the
nsec part is less than 1e9 nsec. Even on 64 bit a divide is more expensive
than the sinlge iteration while loop and its insane expensive on 32bit
machines which do not have a 64/32 divison in hardware.
The while loop is there for a few corner cases which are a bit larger than 1e9
nsecs, but that's not the case we optimize for.
The case you are creating with your debugger is something completely different
and we never thought about it nor cared about it. Why? Because so far nobody
complained and I never cared about kernel debuggers at all.
What's worse is that your 'fix' does not resolve the underlying issue at
all. Why? Simply because you tried to fix the symptom and not the root cause.
I explained you the root cause and I explained you why that while() loop is
more efficient than a divide for the case it was written and optimized for.
Instead of reading and understanding what I wrote you teach me that your
divide is more efficient and call it a busted piece of shit.
Sure you are free to call that a busted piece of shit, but you don't have to
expect that the people who wrote, maintain and understand that code are going
to put up with your attitude.
Thanks,
tglx
next prev parent reply other threads:[~2016-01-20 17:23 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-19 1:59 Jeff Merkey
2016-01-19 2:16 ` Jeff Merkey
2016-01-19 2:31 ` Jeff Merkey
2016-01-19 9:50 ` Thomas Gleixner
2016-01-19 15:37 ` Jeff Merkey
2016-01-19 22:00 ` Jeff Merkey
2016-01-20 0:59 ` Jeff Merkey
2016-01-20 9:21 ` Thomas Gleixner
2016-01-20 14:26 ` Thomas Gleixner
2016-01-20 16:40 ` Jeff Merkey
2016-01-20 16:53 ` Jeff Merkey
2016-01-20 17:16 ` Jeff Merkey
2016-01-20 17:32 ` John Stultz
2016-01-20 17:36 ` Jeff Merkey
2016-01-20 17:42 ` Thomas Gleixner
2016-01-20 17:59 ` John Stultz
2016-01-20 18:03 ` Jeff Merkey
2016-01-20 17:21 ` Thomas Gleixner [this message]
2016-01-20 17:33 ` Jeff Merkey
2016-01-20 19:34 ` Thomas Gleixner
2016-01-20 19:59 ` Jeff Merkey
2016-01-21 7:09 ` Jeff Merkey
2016-01-21 8:18 ` Jeff Merkey
2016-01-21 9:08 ` Jeff Merkey
2016-01-21 10:12 ` Thomas Gleixner
2016-01-21 15:46 ` Jeff Merkey
2016-01-21 16:57 ` Jeff Merkey
2016-01-21 17:00 ` Jeff Merkey
2016-01-21 17:07 ` Jeff Merkey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.DEB.2.11.1601201754370.3575@nanos \
--to=tglx@linutronix.de \
--cc=john.stultz@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux.mdb@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®