From 059390ac569798cbf40a958ea714b15f313b46a3 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Sat, 10 Nov 2018 16:04:31 +0100
Subject: [PATCH 062/142] ply-device-manager: Fix race causing undesired
 creation of non-gfx devs

On systems with working drm/kms devices we still sometimes see:
"Creating non-graphical devices, since there's no suitable graphics hardware"
in the logs (and actually create non-gfx devices).

This is caused by a race where the create_devices_from_udev timeout handler
runs just after the pivot-root, just at the time when the "udev trigger"
from the real root is done.

This causes create_devices_for_subsystem() to hit the "it's not initialized"
code-path for all drm and fb devices, even though before (from the initrd)
drm-devices where already setup successfully.

One way of solving this would be to stop the timer as soon as we successfully
enumerate the first drm device. But we need the timer to enumerate fb devices
so on machines where some outputs only have a fbdev driver (corner case) this
would break support for those outputs.

Instead this commit moves the found_drm_device and found_fb_device to the
global manager state and sets them from create_devices_for_udev_device().
This way they will be set when we check them from the create_devices_from_udev
timeout handler even if create_devices_for_subsystem skips over the devices
because of the udev trigger race.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 src/libply-splash-core/ply-device-manager.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
index b637fb8..dcc9859 100644
--- a/src/libply-splash-core/ply-device-manager.c
+++ b/src/libply-splash-core/ply-device-manager.c
@@ -77,6 +77,8 @@ struct _ply_device_manager
         uint32_t                    serial_consoles_detected : 1;
         uint32_t                    renderers_activated : 1;
         uint32_t                    keyboards_activated : 1;
+        uint32_t                    found_drm_device : 1;
+        uint32_t                    found_fb_device : 1;
 };
 
 static void
@@ -250,6 +252,12 @@ create_devices_for_udev_device (ply_device_manager_t *manager,
                                                                                  device_path,
                                                                                  terminal,
                                                                                  renderer_type);
+                        if (created) {
+                                if (renderer_type == PLY_RENDERER_TYPE_DRM)
+                                        manager->found_drm_device = 1;
+                                if (renderer_type == PLY_RENDERER_TYPE_FRAME_BUFFER)
+                                        manager->found_fb_device = 1;
+                        }
                 }
         }
 
@@ -799,14 +807,12 @@ create_non_graphical_devices (ply_device_manager_t *manager)
 static void
 create_devices_from_udev (ply_device_manager_t *manager)
 {
-        bool found_drm_device, found_fb_device;
-
         ply_trace ("Timeout elapsed, looking for devices from udev");
 
-        found_drm_device = create_devices_for_subsystem (manager, SUBSYSTEM_DRM);
-        found_fb_device = create_devices_for_subsystem (manager, SUBSYSTEM_FRAME_BUFFER);
+        create_devices_for_subsystem (manager, SUBSYSTEM_DRM);
+        create_devices_for_subsystem (manager, SUBSYSTEM_FRAME_BUFFER);
 
-        if (found_drm_device || found_fb_device)
+        if (manager->found_drm_device || manager->found_fb_device)
                 return;
 
         ply_trace ("Creating non-graphical devices, since there's no suitable graphics hardware");
-- 
1.8.3.1

