Skip to content

Conversation

@marmarek
Copy link
Member

Until now, Xorg was started only after connecting with gui-daemon and
receiving xconf message. This was mostly because initial
resolution/video mem specified in the xorg.conf couldn't later be
changed and that affects maximum working resolution.

Since 49420c5 "Increase screen pixmap size beyond initial video RAM if
needed", this is no longer a problem. The only parameter (still) needed
before starting Xorg is GUI domain id, but this is available on the
command line. Change gui-agent to start Xorg earlier and only then wait
for gui-daemon. This allows starting all of the user session earlier,
optimizing startup time. This is especially relevant for VMs started on
boot (before user logs in), when GUI daemon isn't started yet. And also
helpful for preloaded disposables, which may start user session as part
of preloading now.

The current implementation is rather naive: it starts Xorg with
hardcoded 1920x1080 resolution (which will later be updated by the
qubes.SetMonitorLayout qrexec call), selects which events it want to
receive and then waits for the GUI daemon. Especially, no events are
actually processed before GUI daemon connects. This assumes all events
will be queued and can be processed after GUI daemon connection. Very
similar approach is already taken on GUI daemon re-connection, and it
works.

There is a potential issue, if too many events get queued before GUI
daemon connects and some get dropped. It's unclear how Xlib handles that
(and what is the limit), but if that happens there are two alternative
solutions:

  1. Start processing events normally, especially collect info about all
    relevant windows, but dont send anything to GUI daemon before it
    connects - this basically requires changing write_struct() (and other
    similar places) to check if GUI daemon is connected. And once GUI daemon
    connects (first event received on the vchan FD), call
    send_all_windows_info().

  2. Wait for GUI daemon before registering for events, but then iterate
    over all windows to collect necessary info and send it to dom0. This
    approach theoretically can be more reliable (and might even allow
    restarting gui-agent without restarting Xorg as a side effect), but it's
    unclear if all data can be rebuilt this way. Especially tray icons may
    be problematic, as it isn't any window property, but a message sent to
    relevant selection owner (but theoretically
    https://tronche.com/gui/x/icccm/sec-2.html#s-2.8 provides
    solution for this issue).

QubesOS/qubes-issues#9940 (comment)

@marmarek
Copy link
Member Author

@ben-grande I've looked at gui-agent and I think this should be enough to start user session without waiting for GUI daemon. See above description for specific details.

Generally, this should allow using qubes.WaitForSession even if gui-daemon isn't started yet.

This is only lightly tested, needs checking for various corner cases. A few cases that are worth testing:

  1. Start VM, but not gui-daemon, start some GUI apps, and only then start gui-daemon - app windows should appear.
  2. As with 1, but start and stop an app several times before starting gui-daemon (while an app window may flicker at gui-daemon startup, nothing should crash).
  3. Start something with tray icon (both before starting gui-daemon and after)
  4. Restart gui-daemon (logout and login to dom0?)
  5. Move/resize app window before starting gui-daemon (via qvm-run ... xdotool ...?)
  6. And ofc, try preloading with using qubes.WaitForSession instead of qubes.WaitForRunningSystem (but still start gui-daemon only when preloaded is used)

When I write "start gui-daemon", I mean the whole thing that qvm-start-daemon does, including qubes.SetMonitorLayout call.

There are probably some more cases to test, I hope you'll think of something :)

@ben-grande
Copy link
Contributor

ben-grande commented Nov 14, 2025

Thanks for the PR, seems very good. Will make the GUI connection much faster. Apart from this PR, I think just some other PRs are needed:

  • qubes-core-admin-client to remove the "is_preload" checks from qvm_start_daemon.py
  • qubes-core-admin to wait service qubes.WaitForSession also if self.guivm and self.features.get("gui", True)

But that is mostly it (besides testing all scenarios).

@marmarek
Copy link
Member Author

Actually, I think the qvm-start-daemon should retain is_preload check - this PR makes it possible to start user session still without gui daemon.

@qubesos-bot
Copy link

qubesos-bot commented Nov 16, 2025

OpenQA test summary

Complete test suite and dependencies: https://openqa.qubes-os.org/tests/overview?distri=qubesos&version=4.3&build=2025121015-4.3&flavor=pull-requests

Test run included the following:

Upload failures

  • system_tests_splitgpg
    • system_tests: wait_serial (wait serial expected)
      # wait_serial expected: qr/ELtBH-\d+-/...

    • system_tests: Failed (test died + timed out)
      # Test died: command 'testfunc qubes.tests.extra' timed out at qube...

New failures, excluding unstable

Compared to: https://openqa.qubes-os.org/tests/overview?distri=qubesos&version=4.3&build=2025111104-4.3&flavor=update

  • system_tests_extra

    • TC_00_InputProxy_debian-13-xfce: test_050_mouse_late_attach (failure)
      AssertionError: unexpectedly None : Device 'test-inst-input: Test i...

    • TC_00_InputProxy_fedora-42-xfce: test_050_mouse_late_attach (failure)
      AssertionError: unexpectedly None : Device 'test-inst-input: Test i...

  • system_tests_audio

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_223_audio_play_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_224_audio_rec_muted_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_225_audio_rec_unmuted_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_252_audio_playback_audiovm_switch_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

  • system_tests_dispvm_perf@hw7

  • system_tests_guivm_gpu_gui_interactive@hw13

    • gui_filecopy: unnamed test (unknown)
    • gui_filecopy: Failed (test died)
      # Test died: no candidate needle with tag(s) 'files-test-file' matc...
  • system_tests_i3_gui_interactive

    • collect_logs: wait_serial (wait serial expected)
      # wait_serial expected: qr/5Vgbv-\d+-/...

    • collect_logs: Failed (test died + timed out)
      # Test died: command 'curl --form [email protected] --form upn...

    • collect_logs: wait_serial (wait serial expected)
      # wait_serial expected: qr/kkQ8N-\d+-/...

  • system_tests_qwt_win10_seamless@hw13

  • system_tests_audio@hw1

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_223_audio_play_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 60 secon...

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_224_audio_rec_muted_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 60 secon...

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_225_audio_rec_unmuted_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 60 secon...

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_252_audio_playback_audiovm_switch_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 60 secon...

Failed tests

25 failures
  • system_tests_extra

    • TC_00_InputProxy_debian-13-xfce: test_050_mouse_late_attach (failure)
      AssertionError: unexpectedly None : Device 'test-inst-input: Test i...

    • TC_00_InputProxy_fedora-42-xfce: test_050_mouse_late_attach (failure)
      AssertionError: unexpectedly None : Device 'test-inst-input: Test i...

  • system_tests_audio

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_223_audio_play_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_224_audio_rec_muted_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_225_audio_rec_unmuted_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_252_audio_playback_audiovm_switch_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

  • system_tests_dispvm_perf@hw7

  • system_tests_guivm_gpu_gui_interactive@hw13

    • gui_filecopy: unnamed test (unknown)
    • gui_filecopy: Failed (test died)
      # Test died: no candidate needle with tag(s) 'files-test-file' matc...
  • system_tests_i3_gui_interactive

    • collect_logs: wait_serial (wait serial expected)
      # wait_serial expected: qr/5Vgbv-\d+-/...

    • collect_logs: Failed (test died + timed out)
      # Test died: command 'curl --form [email protected] --form upn...

    • collect_logs: wait_serial (wait serial expected)
      # wait_serial expected: qr/kkQ8N-\d+-/...

  • system_tests_qwt_win10_seamless@hw13

    • windows_clipboard_and_filecopy: unnamed test (unknown)
    • windows_clipboard_and_filecopy: Failed (test died)
      # Test died: no candidate needle with tag(s) 'windows-Edge-address-...
  • system_tests_whonix@hw7

    • whonixcheck: fail (unknown)
      Whonixcheck for sys-whonix failed...

    • whonixcheck: Failed (test died)
      # Test died: systemcheck failed at qubesos/tests/whonixcheck.pm lin...

  • system_tests_audio@hw1

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_223_audio_play_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 60 secon...

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_224_audio_rec_muted_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 60 secon...

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_225_audio_rec_unmuted_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 60 secon...

    • TC_20_AudioVM_Pulse_whonix-workstation-18: test_252_audio_playback_audiovm_switch_hvm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 60 secon...

  • system_tests_qwt_win11@hw13

    • windows_install: Failed (test died)
      # Test died: Install failed with code 1 at qubesos/tests/windows_in...

Fixed failures

Compared to: https://openqa.qubes-os.org/tests/158999#dependencies

18 fixed
  • system_tests_extra

    • TC_00_QVCTest_debian-13-xfce: test_010_screenshare (failure + cleanup)
      AssertionError: 2.4614345149565264 not less than 2.0

    • TC_00_QVCTest_whonix-gateway-18: test_010_screenshare (failure)
      AssertionError: 1 != 0 : Timeout waiting for /dev/video0 in test-in...

    • TC_00_QVCTest_whonix-workstation-18: test_010_screenshare (failure)
      AssertionError: 1 != 0 : Timeout waiting for /dev/video0 in test-in...

  • system_tests_guivm_gui_interactive

    • gui_keyboard_layout: unnamed test (unknown)
    • gui_keyboard_layout: Failed (test died)
      # Test died: no candidate needle with tag(s) 'work-xterm, work-xter...
  • system_tests_dispvm

    • system_tests: Fail (unknown)
      Tests qubes.tests.integ.dispvm failed (exit code 1), details report...

    • system_tests: Failed (test died)
      # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...

    • TC_20_DispVM_whonix-workstation-18: test_030_edit_file (failure)
      AssertionError: Timeout waiting for editor window

    • TC_20_DispVM_whonix-workstation-18: test_100_open_in_dispvm (failure)
      AssertionError: './open-file test.txt' failed with ./open-file test...

  • system_tests_guivm_vnc_gui_interactive

    • gui_filecopy: unnamed test (unknown)
    • gui_filecopy: Failed (test died)
      # Test died: no candidate needle with tag(s) 'disp-text-editor' mat...
  • system_tests_qwt_win10@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/kauF4-\d+-/...

    • windows_install: Failed (test died + timed out)
      # Test died: command 'script -e -c 'bash -x /usr/bin/qvm-create-win...

  • system_tests_dispvm_perf@hw7

  • system_tests_qwt_win10_seamless@hw13

  • system_tests_qwt_win11@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/iDVvW-\d+-/...

Unstable tests

Performance Tests

Performance degradation:

47 performance degradations
  • debian-13-xfce_exec: 7.34 🔻 ( previous job: 6.42, degradation: 114.33%)
  • dom0_root_seq1m_q8t1_read 3:read_bandwidth_kb: 171893.00 🔻 ( previous job: 365230.00, degradation: 47.06%)
  • dom0_root_seq1m_q1t1_write 3:write_bandwidth_kb: 97892.00 🔻 ( previous job: 130397.00, degradation: 75.07%)
  • dom0_root_rnd4k_q32t1_read 3:read_bandwidth_kb: 10244.00 🔻 ( previous job: 39923.00, degradation: 25.66%)
  • dom0_root_rnd4k_q32t1_write 3:write_bandwidth_kb: 887.00 🔻 ( previous job: 3264.00, degradation: 27.18%)
  • dom0_varlibqubes_seq1m_q8t1_read 3:read_bandwidth_kb: 318329.00 🔻 ( previous job: 491827.00, degradation: 64.72%)
  • dom0_varlibqubes_rnd4k_q32t1_write 3:write_bandwidth_kb: 6464.00 🔻 ( previous job: 10236.00, degradation: 63.15%)
  • fedora-42-xfce_root_seq1m_q8t1_read 3:read_bandwidth_kb: 289902.00 🔻 ( previous job: 346866.00, degradation: 83.58%)
  • fedora-42-xfce_root_seq1m_q8t1_write 3:write_bandwidth_kb: 91173.00 🔻 ( previous job: 137220.00, degradation: 66.44%)
  • fedora-42-xfce_root_seq1m_q1t1_read 3:read_bandwidth_kb: 272145.00 🔻 ( previous job: 355690.00, degradation: 76.51%)
  • fedora-42-xfce_root_rnd4k_q32t1_write 3:write_bandwidth_kb: 2341.00 🔻 ( previous job: 3964.00, degradation: 59.06%)
  • fedora-42-xfce_volatile_seq1m_q1t1_read 3:read_bandwidth_kb: 314227.00 🔻 ( previous job: 349176.00, degradation: 89.99%)
  • fedora-42-xfce_volatile_rnd4k_q32t1_read 3:read_bandwidth_kb: 16904.00 🔻 ( previous job: 79581.00, degradation: 21.24%)
  • debian-13-xfce_vm-dispvm-preload (mean:3.363): 40.36 🔻 ( previous job: 33.80, degradation: 119.40%)
  • debian-13-xfce_vm-dispvm-preload-concurrent (mean:3.025): 36.30 🔻 ( previous job: 30.73, degradation: 118.13%)
  • debian-13-xfce_dom0-dispvm-preload (mean:3.957): 47.48 🔻 ( previous job: 42.37, degradation: 112.07%)
  • debian-13-xfce_dom0-dispvm-preload-concurrent (mean:3.611): 43.34 🔻 ( previous job: 37.83, degradation: 114.56%)
  • debian-13-xfce_dom0-dispvm-preload-less-less-api (mean:4.445): 53.34 🔻 ( previous job: 45.22, degradation: 117.95%)
  • debian-13-xfce_dom0-dispvm-preload-api (mean:3.97): 47.64 🔻 ( previous job: 42.30, degradation: 112.63%)
  • debian-13-xfce_dom0-dispvm-preload-more-more-api (mean:3.947): 47.36 🔻 ( previous job: 41.62, degradation: 113.79%)
  • debian-13-xfce_dom0-dispvm-preload-concurrent-api (mean:3.93): 47.16 🔻 ( previous job: 35.79, degradation: 131.76%)
  • debian-13-xfce_vm-vm (mean:0.06): 0.72 🔻 ( previous job: 0.39, degradation: 184.06%)
  • debian-13-xfce_vm-vm-gui (mean:0.052): 0.62 🔻 ( previous job: 0.37, degradation: 167.30%)
  • debian-13-xfce_vm-vm-concurrent (mean:0.027): 0.32 🔻 ( previous job: 0.15, degradation: 207.10%)
  • debian-13-xfce_vm-vm-gui-concurrent (mean:0.039): 0.47 🔻 ( previous job: 0.30, degradation: 158.25%)
  • debian-13-xfce_dom0-vm-api (mean:0.056): 0.68 🔻 ( previous job: 0.59, degradation: 114.55%)
  • debian-13-xfce_dom0-vm-concurrent-api (mean:0.029): 0.34 🔻 ( previous job: 0.30, degradation: 113.20%)
  • fedora-42-xfce_vm-dispvm-concurrent (mean:4.067): 48.80 🔻 ( previous job: 43.11, degradation: 113.22%)
  • fedora-42-xfce_vm-dispvm-preload (mean:3.651): 43.81 🔻 ( previous job: 37.87, degradation: 115.68%)
  • fedora-42-xfce_vm-dispvm-preload-concurrent (mean:3.419): 41.03 🔻 ( previous job: 33.59, degradation: 122.15%)
  • fedora-42-xfce_dom0-dispvm-preload-concurrent (mean:3.983): 47.80 🔻 ( previous job: 40.81, degradation: 117.11%)
  • fedora-42-xfce_dom0-dispvm-preload-less-less-api (mean:5.016): 60.20 🔻 ( previous job: 51.37, degradation: 117.18%)
  • fedora-42-xfce_dom0-dispvm-preload-less-api (mean:4.765): 57.18 🔻 ( previous job: 51.28, degradation: 111.51%)
  • fedora-42-xfce_dom0-dispvm-preload-api (mean:4.457): 53.48 🔻 ( previous job: 48.45, degradation: 110.40%)
  • fedora-42-xfce_dom0-dispvm-preload-concurrent-api (mean:4.16): 49.91 🔻 ( previous job: 42.15, degradation: 118.42%)
  • fedora-42-xfce_vm-vm (mean:0.035): 0.42 🔻 ( previous job: 0.34, degradation: 123.98%)
  • fedora-42-xfce_vm-vm-concurrent (mean:0.022): 0.26 🔻 ( previous job: 0.14, degradation: 183.92%)
  • fedora-42-xfce_vm-vm-gui-concurrent (mean:0.033): 0.40 🔻 ( previous job: 0.35, degradation: 113.68%)
  • fedora-42-xfce_dom0-vm-api (mean:0.043): 0.51 🔻 ( previous job: 0.39, degradation: 130.87%)
  • fedora-42-xfce_dom0-vm-gui-concurrent-api (mean:0.057): 0.68 🔻 ( previous job: 0.38, degradation: 178.53%)
  • whonix-workstation-18_vm-dispvm-preload (mean:4.841): 58.09 🔻 ( previous job: 47.12, degradation: 123.28%)
  • whonix-workstation-18_vm-dispvm-preload-concurrent (mean:4.792): 57.51 🔻 ( previous job: 48.80, degradation: 117.85%)
  • whonix-workstation-18_dom0-dispvm-preload (mean:5.674): 68.09 🔻 ( previous job: 61.61, degradation: 110.51%)
  • whonix-workstation-18_dom0-dispvm-preload-concurrent (mean:5.476): 65.71 🔻 ( previous job: 53.21, degradation: 123.49%)
  • whonix-workstation-18_dom0-dispvm-preload-less-less-api (mean:6.311): 75.73 🔻 ( previous job: 65.85, degradation: 115.02%)
  • whonix-workstation-18_dom0-dispvm-preload-concurrent-api (mean:5.175): 62.10 🔻 ( previous job: 55.58, degradation: 111.74%)
  • whonix-workstation-18_vm-vm-gui-concurrent (mean:0.025): 0.30 🔻 ( previous job: 0.26, degradation: 114.45%)

Remaining performance tests:

130 tests
  • debian-13-xfce_exec-root: 27.03 🟢 ( previous job: 27.48, improvement: 98.35%)
  • debian-13-xfce_socket: 8.20 🟢 ( previous job: 8.68, improvement: 94.52%)
  • debian-13-xfce_socket-root: 8.38 🟢 ( previous job: 8.40, improvement: 99.74%)
  • debian-13-xfce_exec-data-simplex: 59.61 🟢 ( previous job: 67.70, improvement: 88.06%)
  • debian-13-xfce_exec-data-duplex: 70.63 🔻 ( previous job: 69.20, degradation: 102.07%)
  • debian-13-xfce_exec-data-duplex-root: 81.25 🟢 ( previous job: 86.64, improvement: 93.77%)
  • debian-13-xfce_socket-data-duplex: 131.85 🟢 ( previous job: 136.31, improvement: 96.73%)
  • fedora-42-xfce_exec: 9.15 🟢 ( previous job: 9.23, improvement: 99.16%)
  • fedora-42-xfce_exec-root: 59.55 🟢 ( previous job: 59.89, improvement: 99.42%)
  • fedora-42-xfce_socket: 8.43 🔻 ( previous job: 8.23, degradation: 102.38%)
  • fedora-42-xfce_socket-root: 8.31 🔻 ( previous job: 8.31, degradation: 100.03%)
  • fedora-42-xfce_exec-data-simplex: 69.92 🔻 ( previous job: 66.18, degradation: 105.65%)
  • fedora-42-xfce_exec-data-duplex: 68.00 🟢 ( previous job: 71.51, improvement: 95.09%)
  • fedora-42-xfce_exec-data-duplex-root: 96.23 🟢 ( previous job: 96.52, improvement: 99.70%)
  • fedora-42-xfce_socket-data-duplex: 132.66 🟢 ( previous job: 137.78, improvement: 96.28%)
  • whonix-gateway-18_exec: 7.84 🟢 ( previous job: 8.52, improvement: 92.10%)
  • whonix-gateway-18_exec-root: 136.72 🔻 ( previous job: 129.05, degradation: 105.94%)
  • whonix-gateway-18_socket: 8.44 🔻 ( previous job: 8.26, degradation: 102.13%)
  • whonix-gateway-18_socket-root: 8.32 🔻 ( previous job: 7.76, degradation: 107.25%)
  • whonix-gateway-18_exec-data-simplex: 65.73 🟢 ( previous job: 73.13, improvement: 89.88%)
  • whonix-gateway-18_exec-data-duplex: 72.96 🔻 ( previous job: 71.98, degradation: 101.36%)
  • whonix-gateway-18_exec-data-duplex-root: 143.98 🟢 ( previous job: 146.68, improvement: 98.16%)
  • whonix-gateway-18_socket-data-duplex: 141.65 🟢 ( previous job: 142.71, improvement: 99.26%)
  • whonix-workstation-18_exec: 8.42 🟢 ( previous job: 8.85, improvement: 95.16%)
  • whonix-workstation-18_exec-root: 142.79 🟢 ( previous job: 149.84, improvement: 95.29%)
  • whonix-workstation-18_socket: 8.54 🟢 ( previous job: 9.12, improvement: 93.62%)
  • whonix-workstation-18_socket-root: 8.27 🟢 ( previous job: 8.75, improvement: 94.50%)
  • whonix-workstation-18_exec-data-simplex: 70.28 🔻 ( previous job: 67.02, degradation: 104.86%)
  • whonix-workstation-18_exec-data-duplex: 73.92 🔻 ( previous job: 69.25, degradation: 106.75%)
  • whonix-workstation-18_exec-data-duplex-root: 143.68 🟢 ( previous job: 146.32, improvement: 98.20%)
  • whonix-workstation-18_socket-data-duplex: 139.70 🔻 ( previous job: 139.15, degradation: 100.40%)
  • dom0_root_seq1m_q8t1_write 3:write_bandwidth_kb: 260192.00 🟢 ( previous job: 231269.00, improvement: 112.51%)
  • dom0_root_seq1m_q1t1_read 3:read_bandwidth_kb: 254138.00 🟢 ( previous job: 110619.00, improvement: 229.74%)
  • dom0_root_rnd4k_q1t1_read 3:read_bandwidth_kb: 11996.00 🔻 ( previous job: 12000.00, degradation: 99.97%)
  • dom0_root_rnd4k_q1t1_write 3:write_bandwidth_kb: 2317.00 🟢 ( previous job: 2099.00, improvement: 110.39%)
  • dom0_varlibqubes_seq1m_q8t1_write 3:write_bandwidth_kb: 291190.00 🟢 ( previous job: 103611.00, improvement: 281.04%)
  • dom0_varlibqubes_seq1m_q1t1_read 3:read_bandwidth_kb: 440208.00 🟢 ( previous job: 432938.00, improvement: 101.68%)
  • dom0_varlibqubes_seq1m_q1t1_write 3:write_bandwidth_kb: 174993.00 🟢 ( previous job: 143368.00, improvement: 122.06%)
  • dom0_varlibqubes_rnd4k_q32t1_read 3:read_bandwidth_kb: 105837.00 🟢 ( previous job: 103977.00, improvement: 101.79%)
  • dom0_varlibqubes_rnd4k_q1t1_read 3:read_bandwidth_kb: 8139.00 🔻 ( previous job: 8300.00, degradation: 98.06%)
  • dom0_varlibqubes_rnd4k_q1t1_write 3:write_bandwidth_kb: 3681.00 🔻 ( previous job: 3936.00, degradation: 93.52%)
  • fedora-42-xfce_root_seq1m_q1t1_write 3:write_bandwidth_kb: 51638.00 🟢 ( previous job: 26931.00, improvement: 191.74%)
  • fedora-42-xfce_root_rnd4k_q32t1_read 3:read_bandwidth_kb: 89034.00 🟢 ( previous job: 85360.00, improvement: 104.30%)
  • fedora-42-xfce_root_rnd4k_q1t1_read 3:read_bandwidth_kb: 8698.00 🔻 ( previous job: 8945.00, degradation: 97.24%)
  • fedora-42-xfce_root_rnd4k_q1t1_write 3:write_bandwidth_kb: 1156.00 🟢 ( previous job: 457.00, improvement: 252.95%)
  • fedora-42-xfce_private_seq1m_q8t1_read 3:read_bandwidth_kb: 345267.00 🔻 ( previous job: 371835.00, degradation: 92.85%)
  • fedora-42-xfce_private_seq1m_q8t1_write 3:write_bandwidth_kb: 132005.00 🟢 ( previous job: 108858.00, improvement: 121.26%)
  • fedora-42-xfce_private_seq1m_q1t1_read 3:read_bandwidth_kb: 325039.00 🔻 ( previous job: 351871.00, degradation: 92.37%)
  • fedora-42-xfce_private_seq1m_q1t1_write 3:write_bandwidth_kb: 99189.00 🟢 ( previous job: 49472.00, improvement: 200.50%)
  • fedora-42-xfce_private_rnd4k_q32t1_read 3:read_bandwidth_kb: 85378.00 🟢 ( previous job: 75326.00, improvement: 113.34%)
  • fedora-42-xfce_private_rnd4k_q32t1_write 3:write_bandwidth_kb: 1990.00 🟢 ( previous job: 1909.00, improvement: 104.24%)
  • fedora-42-xfce_private_rnd4k_q1t1_read 3:read_bandwidth_kb: 9319.00 🟢 ( previous job: 8365.00, improvement: 111.40%)
  • fedora-42-xfce_private_rnd4k_q1t1_write 3:write_bandwidth_kb: 1003.00 🟢 ( previous job: 517.00, improvement: 194.00%)
  • fedora-42-xfce_volatile_seq1m_q8t1_read 3:read_bandwidth_kb: 366763.00 🟢 ( previous job: 361328.00, improvement: 101.50%)
  • fedora-42-xfce_volatile_seq1m_q8t1_write 3:write_bandwidth_kb: 153925.00 🟢 ( previous job: 140939.00, improvement: 109.21%)
  • fedora-42-xfce_volatile_seq1m_q1t1_write 3:write_bandwidth_kb: 88572.00 🟢 ( previous job: 46842.00, improvement: 189.09%)
  • fedora-42-xfce_volatile_rnd4k_q32t1_write 3:write_bandwidth_kb: 5028.00 🟢 ( previous job: 2110.00, improvement: 238.29%)
  • fedora-42-xfce_volatile_rnd4k_q1t1_read 3:read_bandwidth_kb: 7433.00 🔻 ( previous job: 7708.00, degradation: 96.43%)
  • fedora-42-xfce_volatile_rnd4k_q1t1_write 3:write_bandwidth_kb: 2138.00 🟢 ( previous job: 861.00, improvement: 248.32%)
  • debian-13-xfce_vm-dispvm (mean:6.577): 78.92 🔻 ( previous job: 77.37, degradation: 102.01%)
  • debian-13-xfce_vm-dispvm-gui (mean:7.41): 88.92 🟢 ( previous job: 90.06, improvement: 98.73%)
  • debian-13-xfce_vm-dispvm-concurrent (mean:3.197): 38.37 🔻 ( previous job: 37.20, degradation: 103.13%)
  • debian-13-xfce_vm-dispvm-gui-concurrent (mean:3.912): 46.95 🔻 ( previous job: 46.42, degradation: 101.14%)
  • debian-13-xfce_dom0-dispvm (mean:7.072): 84.86 🔻 ( previous job: 81.57, degradation: 104.04%)
  • debian-13-xfce_dom0-dispvm-gui (mean:8.027): 96.33 🟢 ( previous job: 97.80, improvement: 98.50%)
  • debian-13-xfce_dom0-dispvm-concurrent (mean:3.442): 41.30 🔻 ( previous job: 39.05, degradation: 105.76%)
  • debian-13-xfce_dom0-dispvm-gui-concurrent (mean:4.13): 49.55 🔻 ( previous job: 49.35, degradation: 100.42%)
  • debian-13-xfce_vm-dispvm-preload-gui (mean:3.376): 40.51 🟢 ( previous job: 45.44, improvement: 89.15%)
  • debian-13-xfce_vm-dispvm-preload-gui-concurrent (mean:3.143): 37.71 🟢 ( previous job: 43.08, improvement: 87.55%)
  • debian-13-xfce_dom0-dispvm-preload-gui (mean:3.863): 46.36 🟢 ( previous job: 52.97, improvement: 87.52%)
  • debian-13-xfce_dom0-dispvm-preload-gui-concurrent (mean:3.645): 43.74 🔻 ( previous job: 43.55, degradation: 100.45%)
  • debian-13-xfce_dom0-dispvm-api (mean:7.104): 85.25 🔻 ( previous job: 84.68, degradation: 100.67%)
  • debian-13-xfce_dom0-dispvm-gui-api (mean:8.041): 96.49 🟢 ( previous job: 98.62, improvement: 97.83%)
  • debian-13-xfce_dom0-dispvm-concurrent-api (mean:3.454): 41.44 🔻 ( previous job: 40.02, degradation: 103.56%)
  • debian-13-xfce_dom0-dispvm-gui-concurrent-api (mean:3.892): 46.71 🟢 ( previous job: 47.52, improvement: 98.30%)
  • debian-13-xfce_dom0-dispvm-preload-less-api (mean:4.093): 49.12 🔻 ( previous job: 44.71, degradation: 109.87%)
  • debian-13-xfce_dom0-dispvm-preload-more-api (mean:3.775): 45.30 🔻 ( previous job: 44.67, degradation: 101.39%)
  • debian-13-xfce_dom0-dispvm-preload-gui-api (mean:4.042): 48.51 🟢 ( previous job: 53.96, improvement: 89.90%)
  • debian-13-xfce_dom0-dispvm-preload-gui-concurrent-api (mean:3.52): 42.24
  • debian-13-xfce_dom0-vm-gui-api (mean:0.043): 0.52 🟢 ( previous job: 0.58, improvement: 89.12%)
  • debian-13-xfce_dom0-vm-gui-concurrent-api (mean:0.026): 0.32 🟢 ( previous job: 0.34, improvement: 92.38%)
  • fedora-42-xfce_vm-dispvm (mean:7.137): 85.64 🔻 ( previous job: 85.63, degradation: 100.01%)
  • fedora-42-xfce_vm-dispvm-gui (mean:8.361): 100.33 🟢 ( previous job: 102.18, improvement: 98.19%)
  • fedora-42-xfce_vm-dispvm-gui-concurrent (mean:4.467): 53.61 🔻 ( previous job: 52.51, degradation: 102.09%)
  • fedora-42-xfce_dom0-dispvm (mean:7.654): 91.84 🟢 ( previous job: 91.92, improvement: 99.92%)
  • fedora-42-xfce_dom0-dispvm-gui (mean:8.91): 106.92 🟢 ( previous job: 108.46, improvement: 98.58%)
  • fedora-42-xfce_dom0-dispvm-concurrent (mean:3.668): 44.01 🟢 ( previous job: 44.99, improvement: 97.82%)
  • fedora-42-xfce_dom0-dispvm-gui-concurrent (mean:4.677): 56.13 🔻 ( previous job: 53.77, degradation: 104.37%)
  • fedora-42-xfce_vm-dispvm-preload-gui (mean:3.748): 44.97 🟢 ( previous job: 50.03, improvement: 89.89%)
  • fedora-42-xfce_vm-dispvm-preload-gui-concurrent (mean:3.395): 40.74 🟢 ( previous job: 43.85, improvement: 92.92%)
  • fedora-42-xfce_dom0-dispvm-preload (mean:4.288): 51.45 🔻 ( previous job: 48.05, degradation: 107.09%)
  • fedora-42-xfce_dom0-dispvm-preload-gui (mean:4.441): 53.29 🟢 ( previous job: 58.25, improvement: 91.49%)
  • fedora-42-xfce_dom0-dispvm-preload-gui-concurrent (mean:4.083): 49.00 🟢 ( previous job: 69.71, improvement: 70.29%)
  • fedora-42-xfce_dom0-dispvm-api (mean:7.469): 89.63 🟢 ( previous job: 89.70, improvement: 99.92%)
  • fedora-42-xfce_dom0-dispvm-gui-api (mean:8.613): 103.36 🟢 ( previous job: 107.00, improvement: 96.60%)
  • fedora-42-xfce_dom0-dispvm-concurrent-api (mean:3.723): 44.67 🔻 ( previous job: 44.44, degradation: 100.52%)
  • fedora-42-xfce_dom0-dispvm-gui-concurrent-api (mean:4.332): 51.98 🟢 ( previous job: 54.99, improvement: 94.53%)
  • fedora-42-xfce_dom0-dispvm-preload-more-api (mean:4.229): 50.74 🔻 ( previous job: 49.50, degradation: 102.52%)
  • fedora-42-xfce_dom0-dispvm-preload-more-more-api (mean:4.011): 48.13 🔻 ( previous job: 46.74, degradation: 102.98%)
  • fedora-42-xfce_dom0-dispvm-preload-gui-api (mean:4.36): 52.32 🟢 ( previous job: 59.30, improvement: 88.23%)
  • fedora-42-xfce_dom0-dispvm-preload-gui-concurrent-api (mean:4.089): 49.07 🟢 ( previous job: 49.18, improvement: 99.77%)
  • fedora-42-xfce_vm-vm-gui (mean:0.036): 0.43 🔻 ( previous job: 0.40, degradation: 107.23%)
  • fedora-42-xfce_dom0-vm-gui-api (mean:0.044): 0.53 🟢 ( previous job: 0.54, improvement: 98.33%)
  • fedora-42-xfce_dom0-vm-concurrent-api (mean:0.028): 0.33 🟢 ( previous job: 0.39, improvement: 86.23%)
  • whonix-workstation-18_vm-dispvm (mean:9.258): 111.10 🔻 ( previous job: 108.77, degradation: 102.13%)
  • whonix-workstation-18_vm-dispvm-gui (mean:9.944): 119.33 🟢 ( previous job: 122.74, improvement: 97.22%)
  • whonix-workstation-18_vm-dispvm-concurrent (mean:5.359): 64.30 🟢 ( previous job: 65.23, improvement: 98.58%)
  • whonix-workstation-18_vm-dispvm-gui-concurrent (mean:5.955): 71.46 🔻 ( previous job: 67.13, degradation: 106.46%)
  • whonix-workstation-18_dom0-dispvm (mean:9.69): 116.28 🟢 ( previous job: 117.05, improvement: 99.34%)
  • whonix-workstation-18_dom0-dispvm-gui (mean:10.589): 127.06 🟢 ( previous job: 132.80, improvement: 95.68%)
  • whonix-workstation-18_dom0-dispvm-concurrent (mean:5.06): 60.72 🟢 ( previous job: 60.96, improvement: 99.61%)
  • whonix-workstation-18_vm-dispvm-preload-gui (mean:4.682): 56.19 🟢 ( previous job: 63.65, improvement: 88.28%)
  • whonix-workstation-18_vm-dispvm-preload-gui-concurrent (mean:4.8): 57.60 🔻 ( previous job: 56.11, degradation: 102.65%)
  • whonix-workstation-18_dom0-dispvm-preload-gui (mean:5.554): 66.65 🟢 ( previous job: 73.22, improvement: 91.02%)
  • whonix-workstation-18_dom0-dispvm-preload-gui-concurrent (mean:5.123): 61.48 🟢 ( previous job: 61.72, improvement: 99.61%)
  • whonix-workstation-18_dom0-dispvm-api (mean:9.693): 116.32 🟢 ( previous job: 117.52, improvement: 98.98%)
  • whonix-workstation-18_dom0-dispvm-gui-api (mean:10.655): 127.86 🟢 ( previous job: 130.38, improvement: 98.07%)
  • whonix-workstation-18_dom0-dispvm-concurrent-api (mean:5.067): 60.81 🟢 ( previous job: 60.98, improvement: 99.72%)
  • whonix-workstation-18_dom0-dispvm-gui-concurrent-api (mean:5.655): 67.86 🔻 ( previous job: 64.99, degradation: 104.42%)
  • whonix-workstation-18_dom0-dispvm-preload-less-api (mean:6.113): 73.35 🔻 ( previous job: 70.09, degradation: 104.65%)
  • whonix-workstation-18_dom0-dispvm-preload-more-api (mean:5.32): 63.84 🟢 ( previous job: 65.09, improvement: 98.07%)
  • whonix-workstation-18_dom0-dispvm-preload-gui-api (mean:5.538): 66.46
  • whonix-workstation-18_dom0-dispvm-preload-gui-concurrent-api (mean:5.383): 64.60 🔻 ( previous job: 61.70, degradation: 104.71%)
  • whonix-workstation-18_vm-vm (mean:0.043): 0.52 🟢 ( previous job: 0.74, improvement: 69.85%)
  • whonix-workstation-18_vm-vm-gui (mean:0.053): 0.64 🔻 ( previous job: 0.60, degradation: 106.54%)
  • whonix-workstation-18_vm-vm-concurrent (mean:0.018): 0.21 🟢 ( previous job: 0.32, improvement: 65.12%)
  • whonix-workstation-18_dom0-vm-api (mean:0.042): 0.50 🟢 ( previous job: 0.60, improvement: 83.28%)
  • whonix-workstation-18_dom0-vm-gui-api (mean:0.041): 0.49 🔻 ( previous job: 0.45, degradation: 108.46%)
  • whonix-workstation-18_dom0-vm-concurrent-api (mean:0.023): 0.28 🟢 ( previous job: 0.42, improvement: 66.27%)
  • whonix-workstation-18_dom0-vm-gui-concurrent-api (mean:0.039): 0.46 🟢 ( previous job: 0.53, improvement: 88.05%)

@marmarek
Copy link
Member Author

Unexpected side effect: notification proxy starts earlier, before user logs in, and fails to connect to (not running yet) notification daemon in dom0: QubesOS/qubes-video-companion#33 (comment)
Hopefully harmless (it retries), but pollute logs...

@marmarek
Copy link
Member Author

This also breaks (kinda) sys-gui... Xephyr gets started with wrong resolution (the hardcoded 1920x1080, instead of what dom0 sends). I'm not sure why, could be startup timing, but maybe sending monitor layout is broken with sys-gui.

marmarek added a commit to marmarek/qubes-gui-agent-linux that referenced this pull request Nov 20, 2025
When running sys-gui, there are two X servers. The one on :1 is actually
connected to dom0, adjust resolution/monitor layout there. The internal
one likely need adjustment too, but leave that for later

This hopefully will be enough to unbreak sys-gui with
QubesOS#251
marmarek added a commit to marmarek/qubes-gui-agent-linux that referenced this pull request Nov 20, 2025
This allows Xephyr to automatically resize on resolution change.
On the other hand, this breaks multi-monitor support in sys-gui even
more... It used to be all monitors combined into a single screen in
sys-gui (with no metadata about the split), and no way to dynamically
change the layout (including dynamically connecting/disconnecting some).

Now the first one will work, including dynamic resolution change, but
all the others will be ignored (remain black). This dynamic resolution
change makes it work again with late gui-daemon connection, see
QubesOS#251

Since sys-gui is mostly fallback option in case sys-gui-gpu cannot be
used for some reason, it can have limitations.
ben-grande added a commit to ben-grande/qubes-core-agent-linux that referenced this pull request Dec 2, 2025
ben-grande added a commit to ben-grande/qubes-core-qrexec that referenced this pull request Dec 2, 2025
Or if GUID of the client can be found on the server. This script will be
replicated to qubes-core-agent-linux.

For: QubesOS/qubes-notification-proxy#13
For: QubesOS/qubes-gui-agent-linux#251
For: QubesOS/qubes-core-admin#757
For: QubesOS/qubes-issues#1512
For: QubesOS/qubes-issues#9940
Fixes: QubesOS/qubes-issues#10443
ben-grande added a commit to ben-grande/qubes-core-agent-linux that referenced this pull request Dec 2, 2025
@ben-grande
Copy link
Contributor

  1. Start VM, but not gui-daemon, start some GUI apps, and only then start gui-daemon - app windows should appear.

  2. As with 1, but start and stop an app several times before starting gui-daemon (while an app window may flicker at gui-daemon startup, nothing should crash).

  3. Start something with tray icon (both before starting gui-daemon and after)

  4. Restart gui-daemon (logout and login to dom0?)

  5. Move/resize app window before starting gui-daemon (via qvm-run ... xdotool ...?)

  6. And ofc, try preloading with using qubes.WaitForSession instead of qubes.WaitForRunningSystem (but still start gui-daemon only when preloaded is used)

1, 2, 3, 4, 6 are working.

For 5, I am using Xfce, it seems that Windows return to the center of the screen, if I move them a little off. Anyway, does not seem related to this PR.

I don't see flickering (windows that shouldn't be present or are in invalid places) when the gui daemon is ready and the windows appear.

@ben-grande
Copy link
Contributor

Also related to testing, it seems that the most reliable way was to logout of the session instead of manually starting and stopping qvm-start-daemon, as the latter may leave to a strange state where stopping qvm-start-daemon doesn't stop/hide the windows. Anyway, not related to this PR, just sharing my results of how to test.

@ben-grande
Copy link
Contributor

:) Things are working.

  • dispvm: Some failures on tests that have a lot of disposables for virtualized Qubes to handle
  • dispvm_perf: 2 failures on Whonix, 1 was with a lot of preloaded disposables, the other was timeout trying to shutdown Whonix disposable template, which is done on setUp

@ben-grande
Copy link
Contributor

qubesos-4.3-update-x86_64-Build2025112504-4.3-system_tests_dispvm_perf@hw7

qubesos-4.3-pull-requests-x86_64-Build2025120216-4.3-system_tests_dispvm_perf@hw7

ben-grande added a commit to ben-grande/qubes-core-agent-linux that referenced this pull request Dec 3, 2025
ben-grande added a commit to ben-grande/qubes-core-qrexec that referenced this pull request Dec 3, 2025
Or if GUID of the client can be found on the server. This script will be
replicated to qubes-core-agent-linux.

For: QubesOS/qubes-notification-proxy#13
For: QubesOS/qubes-gui-agent-linux#251
For: QubesOS/qubes-core-admin#757
For: QubesOS/qubes-issues#1512
For: QubesOS/qubes-issues#9940
Fixes: QubesOS/qubes-issues#10443
ben-grande added a commit to ben-grande/qubes-core-qrexec that referenced this pull request Dec 3, 2025
Or if GUID of the client can be found on the server. This script will be
replicated to qubes-core-agent-linux.

For: QubesOS/qubes-notification-proxy#13
For: QubesOS/qubes-gui-agent-linux#251
For: QubesOS/qubes-core-admin#757
For: QubesOS/qubes-issues#1512
For: QubesOS/qubes-issues#9940
Fixes: QubesOS/qubes-issues#10443
ben-grande added a commit to ben-grande/qubes-core-agent-linux that referenced this pull request Dec 3, 2025
ben-grande added a commit to ben-grande/qubes-core-qrexec that referenced this pull request Dec 3, 2025
Or if GUID of the client can be found on the server. This script will be
replicated to qubes-core-agent-linux.

For: QubesOS/qubes-notification-proxy#13
For: QubesOS/qubes-gui-agent-linux#251
For: QubesOS/qubes-core-admin#757
For: QubesOS/qubes-issues#1512
For: QubesOS/qubes-issues#9940
Fixes: QubesOS/qubes-issues#10443
ben-grande added a commit to ben-grande/qubes-core-qrexec that referenced this pull request Dec 3, 2025
Or if GUID of the client can be found on the server. This script will be
replicated to qubes-core-agent-linux.

For: QubesOS/qubes-notification-proxy#13
For: QubesOS/qubes-gui-agent-linux#251
For: QubesOS/qubes-core-admin#757
For: QubesOS/qubes-issues#1512
For: QubesOS/qubes-issues#9940
Fixes: QubesOS/qubes-issues#10443
ben-grande added a commit to ben-grande/qubes-core-agent-linux that referenced this pull request Dec 3, 2025
ben-grande added a commit to ben-grande/qubes-core-qrexec that referenced this pull request Dec 4, 2025
Or if GUID of the client can be found on the server. This script will be
replicated to qubes-core-agent-linux.

For: QubesOS/qubes-notification-proxy#13
For: QubesOS/qubes-gui-agent-linux#251
For: QubesOS/qubes-core-admin#757
For: QubesOS/qubes-issues#1512
For: QubesOS/qubes-issues#9940
Fixes: QubesOS/qubes-issues#10443
ben-grande added a commit to ben-grande/qubes-core-agent-linux that referenced this pull request Dec 4, 2025
ben-grande added a commit to ben-grande/qubes-core-qrexec that referenced this pull request Dec 4, 2025
Or if GUID of the client can be found on the server. This script will be
replicated to qubes-core-agent-linux.

For: QubesOS/qubes-notification-proxy#13
For: QubesOS/qubes-gui-agent-linux#251
For: QubesOS/qubes-core-admin#757
For: QubesOS/qubes-issues#1512
For: QubesOS/qubes-issues#9940
Fixes: QubesOS/qubes-issues#10443
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants