Skip to content
This repository has been archived by the owner on Nov 1, 2021. It is now read-only.

Infinite recursion when trying to disable display on wlroots master #2253

Closed
YSelfTool opened this issue Jun 4, 2020 · 2 comments · Fixed by #2259
Closed

Infinite recursion when trying to disable display on wlroots master #2253

YSelfTool opened this issue Jun 4, 2020 · 2 comments · Fixed by #2259

Comments

@YSelfTool
Copy link

Excerpt from the debug log:

00:00:24.933 [sway/config/output.c:343] Turning off output DP-5
00:00:24.933 [sway/config/output.c:418] Committing output DP-5
00:00:25.280 [DEBUG] [backend/drm/drm.c:1073] Reallocating CRTCs
00:00:25.280 [DEBUG] [backend/drm/drm.c:1084] State before reallocation:
00:00:25.280 [DEBUG] [backend/drm/drm.c:1090]   'eDP-1' crtc=0 state=3 desired_enabled=1
00:00:25.280 [DEBUG] [backend/drm/drm.c:1090]   'DP-1' crtc=-1 state=0 desired_enabled=0
00:00:25.280 [DEBUG] [backend/drm/drm.c:1090]   'HDMI-A-1' crtc=-1 state=0 desired_enabled=0
00:00:25.280 [DEBUG] [backend/drm/drm.c:1090]   'DP-2' crtc=-1 state=0 desired_enabled=0
00:00:25.280 [DEBUG] [backend/drm/drm.c:1090]   'HDMI-A-2' crtc=-1 state=0 desired_enabled=0
00:00:25.280 [DEBUG] [backend/drm/drm.c:1090]   'DP-3' crtc=-1 state=1 desired_enabled=1
00:00:25.280 [DEBUG] [backend/drm/drm.c:1090]   'DP-4' crtc=-1 state=0 desired_enabled=0
00:00:25.280 [DEBUG] [backend/drm/drm.c:1090]   'DP-5' crtc=1 state=3 desired_enabled=0
00:00:25.280 [DEBUG] [backend/drm/drm.c:1090]   'DP-6' crtc=-1 state=0 desired_enabled=0
00:00:25.280 [DEBUG] [backend/drm/drm.c:1090]   'DP-7' crtc=2 state=3 desired_enabled=1
00:00:25.280 [DEBUG] [backend/drm/drm.c:1090]   'DP-8' crtc=-1 state=0 desired_enabled=0
00:00:25.280 [DEBUG] [backend/drm/drm.c:1090]   'DP-9' crtc=-1 state=0 desired_enabled=0
00:00:25.280 [DEBUG] [backend/drm/drm.c:1142] State after reallocation:
00:00:25.281 [DEBUG] [backend/drm/drm.c:1149]   'eDP-1' crtc=0 state=3 desired_enabled=1
00:00:25.281 [DEBUG] [backend/drm/drm.c:1149]   'DP-1' crtc=-1 state=0 desired_enabled=0
00:00:25.281 [DEBUG] [backend/drm/drm.c:1149]   'HDMI-A-1' crtc=-1 state=0 desired_enabled=0
00:00:25.281 [DEBUG] [backend/drm/drm.c:1149]   'DP-2' crtc=-1 state=0 desired_enabled=0
00:00:25.281 [DEBUG] [backend/drm/drm.c:1149]   'HDMI-A-2' crtc=-1 state=0 desired_enabled=0
00:00:25.281 [DEBUG] [backend/drm/drm.c:1149]   'DP-3' crtc=1 state=1 desired_enabled=1
00:00:25.281 [DEBUG] [backend/drm/drm.c:1149]   'DP-4' crtc=-1 state=0 desired_enabled=0
00:00:25.281 [DEBUG] [backend/drm/drm.c:1149]   'DP-5' crtc=-1 state=3 desired_enabled=0
00:00:25.281 [DEBUG] [backend/drm/drm.c:1052] De-allocating CRTC 1 for output 'DP-5'
00:00:25.281 [DEBUG] [backend/drm/drm.c:1073] Reallocating CRTCs
…

The part starting with Reallocating CRTCs repeats infinitely, until sway segfaults.

The callstack is as follows (all happening in backend/drm/drm.c):

  • realloc_crtcs in it's "Apply new configuration" loop calls dealloc_crtc(conn)
  • dealloc_crtc calls drm_connector_set_mode(conn, NULL)
  • drm_connector_set_mode in if (wlr_mode == NULL) if (conn->crtc != NULL) calls drm_crtc_commit and then realloc_crtcs.

This happens on a thinkpad with three external displays connected. Since the iGPU only supports up to three displays, one is in some kind of invalid state (from early in the log):

00:00:00.693 [DEBUG] [backend/drm/drm.c:1073] Reallocating CRTCs
00:00:00.693 [DEBUG] [backend/drm/drm.c:1084] State before reallocation:
00:00:00.693 [DEBUG] [backend/drm/drm.c:1090]   'eDP-1' crtc=0 state=3 desired_enabled=1
00:00:00.693 [DEBUG] [backend/drm/drm.c:1090]   'DP-1' crtc=-1 state=0 desired_enabled=0
00:00:00.693 [DEBUG] [backend/drm/drm.c:1090]   'HDMI-A-1' crtc=-1 state=0 desired_enabled=0
00:00:00.693 [DEBUG] [backend/drm/drm.c:1090]   'DP-2' crtc=-1 state=0 desired_enabled=0
00:00:00.693 [DEBUG] [backend/drm/drm.c:1090]   'HDMI-A-2' crtc=-1 state=0 desired_enabled=0
00:00:00.693 [DEBUG] [backend/drm/drm.c:1090]   'DP-3' crtc=-1 state=1 desired_enabled=1
00:00:00.693 [DEBUG] [backend/drm/drm.c:1090]   'DP-4' crtc=-1 state=0 desired_enabled=0
00:00:00.693 [DEBUG] [backend/drm/drm.c:1090]   'DP-5' crtc=1 state=1 desired_enabled=1
00:00:00.693 [DEBUG] [backend/drm/drm.c:1090]   'DP-6' crtc=-1 state=0 desired_enabled=0
00:00:00.693 [DEBUG] [backend/drm/drm.c:1090]   'DP-7' crtc=2 state=1 desired_enabled=1
00:00:00.693 [DEBUG] [backend/drm/drm.c:1090]   'DP-8' crtc=-1 state=0 desired_enabled=0
00:00:00.694 [DEBUG] [backend/drm/drm.c:1090]   'DP-9' crtc=-1 state=0 desired_enabled=0
00:00:00.694 [DEBUG] [backend/drm/drm.c:1142] State after reallocation:
00:00:00.694 [DEBUG] [backend/drm/drm.c:1149]   'eDP-1' crtc=0 state=3 desired_enabled=1
00:00:00.694 [DEBUG] [backend/drm/drm.c:1149]   'DP-1' crtc=-1 state=0 desired_enabled=0
00:00:00.694 [DEBUG] [backend/drm/drm.c:1149]   'HDMI-A-1' crtc=-1 state=0 desired_enabled=0
00:00:00.694 [DEBUG] [backend/drm/drm.c:1149]   'DP-2' crtc=-1 state=0 desired_enabled=0
00:00:00.694 [DEBUG] [backend/drm/drm.c:1149]   'HDMI-A-2' crtc=-1 state=0 desired_enabled=0
00:00:00.694 [DEBUG] [backend/drm/drm.c:1149]   'DP-3' crtc=-1 state=1 desired_enabled=1
00:00:00.694 [DEBUG] [backend/drm/drm.c:1149]   'DP-4' crtc=-1 state=0 desired_enabled=0
00:00:00.694 [DEBUG] [backend/drm/drm.c:1149]   'DP-5' crtc=1 state=1 desired_enabled=1
00:00:00.694 [DEBUG] [backend/drm/drm.c:1149]   'DP-6' crtc=-1 state=0 desired_enabled=0
00:00:00.694 [DEBUG] [backend/drm/drm.c:1149]   'DP-7' crtc=2 state=1 desired_enabled=1
00:00:00.694 [DEBUG] [backend/drm/drm.c:1149]   'DP-8' crtc=-1 state=0 desired_enabled=0
00:00:00.694 [DEBUG] [backend/drm/drm.c:1149]   'DP-9' crtc=-1 state=0 desired_enabled=0
00:00:00.694 [ERROR] [backend/drm/drm.c:798] Cannot modeset 'DP-3': no CRTC for this connector

The full log is available here: https://www.rsonn.de/downloads/sway-realloc-crtc-loop.log

The problem doesn't happen with sway/wlroots (release), only after I installed sway-git and wlroots-git (current master).

emersion added a commit to emersion/wlroots that referenced this issue Jun 5, 2020
Call drm_crtc_commit directly instead of calling drm_connector_set_mode.
This restores the previous behaviour where conn_enable was called [1].

[1]: https://github.com/swaywm/wlroots/blob/0c7c562482575cacaecadcd7913ef25aeb21711f/backend/drm/drm.c#L1093

Closes: swaywm#2253
@emersion
Copy link
Member

emersion commented Jun 5, 2020

Can you try #2259?

@YSelfTool
Copy link
Author

Tested, #2259 works fine. Thanks!

ddevault pushed a commit that referenced this issue Jun 8, 2020
Call drm_crtc_commit directly instead of calling drm_connector_set_mode.
This restores the previous behaviour where conn_enable was called [1].

[1]: https://github.com/swaywm/wlroots/blob/0c7c562482575cacaecadcd7913ef25aeb21711f/backend/drm/drm.c#L1093

Closes: #2253
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Development

Successfully merging a pull request may close this issue.

2 participants