https://bugs.kde.org/show_bug.cgi?id=500951

            Bug ID: 500951
           Summary: KDE PowerDevil deadlock causes kwin_wayland to hang
    Classification: Plasma
           Product: plasmashell
           Version: 6.3.2
          Platform: Arch Linux
                OS: Linux
            Status: REPORTED
          Severity: normal
          Priority: NOR
         Component: Power management & brightness
          Assignee: plasma-b...@kde.org
          Reporter: j...@jonawagner.me
  Target Milestone: 1.0

SUMMARY

KDE PowerDevil runs into a deadlock which will cause 25 second kwin_wayland
freeze if something tries to enable screen inhibitors (e.g. VLC or Firefox
duing video playback)

STEPS TO REPRODUCE
1. Get PowerDevil to deadlock (I assume this happens when screens are
reconnected, maybe due to driver issues?). for testing the kwin_wayland hang
you can just suspend the process `pkill -STOP org_kde_powerde` (resume with
`pkill -CONT org_kde_powerde`)
2. Start VLC with a video

OBSERVED RESULT
System hangs for 25 seconds because kwin_wayland waits for the inhibit call to
finish, blocking the main thread


EXPECTED RESULT
PowerDevil does not deadlock, kwin_wayland does freeze

WORKAROUNDS
Restarting PowerDevil (`systemctl --user restart plasma-powerdevil.service`)
fixes the freezing issue (until it deadlocks again). You can also just stop it
so it no longer causes issues (`systemctl --user stop
plasma-powerdevil.service`).

SOFTWARE/OS VERSIONS
Linux/KDE Plasma: Arch Linux
KDE Plasma Version: 6.3.2
KDE Frameworks Version: 6.11.0
Qt Version: 6.8.2

ADDITIONAL INFORMATION

DBus monitor:
method call time=1740911305.944531 sender=:1.129 ->
destination=org.freedesktop.ScreenSaver serial=3 path=/ScreenSaver;
interface=org.freedesktop.ScreenSaver; member=Inhibit
   string "vlc"
   string "Playing some media."
method call time=1740911305.944673 sender=:1.9 ->
destination=org.kde.Solid.PowerManagement.PolicyAgent serial=2091
path=/org/kde/Solid/PowerManagement/PolicyAgent;
interface=org.kde.Solid.PowerManagement.PolicyAgent; member=AddInhibition
   uint32 4
   string "vlc"
   string "Playing some media."
# can't find any replies to these method calls

GDB Backtrace of PowerDevil
```
#0  __syscall_cancel_arch () at
../sysdeps/unix/sysv/linux/x86_64/syscall_cancel.S:56
#1  0x00007602e7a9fe33 in __internal_syscall_cancel (a1=a1@entry=0,
a2=a2@entry=0, a3=a3@entry=140733869441776, a4=a4@entry=0, a5=a5@entry=0,
a6=a6@entry=0, nr=230) at cancellation.c:49
#2  0x00007602e7af0a82 in __GI___clock_nanosleep (clock_id=<optimized out>,
clock_id@entry=0, flags=flags@entry=0, req=req@entry=0x7fff284bc2f0,
rem=rem@entry=0x0) at ../sysdeps/unix/sysv/linux/clock_nanosleep.c:48
#3  0x00007602e7afcc27 in __GI___nanosleep (req=req@entry=0x7fff284bc2f0,
rem=rem@entry=0x0) at ../sysdeps/unix/sysv/linux/nanosleep.c:25
#4  0x00007602e7b2761a in usleep (useconds=useconds@entry=100000) at
../sysdeps/posix/usleep.c:31
#5  0x00007602e6d2e7f0 in sleep_millis (milliseconds=100) at base/sleep.c:89
#6  0x00007602e6d282a5 in lock_display (dlr=0x5b97091df140,
flags=flags@entry=DDISP_NONE) at base/display_lock.c:239
#7  0x00007602e6d28a14 in lock_display_by_dpath (dpath=..., flags=DDISP_NONE)
at base/display_lock.c:393
#8  0x00007602e6d0b86c in i2c_open_bus (busno=4, callopts=callopts@entry=4
'\004', fd_loc=fd_loc@entry=0x7fff284bc4c4) at i2c/i2c_bus_core.c:273
#9  0x00007602e6d12e73 in i2c_check_bus (businfo=businfo@entry=0x5b9709281d90)
at i2c/i2c_bus_core.c:1457
#10 0x00007602e6d13b99 in i2c_non_async_scan (i2c_buses=0x5b970919a0a0) at
i2c/i2c_bus_core.c:1791
#11 0x00007602e6d14232 in i2c_detect_buses0 () at i2c/i2c_bus_core.c:1949
#12 0x00007602e6d143d5 in i2c_detect_buses () at i2c/i2c_bus_core.c:2014
#13 0x00007602e6cebea1 in dw_redetect_displays () at dw/dw_main.c:383
#14 0x00007602e6d48ed0 in ddca_redetect_displays () at
libmain/api_displays.c:445
#15 0x00007602e889af25 in DDCutilPrivateSingleton::redetect
(this=0x7602e88d0460 <DDCutilPrivateSingleton::instance()::singleton>) at
/usr/src/debug/powerdevil/powerdevil-6.3.2/daemon/controllers/ddcutildetector.cpp:207
#16 0x00007602e75a2f4a in QObject::event (this=0x7602e88d0460
<DDCutilPrivateSingleton::instance()::singleton>, e=0x7602ac000f90) at
/usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qobject.cpp:1418
#17 0x00007602e7555b00 in QCoreApplication::notifyInternal2
(receiver=0x7602e88d0460 <DDCutilPrivateSingleton::instance()::singleton>,
event=event@entry=0x7602ac000f90) at
/usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1172
#18 0x00007602e7555edc in QCoreApplication::sendEvent (receiver=<optimized
out>, event=0x7602ac000f90) at
/usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1612
#19 QCoreApplicationPrivate::sendPostedEvents (receiver=0x0, event_type=0,
data=0x5b9709140e50) at
/usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1946
#20 0x00007602e77c859c in QCoreApplication::sendPostedEvents (receiver=0x0,
event_type=0) at
/usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1800
#21 postEventSourceDispatch (s=0x5b97091456b0) at
/usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:246
#22 0x00007602e683c919 in g_main_dispatch (context=0x7602d8000f00) at
../glib/glib/gmain.c:3357
#23 0x00007602e689f5d7 in g_main_context_dispatch_unlocked
(context=0x7602d8000f00) at ../glib/glib/gmain.c:4208
#24 g_main_context_iterate_unlocked.isra.0
(context=context@entry=0x7602d8000f00, block=block@entry=1,
dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/glib/gmain.c:4273
#25 0x00007602e683be15 in g_main_context_iteration (context=0x7602d8000f00,
may_block=1) at ../glib/glib/gmain.c:4338
#26 0x00007602e77c575d in QEventDispatcherGlib::processEvents
(this=0x5b9709145610, flags=...) at
/usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:399
#27 0x00007602e75606a6 in QEventLoop::processEvents (this=0x7fff284bcc40,
flags=...) at
/usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qeventloop.cpp:103
#28 QEventLoop::exec (this=0x7fff284bcc40, flags=...) at
/usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qeventloop.cpp:185
#29 0x00007602e75591d6 in QCoreApplication::exec () at
/usr/src/debug/qt6-base/qtbase/src/corelib/global/qflags.h:74
#30 0x00005b96cbdeb727 in main (argc=<optimized out>, argv=<optimized out>) at
/usr/src/debug/powerdevil/powerdevil-6.3.2/daemon/powerdevilapp.cpp:134
```

PowerDevil logs:
```
Mar 02 10:30:17 r9950 org_kde_powerdevil[1989]: [  1989] Error queiscing
libdducitl API. 1 active API calls outstanding.
Mar 02 10:30:17 r9950 org_kde_powerdevil[1989]: org.kde.powerdevil:
[DDCutilDisplay]: ddca_close_display -3032
Mar 02 10:30:17 r9950 org_kde_powerdevil[1989]: library quiesced,
ddca_close_display temporarily unavailable
Mar 02 10:30:17 r9950 org_kde_powerdevil[1989]: org.kde.powerdevil:
[DDCutilDisplay]: ddca_open_display2 -3032
Mar 02 10:30:17 r9950 org_kde_powerdevil[1989]: [  1989] Display redetection
starting.
Mar 02 10:30:17 r9950 org_kde_powerdevil[1989]: library quiesced,
ddca_open_display3 temporarily unavailable
Mar 02 10:30:17 r9950 org_kde_powerdevil[1989]: [ 20885] recheck thread
terminating because watch thread terminated
Mar 02 10:30:17 r9950 org_kde_powerdevil[1989]: [  1989] Watch thread
terminated.
Mar 02 10:30:17 r9950 org_kde_powerdevil[1989]: [  1989] Attempting to unlock
display lock owned by different thread
Mar 02 10:30:17 r9950 org_kde_powerdevil[1989]: [  1989] Unexpected error
DDCRC_LOCKED from unlock_display_by_dpath(Display_Path[/dev/i2c-4])
```

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to