rust-windowing / rust-windowing/softbuffer
DRM: example fails to page flip with EBUSY
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 506
- Forks
- 85
- PR merge metrics
- No merged PRs in 30d
Description
The drm example fails for me while trying the first page filp (of course, no other software is using the DRM). I have tried the legacy_modeset example of https://github.com/Smithay/drm-rs and it works, so I'm probably missing something, but I'm at a loss about what. Anyway, the output is:
Drawing tick 1
Error: PlatformError(Some("failed to page flip"), Some(Os { code: 16, kind: ResourceBusy, message: "Device or resource busy" }))
and, when run through strace, the output is:
$ strace -e ioctl ./drm
ioctl(3, DRM_IOCTL_MODE_GETRESOURCES, 0xbeff5840) = 0
ioctl(3, DRM_IOCTL_MODE_GETRESOURCES, 0xbeff5898) = 0
ioctl(3, DRM_IOCTL_MODE_GETCONNECTOR, 0xbeff5580) = 0
ioctl(3, DRM_IOCTL_MODE_GETCONNECTOR, 0xbeff5690) = 0
ioctl(3, DRM_IOCTL_MODE_GETRESOURCES, 0xbeff5960) = 0
ioctl(3, DRM_IOCTL_MODE_GETRESOURCES, 0xbeff59b8) = 0
ioctl(3, DRM_IOCTL_MODE_GETCONNECTOR, 0xbeff5330) = 0
ioctl(3, DRM_IOCTL_MODE_GETCONNECTOR, 0xbeff5440) = 0
ioctl(3, DRM_IOCTL_MODE_GETCRTC, 0xbeff5200) = 0
ioctl(3, DRM_IOCTL_MODE_GETPLANERESOURCES, 0xbeff5c00) = 0
ioctl(3, DRM_IOCTL_MODE_GETPLANERESOURCES, 0xbeff5c28) = 0
ioctl(3, DRM_IOCTL_MODE_GETPLANE, 0xbeff5940) = 0
ioctl(3, DRM_IOCTL_MODE_GETPLANE, 0xbeff59b8) = 0
ioctl(3, DRM_IOCTL_MODE_OBJ_GETPROPERTIES, 0xbeff58b0) = 0
ioctl(3, DRM_IOCTL_MODE_OBJ_GETPROPERTIES, 0xbeff5908) = 0
ioctl(3, DRM_IOCTL_MODE_GETPROPERTY, 0xbeff56c0) = 0
ioctl(3, DRM_IOCTL_MODE_GETPROPERTY, 0xbeff56c0) = 0
ioctl(3, DRM_IOCTL_MODE_GETPLANE, 0xbeff43e8) = 0
ioctl(3, DRM_IOCTL_MODE_GETPLANE, 0xbeff4460) = 0
ioctl(3, DRM_IOCTL_MODE_GETRESOURCES, 0xbeff4260) = 0
ioctl(3, DRM_IOCTL_MODE_GETRESOURCES, 0xbeff42b8) = 0
ioctl(3, DRM_IOCTL_MODE_GETCRTC, 0xbeff41e8) = 0
ioctl(3, DRM_IOCTL_MODE_GETENCODER, 0xbeff3fc0) = 0
ioctl(3, DRM_IOCTL_MODE_GETCONNECTOR, 0xbeff3ae8) = 0
ioctl(3, DRM_IOCTL_MODE_GETCONNECTOR, 0xbeff3bf8) = 0
ioctl(3, DRM_IOCTL_MODE_CREATE_DUMB, 0xbeff57e0) = 0
ioctl(3, DRM_IOCTL_MODE_ADDFB, 0xbeff580c) = 0
ioctl(3, DRM_IOCTL_MODE_CREATE_DUMB, 0xbeff57e0) = 0
ioctl(3, DRM_IOCTL_MODE_ADDFB, 0xbeff580c) = 0
Drawing tick 1
ioctl(3, DRM_IOCTL_MODE_MAP_DUMB, 0xbeff57e0) = 0
ioctl(3, DRM_IOCTL_MODE_DIRTYFB, 0xbeff5968) = -1 ENOSYS (Function not implemented)
ioctl(3, DRM_IOCTL_MODE_PAGE_FLIP, 0xbeff59e0) = -1 EBUSY (Device or resource busy)
ioctl(3, DRM_IOCTL_MODE_SETCRTC, 0xbeff57a8) = -1 ENOENT (No such file or directory)
Error: PlatformError(Some("failed to page flip"), Some(Os { code: 16, kind: ResourceBusy, message: "Device or resource busy" }))
+++ exited with 1 +++
Output of dmesg after running echo 0x1FF > /sys/module/drm/parameters/debug (if it helps, I don't see anything that stands out):
[ 1562.723216] [drm:drm_stub_open]
[ 1562.725739] [drm:drm_open] comm="drm", pid=1596, minor=0
[ 1562.736148] [drm:drm_legacy_setup]
[ 1562.741258] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETRESOURCES
[ 1562.751288] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETRESOURCES
[ 1562.761361] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETCONNECTOR
[ 1562.771022] [drm:drm_mode_object_put.part.0] OBJ ID: 32 (3)
[ 1562.776034] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETCONNECTOR
[ 1562.788027] [drm:drm_mode_object_put.part.0] OBJ ID: 32 (3)
[ 1562.793368] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETRESOURCES
[ 1562.805019] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETRESOURCES
[ 1562.815105] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETCONNECTOR
[ 1562.824827] [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:32:DPI-1]
[ 1562.833157] [drm:ltdc_crtc_mode_valid] clk rate target 30000000, available 30000000
[ 1562.842140] [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:32:DPI-1] probed modes :
[ 1562.851654] [drm:drm_mode_debug_printmodeline] Modeline "800x480": 53 30000 800 1010 1020 1066 480 502 507 530 0x48 0xa
[ 1562.863491] [drm:drm_mode_object_put.part.0] OBJ ID: 32 (3)
[ 1562.870007] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETCONNECTOR
[ 1562.879699] [drm:drm_mode_object_put.part.0] OBJ ID: 32 (3)
[ 1562.886458] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETCRTC
[ 1562.895872] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETPLANERESOURCES
[ 1562.906373] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETPLANERESOURCES
[ 1562.916615] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETPLANE
[ 1562.926311] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETPLANE
[ 1562.935795] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_OBJ_GETPROPERTIES
[ 1562.946094] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_OBJ_GETPROPERTIES
[ 1562.956634] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETPROPERTY
[ 1562.966432] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETPROPERTY
[ 1562.976401] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETPLANE
[ 1562.985868] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETPLANE
[ 1562.995237] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETRESOURCES
[ 1563.005251] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETRESOURCES
[ 1563.015296] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETCRTC
[ 1563.024833] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETENCODER
[ 1563.034890] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETCONNECTOR
[ 1563.046099] [drm:drm_mode_object_put.part.0] OBJ ID: 32 (3)
[ 1563.052678] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_GETCONNECTOR
[ 1563.062548] [drm:drm_mode_object_put.part.0] OBJ ID: 32 (3)
[ 1563.069357] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_CREATE_DUMB
[ 1563.096140] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_ADDFB
[ 1563.103837] stm32-display 5a001000.display-controller: [drm:drm_mode_addfb2] [FB:49]
[ 1563.119119] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_CREATE_DUMB
[ 1563.131434] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_ADDFB
[ 1563.139501] stm32-display 5a001000.display-controller: [drm:drm_mode_addfb2] [FB:50]
[ 1563.156885] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_MAP_DUMB
[ 1563.200312] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_DIRTYFB
[ 1563.208385] [drm:drm_mode_object_put.part.0] OBJ ID: 49 (2)
[ 1563.214221] [drm:drm_ioctl] comm="drm", pid=1596, ret=-38
[ 1563.227757] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_PAGE_FLIP
[ 1563.236096] [drm:drm_ioctl] comm="drm", pid=1596, ret=-16
[ 1563.244643] [drm:drm_ioctl] comm="drm" pid=1596, dev=0xe200, auth=1, DRM_IOCTL_MODE_SETCRTC
[ 1563.254226] [drm:drm_mode_setcrtc] [CRTC:41:crtc-0]
[ 1563.260153] [drm:drm_mode_setcrtc] Unknown FB ID0
[ 1563.264187] [drm:drm_ioctl] comm="drm", pid=1596, ret=-2
[ 1563.272659] [drm:drm_release] open_count = 1
[ 1563.276289] [drm:drm_file_free.part.0] comm="drm", pid=1596, dev=0xe200, open_count=1
[ 1563.288789] [drm:drm_mode_object_put.part.0] OBJ ID: 50 (1)
[ 1563.293750] [drm:drm_mode_object_put.part.0] OBJ ID: 49 (1)
[ 1563.303107] [drm:_drm_lease_revoke] revoke leases for 4560017b 0
[ 1563.310178] [drm:drm_lease_destroy] drm_lease_destroy 0
[ 1563.314713] [drm:drm_master_destroy] drm_lease_destroy done 0
[ 1563.323514] [drm:drm_lastclose]
[ 1563.326033] [drm:drm_lastclose] driver lastclose completed
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the repository's drm example and reproduce the first page flip failure on the reported Linux DRM setup. Compare its behavior with the working legacy_modeset example in Smithay's drm-rs, then trace the page-flip and fallback errors until the example completes its first flip without EBUSY.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- linux, rust
- Domain
- operating-systems
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 30/100