Re: Patched gpsd and /dev/pps0 results in "sleeping thread" kernel panic

From: Warner Losh <imp_at_bsdimp.com>
Date: Wed, 01 Sep 2021 01:54:50 UTC
On Tue, Aug 31, 2021, 7:28 PM Craig Leres <leres@freebsd.org> wrote:

> I have many FreeBSD based ntp time servers using half a dozen different
> kinds of receivers. Now I have a Javad Alpha2 satellite receiver I'd
> like to use. Since gpsd knows how to talk GREIS to it I'm pretty deep
> into trying to figure out how to configure that.
>
> gpsd appears to know a lot about the RFC 2783 pps api but incorrectly
> assumes only tty-like devices can support it. It tries to use time_pps_*
> functions with /dev/gps0 (a symlink to cuau0) which fail and doesn't
> even open /dev/pps0. My gpsd rc.conf config is:
>
>      gpsd_enable="YES"
>      gpsd_flags="-D1 -n -s 115200"
>      gpsd_devices="/dev/gps0 /dev/pps0"
>
> The relevant part of my ntp.conf is (driver 46 is the GPSD-NG driver):
>
>      server 127.127.46.0
>      fudge 127.127.46.0 flag4 1
>
> Running with these two configs, the gpsd tool cgps shows the radio
> happily is tracking ~20 satellites. ntpd shows "GPSD" running about 10
> us fast but because this so far off it eventually discards it (ntpq -p
> show 'x' before it). I know /dev/pps0 works because if I add pps clock
> config (driver 22) for it to ntp.conf:
>
>      server 127.127.22.0 prefer
>      fudge 127.127.22.0 flag3 1
>
> ntpd is then able to poll for data and shows a reasonable offset that is
> comparable to ntpd running on nearby servers.
>
> So I'm pretty close, I just need to get gpsd working with /dev/pps0. To
> that end, I made a copy of the source and made some changes to
> ppsthread.c (see attached patch.txt) which basically forces an open() on
> /dev/pps0. This gets further:
>
>      gpsd:INFO: KPPS:/dev/pps0 pps_caps 0x1151
>      gpsd:INFO: KPPS:/dev/pps0 have PPS_CANWAIT
>      gpsd:WARN: KPPS:/dev/pps0 missing PPS_CAPTURECLEAR, pulse may be
> offset
>      gpsd:INFO: KPPS:/dev/pps0 kernel PPS will be used
>      [New LWP 101408 of process 2046]
>      gpsd:PROG: PPS:/dev/pps0 thread launched
>      gpsd:INFO: PPS:/dev/pps0 ntpshm_link_activate: 0
>      gpsd:INFO: device /dev/pps0 activated
>
> and gpsd starts to talk GREIS protocol to the radio and then the kernel
> panics with "sleeping thread".
>
> Here are more details about my setup. I have 12.2-RELEASE-p10 kernel
> with these options:
>
>      device          pps
>      options         PPS_SYNC
>      options         P1003_1B_MQUEUE
>
> I'm building the ports version of net/ntp with these options:
>
>      ATOM DEBUG IPV6 JUPITER NMEA ONCORE PERL_UTILS SHM SSL THREADS
>
> I'm building the ports version of astro/gpsd with these options:
>
>      GPSCLOCK IPV6 NCURSES NMEA0183 NTP NTPSHM ONCORE PPS RECONFIG
> SHMEXPORT SOCKEXPORT
>
> My gpsd source tree is just a copy of patched version of the astro/gpsd
> port. (Which caused me to have to learn how to use scons...) When
> testing I start gpsd with:
>
>      ./gpsd -N -D5 -n -s 115200 -P /var/run/gpsd.pid /dev/gps0 /dev/pps0
>
> The Alpha2 is connected to /dev/cuau0 at 115200 baud, its pps is
> connected to a parallel printer port.
>
> Can anyone help me with gpsd+pps and/or the kernel panic?
>

Can you post a traceback? We recently tightened up the sleeping conditions
and many of the panics are straight forward to fix...

Warner

                Craig
>