Xorg hangs use 99% of CPU on systemd reboot

Peter Hutterer peter.hutterer at who-t.net
Thu Jul 2 23:14:13 PDT 2015


On Thu, Jul 02, 2015 at 04:26:19PM +0100, Barry Scott wrote:
> The attached patch works around an issue we hit after we
> ported from Fedora 20 to Fedora 21.
> 
> When systemd reboot starts something happens to dbus that
> causes Xorg to loop hard using 99% CPU in WaitForSomething.
> 
> The reason for the loop is that the bus_info.fd in dbus-core.c
> has been closed. But the expected Disconnected signal is not
> received by the messages filter.

wouldn't it be better to set up the filter so we get the disconnect signal?

Cheers,
   Peter

> 
> The patch works around this issue by removing the fd from the
> fd_set that is feed into the Select in WaitForSomething by
> calling RemoveGeneralSocket from within wakeup_handler in
> dbus-core.c.
> 
> When systemctl is used to stop and restart Xorg outside of the
> reboot it works without any problems.
> 
> Barry
> 

> From ca770dd6e8ebb9a780ce68a07535f976f6120247 Mon Sep 17 00:00:00 2001
> From: Barry Scott <barry.scott at onelan.co.uk>
> Date: Tue, 30 Jun 2015 15:58:22 +0100
> Subject: [PATCH] server loops in WaitForSomething when dbus closed by systemd
>  shutdown
> 
> Work around issue with dbus fd becoming closed by WaitForSomething
> still using it in Select. The Select return EBADF but becuase the dbus fd
> is not taken out of the fs_set the code loop forever.
> 
> This state has been seen when systemd starts to shutdown on Fedora 21.
> 
> Signed-off-by: Barry Scott <barry.scott at onelan.co.uk>
> ---
>  config/dbus-core.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/config/dbus-core.c b/config/dbus-core.c
> index 8351ea4..fac8116 100644
> --- a/config/dbus-core.c
> +++ b/config/dbus-core.c
> @@ -52,6 +52,19 @@ wakeup_handler(void *data, int num_fds, void *read_mask)
>  {
>      struct dbus_core_info *info = data;
>  
> +    if (info->fd < 0) {
> +        return;
> +    }
> +
> +    if (!dbus_connection_get_is_connected(info->connection)) {
> +        /* must remove the FD here as WaitForSomething's Select will now fail
> +           and WaitForSomething will loop hard calling Select.
> +           The "Disconnected" message has been seen to not arrive. */
> +        RemoveGeneralSocket(info->fd);
> +        info->fd = -1;
> +        return;
> +    }
> +
>      if (info->connection && num_fds > 0 && FD_ISSET(info->fd, (fd_set *) read_mask)) {
>          do {
>              dbus_connection_read_write_dispatch(info->connection, 0);
> -- 
> 2.1.0
> 

> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel



More information about the xorg-devel mailing list