From: Joe Perches <joe@perches.com>
To: John Stultz <john.stultz@linaro.org>,
Dmitry Torokhov <dmitry.torokhov@gmail.com>,
Neil Brown <neilb@suse.com>, Daniel Mack <daniel@zonque.org>,
Haojian Zhuang <haojian.zhuang@gmail.com>,
Robert Jarzmik <robert.jarzmik@free.fr>,
Mark Brown <broonie@kernel.org>, Jaegeuk Kim <jaegeuk@kernel.org>,
Changman Lee <cm224.lee@samsung.com>,
Chao Yu <chao2.yu@samsung.com>
Cc: "Miroslav Lichvar" <mlichvar@redhat.com>,
"Nuno Gonçalves" <nunojpg@gmail.com>,
"Thomas Gleixner" <tglx@linutronix.de>,
LKML <linux-kernel@vger.kernel.org>,
"Günter Köllner" <dl4mea@yahoo.de>,
stable <stable@vger.kernel.org>
Subject: defects for uses of abs(u64) (was: Re: Regression: can't apply frequency offsets above 1000ppm)
Date: Fri, 04 Sep 2015 18:39:39 -0700 [thread overview]
Message-ID: <1441417179.28194.35.camel@perches.com> (raw)
In-Reply-To: <CALAqxLWz8DPxDsMn+isikODOjkmMNYe3iyqymXhs=UausLbA7Q@mail.gmail.com>
On Fri, 2015-09-04 at 18:00 -0700, John Stultz wrote:
> On Fri, Sep 4, 2015 at 5:57 PM, John Stultz <john.stultz@linaro.org> wrote:
> > On Thu, Sep 3, 2015 at 4:26 AM, Miroslav Lichvar <mlichvar@redhat.com> wrote:
> >> On Wed, Sep 02, 2015 at 04:16:00PM -0700, John Stultz wrote:
> >>> On Tue, Sep 1, 2015 at 6:14 PM, Nuno Gonçalves <nunojpg@gmail.com> wrote:
> >>> > And just installing chrony from the feeds. With any kernel from 3.17
> >>> > you'll have wrong estimates at chronyc sourcestats.
> >>>
> >>> Wrong estimates? Could you be more specific about what the failure
> >>> you're seeing is here? The
> >>>
> >>> I installed the image above, which comes with a 4.1.6 kernel, and
> >>> chrony seems to have gotten my BBB into ~1ms sync w/ servers over the
> >>> internet fairly quickly (at least according to chronyc tracking).
> >>
> >> To see the bug with chronyd the initial offset shouldn't be very close
> >> to zero, so it's forced to correct the offset by adjusting the
> >> frequency in a larger step.
> >>
> >> I'm attaching a simple C program that prints the frequency offset
> >> as measured between the REALTIME and MONOTONIC_RAW clocks when the
> >> adjtimex tick is set to 9000. It should show values close to -100000
> >> ppm and I suspect on the BBB it will be much smaller.
> >
> > So I spent some time on this late last night and this afternoon.
> >
> > It was a little odd because things don't seem totally broken, but
> > something isn't quite right.
> >
> > Digging around it seems the iterative logrithmic approximation done in
> > timekeeping_freqadjust() wasn't working right. Instead of making
> > smaller order alternating positive and negative adjustments, it was
> > doing strange growing adjustments for the same value that wern't large
> > enough to actually correct things very quickly. This made it much
> > slower to adapt to specified frequency values.
> >
> > The odd bit, is it seems to come down to:
> > tick_error = abs(tick_error);
> >
> > Haven't chased down why yet, but apparently abs() isn't doing what one
> > would think when passed a s64 value.
>
> Well.. chasing it down wasn't hard.. from include/linux/kernel.h:
> /*
> * abs() handles unsigned and signed longs, ints, shorts and chars. For all
> * input types abs() returns a signed long.
> * abs() should not be used for 64-bit types (s64, u64, long long) - use abs64()
> * for those.
> */
>
> Ouch.
Here's a little cocci script that finds more of these in:
lib/percpu_counter.c
drivers/input/joystick/walkera0701.c
drivers/md/raid5.c
drivers/spi/spi-pxa2xx.c
fs/f2fs/debug.c
$ cat abs.cocci
@@
u64 t;
@@
* abs(t)
@@
s64 t;
@@
* abs(t)
@@
long long t;
@@
* abs(t)
@@
unsigned long long t;
@@
* abs(t)
@@
uint64_t t;
@@
* abs(t)
@@
int64_t t;
@@
* abs(t)
$
diff -u -p ./lib/percpu_counter.c /tmp/nothing/lib/percpu_counter.c
--- ./lib/percpu_counter.c
+++ /tmp/nothing/lib/percpu_counter.c
@@ -203,7 +203,6 @@ int __percpu_counter_compare(struct perc
count = percpu_counter_read(fbc);
/* Check to see if rough count will be sufficient for comparison */
- if (abs(count - rhs) > (batch * num_online_cpus())) {
if (count > rhs)
return 1;
else
diff -u -p ./drivers/input/joystick/walkera0701.c /tmp/nothing/drivers/input/joystick/walkera0701.c
--- ./drivers/input/joystick/walkera0701.c
+++ /tmp/nothing/drivers/input/joystick/walkera0701.c
@@ -150,7 +150,6 @@ static void walkera0701_irq_handler(void
if (w->counter == 24) { /* full frame */
walkera0701_parse_frame(w);
w->counter = NO_SYNC;
- if (abs(pulse_time - SYNC_PULSE) < RESERVE) /* new frame sync */
w->counter = 0;
} else {
if ((pulse_time > (ANALOG_MIN_PULSE - RESERVE)
@@ -161,7 +160,6 @@ static void walkera0701_irq_handler(void
} else
w->counter = NO_SYNC;
}
- } else if (abs(pulse_time - SYNC_PULSE - BIN0_PULSE) <
RESERVE + BIN1_PULSE - BIN0_PULSE) /* frame sync .. */
w->counter = 0;
diff -u -p ./drivers/md/raid5.c /tmp/nothing/drivers/md/raid5.c
--- ./drivers/md/raid5.c
+++ /tmp/nothing/drivers/md/raid5.c
@@ -6701,8 +6701,6 @@ static int run(struct mddev *mddev)
* readonly mode so it can take control before
* allowing any writes. So just check for that.
*/
- if (abs(min_offset_diff) >= mddev->chunk_sectors &&
- abs(min_offset_diff) >= mddev->new_chunk_sectors)
/* not really in-place - so OK */;
else if (mddev->ro == 0) {
printk(KERN_ERR "md/raid:%s: in-place reshape "
diff -u -p ./drivers/spi/spi-pxa2xx.c /tmp/nothing/drivers/spi/spi-pxa2xx.c
--- ./drivers/spi/spi-pxa2xx.c
+++ /tmp/nothing/drivers/spi/spi-pxa2xx.c
@@ -786,7 +786,6 @@ static unsigned int quark_x1000_get_clk_
/* Get the remainder */
fssp = (u64)fref * m;
do_div(fssp, 1 << 24);
- r1 = abs(fssp - rate);
/* Choose this one if it suits better */
if (r1 < r) {
diff -u -p ./fs/f2fs/debug.c /tmp/nothing/fs/f2fs/debug.c
--- ./fs/f2fs/debug.c
+++ /tmp/nothing/fs/f2fs/debug.c
@@ -109,7 +109,6 @@ static void update_sit_info(struct f2fs_
hblks_per_sec = blks_per_sec / 2;
for (segno = 0; segno < MAIN_SEGS(sbi); segno += sbi->segs_per_sec) {
vblocks = get_valid_blocks(sbi, segno, sbi->segs_per_sec);
- dist = abs(vblocks - hblks_per_sec);
bimodal += dist * dist;
if (vblocks > 0 && vblocks < blks_per_sec) {
WARNING: multiple messages have this Message-ID (diff)
From: Joe Perches <joe@perches.com>
To: John Stultz <john.stultz@linaro.org>,
Dmitry Torokhov <dmitry.torokhov@gmail.com>,
Neil Brown <neilb@suse.com>, Daniel Mack <daniel@zonque.org>,
Haojian Zhuang <haojian.zhuang@gmail.com>,
Robert Jarzmik <robert.jarzmik@free.fr>,
Mark Brown <broonie@kernel.org>, Jaegeuk Kim <jaegeuk@kernel.org>,
Changman Lee <cm224.lee@samsung.com>,
Chao Yu <chao2.yu@samsung.com>
Cc: "Miroslav Lichvar" <mlichvar@redhat.com>,
"Nuno Gonçalves" <nunojpg@gmail.com>,
"Thomas Gleixner" <tglx@linutronix.de>,
LKML <linux-kernel@vger.kernel.org>,
"Günter Köllner" <dl4mea@yahoo.de>,
stable <stable@vger.kernel.org>
Subject: defects for uses of abs(u64) (was: Re: Regression: can't apply frequency offsets above 1000ppm)
Date: Fri, 04 Sep 2015 18:39:39 -0700 [thread overview]
Message-ID: <1441417179.28194.35.camel@perches.com> (raw)
In-Reply-To: <CALAqxLWz8DPxDsMn+isikODOjkmMNYe3iyqymXhs=UausLbA7Q@mail.gmail.com>
On Fri, 2015-09-04 at 18:00 -0700, John Stultz wrote:
> On Fri, Sep 4, 2015 at 5:57 PM, John Stultz <john.stultz@linaro.org> wrote:
> > On Thu, Sep 3, 2015 at 4:26 AM, Miroslav Lichvar <mlichvar@redhat.com> wrote:
> >> On Wed, Sep 02, 2015 at 04:16:00PM -0700, John Stultz wrote:
> >>> On Tue, Sep 1, 2015 at 6:14 PM, Nuno Gon�alves <nunojpg@gmail.com> wrote:
> >>> > And just installing chrony from the feeds. With any kernel from 3.17
> >>> > you'll have wrong estimates at chronyc sourcestats.
> >>>
> >>> Wrong estimates? Could you be more specific about what the failure
> >>> you're seeing is here? The
> >>>
> >>> I installed the image above, which comes with a 4.1.6 kernel, and
> >>> chrony seems to have gotten my BBB into ~1ms sync w/ servers over the
> >>> internet fairly quickly (at least according to chronyc tracking).
> >>
> >> To see the bug with chronyd the initial offset shouldn't be very close
> >> to zero, so it's forced to correct the offset by adjusting the
> >> frequency in a larger step.
> >>
> >> I'm attaching a simple C program that prints the frequency offset
> >> as measured between the REALTIME and MONOTONIC_RAW clocks when the
> >> adjtimex tick is set to 9000. It should show values close to -100000
> >> ppm and I suspect on the BBB it will be much smaller.
> >
> > So I spent some time on this late last night and this afternoon.
> >
> > It was a little odd because things don't seem totally broken, but
> > something isn't quite right.
> >
> > Digging around it seems the iterative logrithmic approximation done in
> > timekeeping_freqadjust() wasn't working right. Instead of making
> > smaller order alternating positive and negative adjustments, it was
> > doing strange growing adjustments for the same value that wern't large
> > enough to actually correct things very quickly. This made it much
> > slower to adapt to specified frequency values.
> >
> > The odd bit, is it seems to come down to:
> > tick_error = abs(tick_error);
> >
> > Haven't chased down why yet, but apparently abs() isn't doing what one
> > would think when passed a s64 value.
>
> Well.. chasing it down wasn't hard.. from include/linux/kernel.h:
> /*
> * abs() handles unsigned and signed longs, ints, shorts and chars. For all
> * input types abs() returns a signed long.
> * abs() should not be used for 64-bit types (s64, u64, long long) - use abs64()
> * for those.
> */
>
> Ouch.
Here's a little cocci script that finds more of these in:
lib/percpu_counter.c
drivers/input/joystick/walkera0701.c
drivers/md/raid5.c
drivers/spi/spi-pxa2xx.c
fs/f2fs/debug.c
$ cat abs.cocci
@@
u64 t;
@@
* abs(t)
@@
s64 t;
@@
* abs(t)
@@
long long t;
@@
* abs(t)
@@
unsigned long long t;
@@
* abs(t)
@@
uint64_t t;
@@
* abs(t)
@@
int64_t t;
@@
* abs(t)
$
diff -u -p ./lib/percpu_counter.c /tmp/nothing/lib/percpu_counter.c
--- ./lib/percpu_counter.c
+++ /tmp/nothing/lib/percpu_counter.c
@@ -203,7 +203,6 @@ int __percpu_counter_compare(struct perc
count = percpu_counter_read(fbc);
/* Check to see if rough count will be sufficient for comparison */
- if (abs(count - rhs) > (batch * num_online_cpus())) {
if (count > rhs)
return 1;
else
diff -u -p ./drivers/input/joystick/walkera0701.c /tmp/nothing/drivers/input/joystick/walkera0701.c
--- ./drivers/input/joystick/walkera0701.c
+++ /tmp/nothing/drivers/input/joystick/walkera0701.c
@@ -150,7 +150,6 @@ static void walkera0701_irq_handler(void
if (w->counter == 24) { /* full frame */
walkera0701_parse_frame(w);
w->counter = NO_SYNC;
- if (abs(pulse_time - SYNC_PULSE) < RESERVE) /* new frame sync */
w->counter = 0;
} else {
if ((pulse_time > (ANALOG_MIN_PULSE - RESERVE)
@@ -161,7 +160,6 @@ static void walkera0701_irq_handler(void
} else
w->counter = NO_SYNC;
}
- } else if (abs(pulse_time - SYNC_PULSE - BIN0_PULSE) <
RESERVE + BIN1_PULSE - BIN0_PULSE) /* frame sync .. */
w->counter = 0;
diff -u -p ./drivers/md/raid5.c /tmp/nothing/drivers/md/raid5.c
--- ./drivers/md/raid5.c
+++ /tmp/nothing/drivers/md/raid5.c
@@ -6701,8 +6701,6 @@ static int run(struct mddev *mddev)
* readonly mode so it can take control before
* allowing any writes. So just check for that.
*/
- if (abs(min_offset_diff) >= mddev->chunk_sectors &&
- abs(min_offset_diff) >= mddev->new_chunk_sectors)
/* not really in-place - so OK */;
else if (mddev->ro == 0) {
printk(KERN_ERR "md/raid:%s: in-place reshape "
diff -u -p ./drivers/spi/spi-pxa2xx.c /tmp/nothing/drivers/spi/spi-pxa2xx.c
--- ./drivers/spi/spi-pxa2xx.c
+++ /tmp/nothing/drivers/spi/spi-pxa2xx.c
@@ -786,7 +786,6 @@ static unsigned int quark_x1000_get_clk_
/* Get the remainder */
fssp = (u64)fref * m;
do_div(fssp, 1 << 24);
- r1 = abs(fssp - rate);
/* Choose this one if it suits better */
if (r1 < r) {
diff -u -p ./fs/f2fs/debug.c /tmp/nothing/fs/f2fs/debug.c
--- ./fs/f2fs/debug.c
+++ /tmp/nothing/fs/f2fs/debug.c
@@ -109,7 +109,6 @@ static void update_sit_info(struct f2fs_
hblks_per_sec = blks_per_sec / 2;
for (segno = 0; segno < MAIN_SEGS(sbi); segno += sbi->segs_per_sec) {
vblocks = get_valid_blocks(sbi, segno, sbi->segs_per_sec);
- dist = abs(vblocks - hblks_per_sec);
bimodal += dist * dist;
if (vblocks > 0 && vblocks < blks_per_sec) {
next prev parent reply other threads:[~2015-09-05 1:39 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-01 20:02 Regression: can't apply frequency offsets above 1000ppm Nuno Gonçalves
2015-09-01 20:25 ` Thomas Gleixner
2015-09-01 20:30 ` John Stultz
2015-09-01 20:45 ` Thomas Gleixner
2015-09-02 0:36 ` Nuno Gonçalves
2015-09-02 1:03 ` John Stultz
2015-09-02 1:14 ` Nuno Gonçalves
2015-09-02 7:39 ` Miroslav Lichvar
2015-09-02 7:39 ` Miroslav Lichvar
2015-09-02 23:16 ` John Stultz
2015-09-03 10:10 ` Nuno Gonçalves
2015-09-03 11:26 ` Miroslav Lichvar
2015-09-03 11:26 ` Miroslav Lichvar
2015-09-05 0:57 ` John Stultz
2015-09-05 1:00 ` John Stultz
2015-09-05 1:39 ` Joe Perches [this message]
2015-09-05 1:39 ` defects for uses of abs(u64) (was: Re: Regression: can't apply frequency offsets above 1000ppm) Joe Perches
2015-09-23 7:21 ` Neil Brown
2015-09-05 13:41 ` Regression: can't apply frequency offsets above 1000ppm Nuno Gonçalves
2015-09-09 0:52 ` John Stultz
2015-09-09 1:00 ` Nuno Gonçalves
2015-09-01 20:28 ` John Stultz
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=1441417179.28194.35.camel@perches.com \
--to=joe@perches.com \
--cc=broonie@kernel.org \
--cc=chao2.yu@samsung.com \
--cc=cm224.lee@samsung.com \
--cc=daniel@zonque.org \
--cc=dl4mea@yahoo.de \
--cc=dmitry.torokhov@gmail.com \
--cc=haojian.zhuang@gmail.com \
--cc=jaegeuk@kernel.org \
--cc=john.stultz@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mlichvar@redhat.com \
--cc=neilb@suse.com \
--cc=nunojpg@gmail.com \
--cc=robert.jarzmik@free.fr \
--cc=stable@vger.kernel.org \
--cc=tglx@linutronix.de \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.