Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Feb 2019 17:55:04 -0800
From:      Mark Millard <marklmi@yahoo.com>
To:        Konstantin Belousov <kib@freebsd.org>
Cc:        freebsd-hackers Hackers <freebsd-hackers@freebsd.org>, FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>
Subject:   Re: powerpc64 head -r344018 stuck sleeping problems: th->th_scale * tc_delta(th) overflows unsigned 64 bits sometimes [patched failed]
Message-ID:  <962D78C3-65BE-40C1-BB50-A0088223C17B@yahoo.com>
In-Reply-To: <20190228150811.GU2420@kib.kiev.ua>
References:  <D3D7E9F4-9A5E-4320-B3C8-EC5CEF4A2764@yahoo.com> <20190228145542.GT2420@kib.kiev.ua> <20190228150811.GU2420@kib.kiev.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
[The PowerMac becomes non-responsive for significant periods of time.]

On 2019-Feb-28, at 07:08, Konstantin Belousov <kib at freebsd.org> =
wrote:

> On Thu, Feb 28, 2019 at 04:55:42PM +0200, Konstantin Belousov wrote:
>> On Thu, Feb 28, 2019 at 05:06:23AM -0800, Mark Millard via =
freebsd-ppc wrote:
>>> . . .
>>=20
>> . . .
>=20
> Of course I botched the formula, please try this instead:
>=20
> diff --git a/sys/kern/kern_tc.c b/sys/kern/kern_tc.c
> index 2656fb4d22f..fdd4f4f6a52 100644
> --- a/sys/kern/kern_tc.c
> +++ b/sys/kern/kern_tc.c
> @@ -355,13 +355,22 @@ void
> binuptime(struct bintime *bt)
> {
> 	struct timehands *th;
> -	u_int gen;
> +	uint64_t scale, x;
> +	u_int delta, gen;
>=20
> 	do {
> 		th =3D timehands;
> 		gen =3D atomic_load_acq_int(&th->th_generation);
> 		*bt =3D th->th_offset;
> -		bintime_addx(bt, th->th_scale * tc_delta(th));
> +		scale =3D th->th_scale;
> +		delta =3D tc_delta(th);
> +		if (fls(scale) + fls(delta) > 63) {
> +			x =3D (scale >> 32) * delta;
> +			scale &=3D UINT_MAX;
> +			bt->sec +=3D x >> 32;
> +			bintime_addx(bt, x << 32);
> +		}
> +		bintime_addx(bt, scale * delta);
> 		atomic_thread_fence_acq();
> 	} while (gen =3D=3D 0 || gen !=3D th->th_generation);
> }
> @@ -388,13 +397,22 @@ void
> bintime(struct bintime *bt)
> {
> 	struct timehands *th;
> -	u_int gen;
> +	uint64_t scale, x;
> +	u_int delta, gen;
>=20
> 	do {
> 		th =3D timehands;
> 		gen =3D atomic_load_acq_int(&th->th_generation);
> 		*bt =3D th->th_bintime;
> -		bintime_addx(bt, th->th_scale * tc_delta(th));
> +		scale =3D th->th_scale;
> +		delta =3D tc_delta(th);
> +		if (fls(scale) + fls(delta) > 63) {
> +			x =3D (scale >> 32) * delta;
> +			scale &=3D UINT_MAX;
> +			bt->sec +=3D x >> 32;
> +			bintime_addx(bt, x << 32);
> +		}
> +		bintime_addx(bt, scale * delta);
> 		atomic_thread_fence_acq();
> 	} while (gen =3D=3D 0 || gen !=3D th->th_generation);
> }

The PowerPC G5 ends up not responsive for long periods and
responsive for only very short periods, such as being able
to type in a few letters and have them show up at the time.

I've only barely started investigating what is going on
and I'll be rechecking my instrumented variant for stupid
mistakes and such. I"ll try your un-instrumented binuptime
as well.

As stands I'll be updating the kernel via booting a 2nd
disk that is not being experimented with.

My information gathering may not be very timely.



=3D=3D=3D
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?962D78C3-65BE-40C1-BB50-A0088223C17B>