Plymouth currently assumes that setting the scanout buffer will succeed.
if it fails because of a driver bug or transient failure it should try
again next frame.
This commit adds that error handling code.
Numbers are arbitrary, and we've never successfully made it to
version 1.0 after like 15 years or something.
Furthermore, plymouth has a very slow release schedule at present
and some distros hate building from git.
So, I'd like to start generating tarballs more regularly.
Adopting a version number derived from the date will help facilitate
that.
This commit changes AC_INIT to compute the version automatically.
https://gitlab.freedesktop.org/plymouth/plymouth/-/issues/143https://gitlab.freedesktop.org/plymouth/plymouth/-/issues/158
Allow themes to configure at which percentage of the boot progress the
animation should transition to the end animation.
At Endless we use this to only show the end animation from the start of
the boot splash by setting it to 0.0.
Currently if the screen is rotated by 90 degrees, the effective
width/height will be swapped. Thus we will incorrectly detect the panel
as HiDPI.
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Add a new option called ThemeDir to the configuration file, so a
configurable directory can be used to ship themes. The option applies
only to the theme specified in the same configuration file.
Add a plymouth-switch-root-initramfs.service, which will call
"plymouth update-root-fs --new-root-dir=/run/initramfs" to switch back
to the initramfs (when applicable).
Systemd will run this service before plymouthd receives the SIGTERM on
shutdown, so this will cause the plymouthd-fd-escrow helper to run
from the initramfs.
This avoids the plymouthd-fd-escrow helper keeping the rootfs busy.
Changes by Hans de Goede:
- Fix a couple of typos
- Add Conflicts=dracut-shutdown.service to plymouth-switch-root-initramfs.service
dracut-shutdown.service restores the initramfs when it is _stopped_
use Conflicts to make sure its ExecStop has run before we do
- Add a check for switching back to the initramfs to on_newroot () and dump
the debug-buffer before the switch (while we still have access to /var/log).
- Also add plymouth-switch-root-initramfs.service to kexec.target.wants.
kexec.target.wants uses --mode=shutdown, so the plymouthd-fd-escrow helper
will run, so we need to switch to the initramfs.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
When plymouth receives SIGTERM during shutdown or reboot, we must
exit cleanly to avoid keeping files open on the rootfs and to avoid
making drmModeSetCrtc () calls after the kms driver's shutdown method
has ran.
But at the same time we also want the boot-splash to stay up (in its
idle form) until the system actually reboots or powers off.
So we want to avoid the boot-splash getting replaced by e.g.
the text-console.
Add a plymouthd-fd-escrow helper which will get forked off when we
receive a SIGTERM in reboot/shutdown mode with pixel-displays active.
This helper will keep the fds for the pixel-displays open, so that
the boot-splash stays up until the end.
Changes by Hans de Goede:
- Start the escrow helper from main.c instead of from the drm plugin
- Rename the helper from plymouthd-drm-escrow to plymouthd-fd-escrow, since it
will be used to escrow fbdev fd-s too now
- In the child of the fork, continue with quiting normally (letting the
bootsplash become idle) instead of exiting directly
- Make plymouthd-fd-escrow a normal dynamic binary instead of a static binary,
the initrd already contains dynamic binaries so it does not have to be static
- Split the changes adding plymouth-switch-root-initramfs.service into a
separate patch
- Rewrite commit message
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
When working on plymouth I always have "plymouth.debug=stream:/dev/null"
on the kernel commandline. This enables tracing without logging anything
to the console and causes the entire trace to be logged to
/var/log/plymouth-debug.log when plymouth quits.
This is very useful for debugging (non crash) issues with plymouth at boot.
With the recent "main: Cleanly quit on SIGTERM" change plymouth will now
also write a trace log to /var/log/plymouth-debug.log on shutdown/reboot,
but this will be overwritten again on boot by the boot log.
This commit changes the default debug_buffer_path value from:
/var/log/plymouth-debug.log to /var/log/plymouth-shutdown-debug.log
when in shutdown or reboot mode so that it does not get overwritten
by the debug-log written at boot.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Now that we are no longer unconditionally opting out of getting terminated,
we get send a SIGTERM when transitioning from the rootfs back to the initrd
on poweroff/reboot.
Catch this SIGTERM and then exit cleanly by calling the on_quit handler,
besides exiting cleanly being the right thing to do, this will also allow the
boot-splash to go idle, so that it can cleanly finish the end-animation.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Before this commit plymouthd would always mark itself as "unkillable"
by setting "argv[0][0] = '@';" as documented here:
https://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons/
There are 2 problems with this:
1. This causes filesystems to fail to remount read-only in some case,
plymouthd may be holding open a deleted file (say an upgraded library).
If that happens, then the filesystem won't allow the disk to be remounted
read-only, because when plymouth dies, the filesystem will need to do I/O
to clean up the removed file from disk.
2. This causes the "gracefully shutdown" of displays which the kernel's
i915 driver recently introduced in commit fe0f1e3bfdfe ("drm/i915: Shut
down displays gracefully on reboot") to get undone. Because of being
"unkillable" plymouthd keeps running and showing the spinner animation
to the very end, this results in a drmModeSetCrtc () call after the i915
display driver has turned off the displays. This causes 2 issues:
2.1 This causes the screen to go black for 1-2 seconds and then show the
plymouth screen again for 1-2 seconds on poweroff/reboot which looks ugly:
https://bugzilla.redhat.com/show_bug.cgi?id=1941329
2.2 This may cause issues with the attached monitors on reboot, since it
undoes the gracefull shutdown which the i915 does.
Change the code to only set "argv[0][0] = '@';" when run from the initrd
at bootup, this solves the 2 mentioned issues and brings the code inline
with the above specification which says this should only ever be used for
daemons started from the initrd.
Note this will cause plymouth to get killed on shutdown, leading to the
last couple of text messages of shutdown being shown on shutdown.
This will be fixed by the next couple of patches.
Related: https://gitlab.freedesktop.org/plymouth/plymouth/-/merge_requests/118
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1941329
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Don't deactivate renderers from ply_device_manager_free (),
ply_device_manager_free () is only ever called with the renderers still
active on a "plymouth quit --retain-splash".
Since the splash is being retained in this case the renderers should not be
deactivated. Normally this does not matter because plymouthd exits almost
immediately afterwards and the kernels will close the renderers fds on exit.
But with the upcoming plymouthd-drm-escrow binary which keeps the renderers
fds open, not deactivate renderers; and thus not dropping DRM master rights
does make a difference.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
When switching between the "text" splash and the "details" splash the
"text" splash's hide function clears the console/terminal before
the "details" splash replays the log messages. So on each switch
the user sees all the log messages once.
But when switching between a graphical/pixel splash and details,
the console/terminal is not touched by the graphical splash's hide
function; and the details splash's hide function deliberately does
not clear the terminal on hide, so that when booting in detailed
mode, the log messages stay on the console when plymouth exits.
This means that when switching graphical-splash -> details ->
graphical-splash -> details, the second time the details splash
gets shown, the previous set of replayed log messages is still
on the terminal and all messages are now shown twice.
(and toggling back and forth a third time makes them all show 3
times, etc).
Fix this by clearing the terminal on show, before replaying the
log messages.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
In order to clear the console/terminal back to black again when hiding
the splash, we must restore the original terminal palette, so that
black actually is black before calling ply_text_display_clear_screen ().
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1933378
Signed-off-by: Hans de Goede <hdegoede@redhat.com>