New upstream git snapshot

Add RemainAfterExit=yes to plymouth's systemd service files (rhbz#1807771)
Fix the spinner / animation missing on shutdown and reboot
This commit is contained in:
Hans de Goede 2020-03-26 00:43:27 +01:00
parent f97cb31771
commit a6f9c2ae6e
10 changed files with 10 additions and 521 deletions

1
.gitignore vendored
View File

@ -14,3 +14,4 @@ plymouth-0.8.4.tar.bz2
/plymouth-a8aad27.tar.gz
/plymouth-32c097c.tar.gz
/plymouth-58a7289.tar.gz
/plymouth-e31c81f.tar.gz

View File

@ -1,80 +0,0 @@
From d5afbcc4475d2cc1944ef51d4fe787792dc1c893 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Feb 2020 11:45:55 +0100
Subject: [PATCH 1/7] ply-capslock-icon: Do not draw on free
One case where the various widgets are being freed is the pixel-display-s
being removed because of a monitor being hot(un)plugged. When the monitor
configuration changes ply-device-manager removes all old pixel-displays
and then adds the pixel-displays from the new config.
Calling ply_pixel_display_draw_area on a pixel-display which is about to be
freed is a bad idea, if the monitor was actually unplugged this leads to
various sort of errors, including crashes in some cases.
ply-capslock-icon is a recently added widget, none of the other
(older) widgets redraw themselves as hidden on free because there is
no reason to do this.
This commit adds a new stop_polling helper and replaces the troublesome
hide call (which involves redrawing) with this. This fixes plymouth
sometimes crashing when monitors are hot(un)plugged while plymouth is
running.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/libply-splash-graphics/ply-capslock-icon.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/src/libply-splash-graphics/ply-capslock-icon.c b/src/libply-splash-graphics/ply-capslock-icon.c
index 7d19a18..e60457f 100644
--- a/src/libply-splash-graphics/ply-capslock-icon.c
+++ b/src/libply-splash-graphics/ply-capslock-icon.c
@@ -52,6 +52,8 @@ struct _ply_capslock_icon
bool is_on;
};
+static void ply_capslock_stop_polling (ply_capslock_icon_t *capslock_icon);
+
ply_capslock_icon_t *
ply_capslock_icon_new (const char *image_dir)
{
@@ -74,7 +76,7 @@ ply_capslock_icon_free (ply_capslock_icon_t *capslock_icon)
return;
if (!capslock_icon->is_hidden)
- ply_capslock_icon_hide (capslock_icon);
+ ply_capslock_stop_polling (capslock_icon);
if (capslock_icon->buffer != NULL)
ply_pixel_buffer_free (capslock_icon->buffer);
@@ -121,6 +123,14 @@ on_timeout (void *user_data,
on_timeout, capslock_icon);
}
+static void
+ply_capslock_stop_polling (ply_capslock_icon_t *capslock_icon)
+{
+ ply_event_loop_stop_watching_for_timeout (capslock_icon->loop,
+ (ply_event_loop_timeout_handler_t)
+ on_timeout, capslock_icon);
+}
+
bool
ply_capslock_icon_load (ply_capslock_icon_t *capslock_icon)
{
@@ -183,10 +193,8 @@ ply_capslock_icon_hide (ply_capslock_icon_t *capslock_icon)
capslock_icon->is_hidden = true;
ply_capslock_icon_draw (capslock_icon);
+ ply_capslock_stop_polling (capslock_icon);
- ply_event_loop_stop_watching_for_timeout (capslock_icon->loop,
- (ply_event_loop_timeout_handler_t)
- on_timeout, capslock_icon);
capslock_icon->loop = NULL;
capslock_icon->display = NULL;
}
--
2.25.1

View File

@ -1,44 +0,0 @@
From c9b084882bb26a339acb06aa96f748c8f6b465e4 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Feb 2020 11:50:17 +0100
Subject: [PATCH 2/7] ply-keymap-icon: Do not draw on free
One case where the various widgets are being freed is the pixel-display-s
being removed because of a monitor being hot(un)plugged. When the monitor
configuration changes ply-device-manager removes all old pixel-displays
and then adds the pixel-displays from the new config.
Calling ply_pixel_display_draw_area on a pixel-display which is about to be
freed is a bad idea, if the monitor was actually unplugged this leads to
various sort of errors, including crashes in some cases.
ply-keymap-icon is a recently added widget, none of the other
(older) widgets redraw themselves as hidden on free because there is
no reason to do this.
This commit removes the troublesome hide call (which involves redrawing).
This fixes plymouth sometimes crashing when monitors are hot(un)plugged
while plymouth is running.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/libply-splash-graphics/ply-keymap-icon.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/src/libply-splash-graphics/ply-keymap-icon.c b/src/libply-splash-graphics/ply-keymap-icon.c
index f9ec614..d537527 100644
--- a/src/libply-splash-graphics/ply-keymap-icon.c
+++ b/src/libply-splash-graphics/ply-keymap-icon.c
@@ -130,9 +130,6 @@ ply_keymap_icon_free (ply_keymap_icon_t *keymap_icon)
if (keymap_icon == NULL)
return;
- if (!keymap_icon->is_hidden)
- ply_keymap_icon_hide (keymap_icon);
-
ply_pixel_buffer_free (keymap_icon->icon_buffer);
ply_pixel_buffer_free (keymap_icon->keymap_buffer);
--
2.25.1

View File

@ -1,88 +0,0 @@
From 82a1aaaaddeb4dc65728c28d6ccc776f38cd6f5d Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Feb 2020 11:51:03 +0100
Subject: [PATCH 3/7] ply-throbber: Do not redraw when we need to stop
throbbing on free
One case where the various widgets are being freed is the pixel-display-s
being removed because of a monitor being hot(un)plugged. When the monitor
configuration changes ply-device-manager removes all old pixel-displays
and then adds the pixel-displays from the new config.
Calling ply_pixel_display_draw_area on a pixel-display which is about to be
freed is a bad idea, if the monitor was actually unplugged this leads to
various sort of errors, including crashes in some cases.
ply-throbber is the only (older) widget which does a redraw on free,
this likely was not noticed until now because typically the throbber
will already have been stopped on free.
This commit adds a redraw parameter to ply_throbber_stop_now and sets
this to false when calling ply_throbber_stop_now from ply_throbber_free.
This fixes plymouth sometimes crashing when monitors are hot(un)plugged
while plymouth is running.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/libply-splash-graphics/ply-throbber.c | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/src/libply-splash-graphics/ply-throbber.c b/src/libply-splash-graphics/ply-throbber.c
index a4311fd..bf0855e 100644
--- a/src/libply-splash-graphics/ply-throbber.c
+++ b/src/libply-splash-graphics/ply-throbber.c
@@ -78,7 +78,7 @@ struct _ply_throbber
uint32_t is_stopped : 1;
};
-static void ply_throbber_stop_now (ply_throbber_t *throbber);
+static void ply_throbber_stop_now (ply_throbber_t *throbber, bool redraw);
ply_throbber_t *
ply_throbber_new (const char *image_dir,
@@ -126,7 +126,7 @@ ply_throbber_free (ply_throbber_t *throbber)
return;
if (!throbber->is_stopped)
- ply_throbber_stop_now (throbber);
+ ply_throbber_stop_now (throbber, false);
ply_throbber_remove_frames (throbber);
ply_array_free (throbber->frames);
@@ -324,15 +324,18 @@ ply_throbber_start (ply_throbber_t *throbber,
}
static void
-ply_throbber_stop_now (ply_throbber_t *throbber)
+ply_throbber_stop_now (ply_throbber_t *throbber, bool redraw)
{
throbber->is_stopped = true;
- ply_pixel_display_draw_area (throbber->display,
- throbber->x,
- throbber->y,
- throbber->frame_area.width,
- throbber->frame_area.height);
+ if (redraw) {
+ ply_pixel_display_draw_area (throbber->display,
+ throbber->x,
+ throbber->y,
+ throbber->frame_area.width,
+ throbber->frame_area.height);
+ }
+
if (throbber->loop != NULL) {
ply_event_loop_stop_watching_for_timeout (throbber->loop,
(ply_event_loop_timeout_handler_t)
@@ -356,7 +359,7 @@ ply_throbber_stop (ply_throbber_t *throbber,
}
if (stop_trigger == NULL) {
- ply_throbber_stop_now (throbber);
+ ply_throbber_stop_now (throbber, true);
return;
}
--
2.25.1

View File

@ -1,37 +0,0 @@
From b6ae2adabfef64ace22698f76afae454a6419492 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Feb 2020 21:16:38 +0100
Subject: [PATCH 4/7] event-loop: Fix debug-log "failed to delete fd # from
epoll watch list" spam
The boot server uses a disconnect handler which closes the fd, this
causes deleting the fd from the epoll watch list to fail with an EBADF
error. Since the fd was closed it was already removed from the epoll
watch list, so the failure is harmless, silence these errors getting logged
to the debug logs.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/libply/ply-event-loop.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/libply/ply-event-loop.c b/src/libply/ply-event-loop.c
index 0e8ad7c..5eb601c 100644
--- a/src/libply/ply-event-loop.c
+++ b/src/libply/ply-event-loop.c
@@ -641,7 +641,11 @@ ply_event_loop_remove_source_node (ply_event_loop_t *loop,
status = epoll_ctl (loop->epoll_fd, EPOLL_CTL_DEL, source->fd, NULL);
- if (status < 0)
+ /*
+ * EBADF means that there was a disconnect handler, which has
+ * closed the fd, which is fine, do not log an error for this.
+ */
+ if (status < 0 && errno != EBADF)
ply_trace ("failed to delete fd %d from epoll watch list: %m", source->fd);
source->is_getting_polled = false;
}
--
2.25.1

View File

@ -1,43 +0,0 @@
From 9c25da99889439924eeae953f357233bdb99d569 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Feb 2020 21:19:38 +0100
Subject: [PATCH 5/7] event-loop: Remove ply_trace calls around the disconnect
handler
Doing a ply_trace both before and after the disconnect handler, which
gets called every time a boot client asks something of us through by
calling /sbin/plymouth leads to a lot of not really informative messages
in the debug-log.
This removes the 2 ply_trace calls around the disconnect handlers to make
the logs easier to read.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/libply/ply-event-loop.c | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/src/libply/ply-event-loop.c b/src/libply/ply-event-loop.c
index 5eb601c..57751c2 100644
--- a/src/libply/ply-event-loop.c
+++ b/src/libply/ply-event-loop.c
@@ -1061,15 +1061,9 @@ ply_event_loop_handle_disconnect_for_source (ply_event_loop_t *loop,
destination = (ply_event_destination_t *) ply_list_node_get_data (node);
next_node = ply_list_get_next_node (source->destinations, node);
- if (destination->disconnected_handler != NULL) {
- ply_trace ("calling disconnected_handler %p for fd %d",
- destination->disconnected_handler, source->fd);
+ if (destination->disconnected_handler != NULL)
destination->disconnected_handler (destination->user_data, source->fd);
- ply_trace ("done calling disconnected_handler %p for fd %d",
- destination->disconnected_handler, source->fd);
- }
-
node = next_node;
}
}
--
2.25.1

View File

@ -1,170 +0,0 @@
From aba38f13c1af535efefb09683ced0920600e7dde Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Feb 2020 22:03:58 +0100
Subject: [PATCH 6/7] two-step: Add UseEndAnimation setting
We try to start the end animation early based on our progress accounting
but this is highly unreliable because e.g.:
-It counts time to enter the diskcrypt passwd as normal boot time, while
this varies wildly from boot to boot
-Boot times for laptops can differ significantly between docked / undocked
state
Between gdm calling /bin/plymouth deactivate and the drm plugin's deactivate
method getting called there can be e.g. 2.1 seconds (from a random boot),
with a theoretical maximum of 3 seconds (2 seconds to finish the throbber +
1 second for the end animation).
On a modern system userland boot should be able to finish in say 5 seconds,
making gdm wait an additional 1 - 3 seconds for deactivation is a huge amount
of extra wait time!
This commit adds a new "UseEndAnimation" option to the two-step plugin,
which defaults to true. Setting this to false makes deactivation immediate.
This works nicely with the spinner (and bgrt) themes since we do not really
do anything special in the end animation there anyways and since we fade-over
into gdm things will still look ok, while shaving a signifcant chunk of our
boot time.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/plugins/splash/two-step/plugin.c | 42 +++++++++++++++++++++++++---
themes/bgrt/bgrt.plymouth.in | 3 ++
themes/spinner/spinner.plymouth.in | 9 ++++++
3 files changed, 50 insertions(+), 4 deletions(-)
diff --git a/src/plugins/splash/two-step/plugin.c b/src/plugins/splash/two-step/plugin.c
index 3dfb011..964855c 100644
--- a/src/plugins/splash/two-step/plugin.c
+++ b/src/plugins/splash/two-step/plugin.c
@@ -121,6 +121,7 @@ typedef struct
bool progress_bar_show_percent_complete;
bool use_progress_bar;
bool use_animation;
+ bool use_end_animation;
bool use_firmware_background;
char *title;
char *subtitle;
@@ -262,12 +263,13 @@ view_free (view_t *view)
static void
view_load_end_animation (view_t *view)
{
+ ply_boot_splash_plugin_t *plugin = view->plugin;
const char *animation_prefix;
- ply_boot_splash_plugin_t *plugin;
- ply_trace ("loading animation");
+ if (!plugin->mode_settings[plugin->mode].use_end_animation)
+ return;
- plugin = view->plugin;
+ ply_trace ("loading animation");
switch (plugin->mode) {
case PLY_BOOT_SPLASH_MODE_BOOT_UP:
@@ -315,6 +317,7 @@ view_load_end_animation (view_t *view)
ply_trace ("optional animation didn't load");
ply_animation_free (view->end_animation);
view->end_animation = NULL;
+ plugin->mode_settings[plugin->mode].use_end_animation = false;
}
static bool
@@ -995,6 +998,13 @@ load_mode_settings (ply_boot_splash_plugin_t *plugin,
else
settings->use_animation = !settings->use_progress_bar;
+ /* This defaults to true for compat. with older themes */
+ if (ply_key_file_has_key (key_file, group_name, "UseEndAnimation"))
+ settings->use_end_animation =
+ ply_key_file_get_bool (key_file, group_name, "UseEndAnimation");
+ else
+ settings->use_end_animation = true;
+
/* If any mode uses the firmware background, then we need to load it */
if (settings->use_firmware_background)
plugin->use_firmware_background = true;
@@ -1260,6 +1270,25 @@ start_end_animation (ply_boot_splash_plugin_t *plugin,
return;
}
+ if (!plugin->mode_settings[plugin->mode].use_end_animation) {
+ node = ply_list_get_first_node (plugin->views);
+ while (node != NULL) {
+ view = ply_list_node_get_data (node);
+
+ ply_progress_bar_hide (view->progress_bar);
+
+ if (view->throbber != NULL)
+ ply_throbber_stop (view->throbber, NULL);
+
+ if (view->progress_animation != NULL)
+ ply_progress_animation_hide (view->progress_animation);
+
+ node = ply_list_get_next_node (plugin->views, node);
+ }
+ ply_trigger_pull (trigger, NULL);
+ return;
+ }
+
ply_trace ("starting end animation");
node = ply_list_get_first_node (plugin->views);
@@ -1718,7 +1747,12 @@ on_boot_progress (ply_boot_splash_plugin_t *plugin,
if (plugin->is_idle)
return;
- if (percent_done >= SHOW_ANIMATION_PERCENT) {
+ /*
+ * If we do not have an end animation, we keep showing progress until
+ * become_idle gets called.
+ */
+ if (plugin->mode_settings[plugin->mode].use_end_animation &&
+ percent_done >= SHOW_ANIMATION_PERCENT) {
if (plugin->stop_trigger == NULL) {
ply_trace ("boot progressed to end");
diff --git a/themes/bgrt/bgrt.plymouth.in b/themes/bgrt/bgrt.plymouth.in
index ac07bc9..994a995 100644
--- a/themes/bgrt/bgrt.plymouth.in
+++ b/themes/bgrt/bgrt.plymouth.in
@@ -25,12 +25,15 @@ DialogClearsFirmwareBackground=true
MessageBelowAnimation=true
[boot-up]
+UseEndAnimation=false
UseFirmwareBackground=true
[shutdown]
+UseEndAnimation=false
UseFirmwareBackground=true
[reboot]
+UseEndAnimation=false
UseFirmwareBackground=true
[updates]
diff --git a/themes/spinner/spinner.plymouth.in b/themes/spinner/spinner.plymouth.in
index 5e5078e..88121c5 100644
--- a/themes/spinner/spinner.plymouth.in
+++ b/themes/spinner/spinner.plymouth.in
@@ -23,6 +23,15 @@ ProgressBarBackgroundColor=0x606060
ProgressBarForegroundColor=0xffffff
MessageBelowAnimation=true
+[boot-up]
+UseEndAnimation=false
+
+[shutdown]
+UseEndAnimation=false
+
+[reboot]
+UseEndAnimation=false
+
[updates]
SuppressMessages=true
ProgressBarShowPercentComplete=true
--
2.25.1

View File

@ -1,41 +0,0 @@
From a575605b7dd835bab626f07ff37f283049da7b3c Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Feb 2020 22:38:06 +0100
Subject: [PATCH 7/7] themes: Drop UseFirmwareBackground=true from spinner/bgrt
firmware-upgrade settings
The spinner theme should never have UseFirmwareBackground=true and in the
bgrt case we should not use it for modes which set a Title as the Title
location will conflict with the firmware background vendor logo.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
themes/bgrt/bgrt.plymouth.in | 1 -
themes/spinner/spinner.plymouth.in | 1 -
2 files changed, 2 deletions(-)
diff --git a/themes/bgrt/bgrt.plymouth.in b/themes/bgrt/bgrt.plymouth.in
index 994a995..5455eb7 100644
--- a/themes/bgrt/bgrt.plymouth.in
+++ b/themes/bgrt/bgrt.plymouth.in
@@ -54,6 +54,5 @@ _SubTitle=Do not turn off your computer
SuppressMessages=true
ProgressBarShowPercentComplete=true
UseProgressBar=true
-UseFirmwareBackground=true
_Title=Upgrading Firmware...
_SubTitle=Do not turn off your computer
diff --git a/themes/spinner/spinner.plymouth.in b/themes/spinner/spinner.plymouth.in
index 88121c5..0687d12 100644
--- a/themes/spinner/spinner.plymouth.in
+++ b/themes/spinner/spinner.plymouth.in
@@ -50,6 +50,5 @@ _SubTitle=Do not turn off your computer
SuppressMessages=true
ProgressBarShowPercentComplete=true
UseProgressBar=true
-UseFirmwareBackground=true
_Title=Upgrading Firmware...
_SubTitle=Do not turn off your computer
--
2.25.1

View File

@ -1,11 +1,11 @@
%global commit 58a728982cfa911a06326620a599333aea38960e
%global commitdate 20200306
%global commit e31c81f9849c176d7b293ca79cc4507ba740c2fa
%global commitdate 20200325
%global shortcommit %(c=%{commit}; echo ${c:0:7})
Summary: Graphical Boot Animation and Logger
Name: plymouth
Version: 0.9.4
Release: 13.%{commitdate}git%{shortcommit}%{?dist}
Release: 14.%{commitdate}git%{shortcommit}%{?dist}
License: GPLv2+
URL: http://www.freedesktop.org/wiki/Software/Plymouth
@ -18,20 +18,6 @@ Source2: charge.plymouth
# and that does not need the removed symbols.
Patch0: 0001-Revert-configure-bump-so-name.patch
# Patches pending upstream
# https://gitlab.freedesktop.org/plymouth/plymouth/-/merge_requests/92
# For rhbz 1810070
Patch1: 0001-ply-capslock-icon-Do-not-draw-on-free.patch
Patch2: 0002-ply-keymap-icon-Do-not-draw-on-free.patch
Patch3: 0003-ply-throbber-Do-not-redraw-when-we-need-to-stop-thro.patch
# https://gitlab.freedesktop.org/plymouth/plymouth/-/merge_requests/93
Patch4: 0004-event-loop-Fix-debug-log-failed-to-delete-fd-from-ep.patch
Patch5: 0005-event-loop-Remove-ply_trace-calls-around-the-disconn.patch
# https://gitlab.freedesktop.org/plymouth/plymouth/-/merge_requests/94
Patch6: 0006-two-step-Add-UseEndAnimation-setting.patch
# https://gitlab.freedesktop.org/plymouth/plymouth/-/merge_requests/95
Patch7: 0007-themes-Drop-UseFirmwareBackground-true-from-spinner-.patch
BuildRequires: gcc libtool git
BuildRequires: pkgconfig(libdrm)
BuildRequires: pkgconfig(libudev)
@ -411,6 +397,11 @@ fi
%changelog
* Wed Mar 25 2020 Hans de Goede <jwrdegoede@fedoraproject.org> - 0.9.4-14.20200306git58a7289
- New upstream git snapshot
- Add RemainAfterExit=yes to plymouth's systemd service files (rhbz#1807771)
- Fix the spinner / animation missing on shutdown and reboot
* Mon Mar 9 2020 Hans de Goede <jwrdegoede@fedoraproject.org> - 0.9.4-13.20200306git58a7289
- Add patches fixing crash on monitor hot(un)plug (rhbz#1809681)
- Add patches fixing delay between gdm telling us to deactivate and

View File

@ -1 +1 @@
SHA512 (plymouth-58a7289.tar.gz) = e3d8daebc24f8c53ea1de819170a4ba9842ec1a98904243802e1f15b51b6aa234ef8d22db44b90b8fa42af960e2c71207b3e326c389c12d83327655149e84b2a
SHA512 (plymouth-e31c81f.tar.gz) = 1b4e7507d634f37c19d48bc2d479f01af3c1215c8c1d935e3bb84bf19c14a126f3005485dc6e9e718e70e3c82cce7c963d4d31274f6d32161d195317d07b7388