Mailing List Archive

race
From what I've read on this list I think I have a race issue. I'm using one
PCIe and three PCI capture devices, no network tuners, but now that I have
ACPI functioning, I noticed a conflict for football games on Sunday. Half
of my tuners were not recognized (outlined in red) fixed with a "sudo
systemctl restart mythtvbackend". Googling shows a solution for 16.04
involving system.d, because I'm using 20.04, I'm not sure that that is
appropriate for me. I believe I need to add a delay and would appreciate
being told where to put it. OS is now on a SSD, mythtv version 31. TIA
Daryl
Re: race [ In reply to ]
On Mon, 21 Sep 2020 12:48:30 -0400, you wrote:

>From what I've read on this list I think I have a race issue. I'm using one
>PCIe and three PCI capture devices, no network tuners, but now that I have
>ACPI functioning, I noticed a conflict for football games on Sunday. Half
>of my tuners were not recognized (outlined in red) fixed with a "sudo
>systemctl restart mythtvbackend". Googling shows a solution for 16.04
>involving system.d, because I'm using 20.04, I'm not sure that that is
>appropriate for me. I believe I need to add a delay and would appreciate
>being told where to put it. OS is now on a SSD, mythtv version 31. TIA
>Daryl

No, never fix race conditions using a delay. That always ends badly.
Race conditions should be fixed by waiting for the device to be ready.
For non-networked tuners, you can add a udev rule to make their status
available to systemd, then set up systemd to make mythbackend wait
until all the tuners are available before it starts.

In /etc/udev/rules.d add a new file 99-tuner.rules:

#
# Create systemd device units for capture devices
#
SUBSYSTEM=="video4linux", TAG+="systemd"
SUBSYSTEM=="dvb", TAG+="systemd"
SUBSYSTEM=="firewire", TAG+="systemd"

It should be chown root:root and chmod u=rw,og=r.

Then do:

sudo systemctl edit mythtv-backend

which will either create a new systemd override file or edit an
existing one. In the override file, put:

[Unit]
Wants=dev-dvb-adapter0-frontend0.device
After=dev-dvb-adapter0-frontend0.device
Wants=dev-dvb-adapter1-frontend0.device
After=dev-dvb-adapter1-frontend0.device
Wants=dev-dvb-adapter2-frontend0.device
After=dev-dvb-adapter2-frontend0.device
Wants=dev-dvb-adapter3-frontend0.device
After=dev-dvb-adapter3-frontend0.device

Save the file and exit the editor. Then do:

sudo systemctl daemon-reload

to get systemd to see the new configuration. Then reboot.

What the SUBSYSTEM=="dvb", TAG+="systemd" rule does is create systemd
devices for each DVB adapter like "dev-dvb-adapter0-frontend0.device".
If you look in your /var/log/kern.log file you should find messages
about each DVB adapter that gets created giving the adapter numbers.
You can also do a command like:

sudo systemctl status dev-dvb-adapter0-frontend0.device. Here is what
I get:

? dev-dvb-adapter0-frontend0.device - /dev/dvb/adapter0/frontend0
Follow: unit currently follows state of
sys-devices-pci0000:00-0000:00:0a.0-0000:07:00.0-dvb-dvb0.frontend0.device
Loaded: loaded
Active: active (plugged) since Fri 2020-09-18 02:10:33 NZST; 4 days
ago
Device:
/sys/devices/pci0000:00/0000:00:0a.0/0000:07:00.0/dvb/dvb0.frontend0

Sep 18 02:10:33 mypvr systemd[1]: Found device
/dev/dvb/adapter0/frontend0.

and from the sys-devices line you can track down which PCI bus device
is being referred to and hence which tuner.

The [Unit] Wants and After lines tell systemd that this unit needs
those devices to have been started and become available before it gets
started. There is a global systemd timeout that gets applied, so that
even if one of the devices is not available, after that timeout (30?
seconds), the unit gets started anyway.

The above presumes that all your tuners are DVB or ATSC devices which
create devices like /dev/dvb/adapter0/frontend0. If they are analogue
capture cards that create devices like /dev/video0, then the systemd
device names needed will be like dev-video0.device.
_______________________________________________
mythtv-users mailing list
mythtv-users@mythtv.org
http://lists.mythtv.org/mailman/listinfo/mythtv-users
http://wiki.mythtv.org/Mailing_List_etiquette
MythTV Forums: https://forum.mythtv.org
Re: race [ In reply to ]
On Mon, Sep 21, 2020 at 1:55 PM Stephen Worthington <
stephen_agent@jsw.gen.nz> wrote:

> On Mon, 21 Sep 2020 12:48:30 -0400, you wrote:
>
> >From what I've read on this list I think I have a race issue. I'm using
> one
> >PCIe and three PCI capture devices, no network tuners, but now that I have
> >ACPI functioning, I noticed a conflict for football games on Sunday. Half
> >of my tuners were not recognized (outlined in red) fixed with a "sudo
> >systemctl restart mythtvbackend". Googling shows a solution for 16.04
> >involving system.d, because I'm using 20.04, I'm not sure that that is
> >appropriate for me. I believe I need to add a delay and would appreciate
> >being told where to put it. OS is now on a SSD, mythtv version 31. TIA
> >Daryl
>
> No, never fix race conditions using a delay. That always ends badly.
> Race conditions should be fixed by waiting for the device to be ready.
> For non-networked tuners, you can add a udev rule to make their status
> available to systemd, then set up systemd to make mythbackend wait
> until all the tuners are available before it starts.
>
> In /etc/udev/rules.d add a new file 99-tuner.rules:
>
> #
> # Create systemd device units for capture devices
> #
> SUBSYSTEM=="video4linux", TAG+="systemd"
> SUBSYSTEM=="dvb", TAG+="systemd"
> SUBSYSTEM=="firewire", TAG+="systemd"
>
> It should be chown root:root and chmod u=rw,og=r.
>
> Then do:
>
> sudo systemctl edit mythtv-backend
>
> which will either create a new systemd override file or edit an
> existing one. In the override file, put:
>
> [Unit]
> Wants=dev-dvb-adapter0-frontend0.device
> After=dev-dvb-adapter0-frontend0.device
> Wants=dev-dvb-adapter1-frontend0.device
> After=dev-dvb-adapter1-frontend0.device
> Wants=dev-dvb-adapter2-frontend0.device
> After=dev-dvb-adapter2-frontend0.device
> Wants=dev-dvb-adapter3-frontend0.device
> After=dev-dvb-adapter3-frontend0.device
>
> Save the file and exit the editor. Then do:
>
> sudo systemctl daemon-reload
>
> to get systemd to see the new configuration. Then reboot.
>
> What the SUBSYSTEM=="dvb", TAG+="systemd" rule does is create systemd
> devices for each DVB adapter like "dev-dvb-adapter0-frontend0.device".
> If you look in your /var/log/kern.log file you should find messages
> about each DVB adapter that gets created giving the adapter numbers.
> You can also do a command like:
>
> sudo systemctl status dev-dvb-adapter0-frontend0.device. Here is what
> I get:
>
> ? dev-dvb-adapter0-frontend0.device - /dev/dvb/adapter0/frontend0
> Follow: unit currently follows state of
> sys-devices-pci0000:00-0000:00:0a.0-0000:07:00.0-dvb-dvb0.frontend0.device
> Loaded: loaded
> Active: active (plugged) since Fri 2020-09-18 02:10:33 NZST; 4 days
> ago
> Device:
> /sys/devices/pci0000:00/0000:00:0a.0/0000:07:00.0/dvb/dvb0.frontend0
>
> Sep 18 02:10:33 mypvr systemd[1]: Found device
> /dev/dvb/adapter0/frontend0.
>
> and from the sys-devices line you can track down which PCI bus device
> is being referred to and hence which tuner.
>
> The [Unit] Wants and After lines tell systemd that this unit needs
> those devices to have been started and become available before it gets
> started. There is a global systemd timeout that gets applied, so that
> even if one of the devices is not available, after that timeout (30?
> seconds), the unit gets started anyway.
>
> The above presumes that all your tuners are DVB or ATSC devices which
> create devices like /dev/dvb/adapter0/frontend0. If they are analogue
> capture cards that create devices like /dev/video0, then the systemd
> device names needed will be like dev-video0.device.
>
> Yes, all ATSC. I just rebooted, after making the changes, and unlike other
reboots, when I opened the FE, it searched for the BE, which confirms, for
me, that this worked very well. Many thanks Stephen!