Bug 511472

Summary: Sometimes audio notification (Pipewire) freeze whole shell
Product: [Plasma] plasmashell Reporter: Dāvis <davispuh>
Component: NotificationsAssignee: Plasma Bugs List <plasma-bugs-null>
Status: REPORTED ---    
Severity: major CC: kde, kdedev, nate
Priority: NOR    
Version First Reported In: 6.5.0   
Target Milestone: 1.0   
Platform: Arch Linux   
OS: Linux   
Latest Commit: Version Fixed/Implemented In:
Sentry Crash Report:

Description Dāvis 2025-11-01 16:30:16 UTC
SUMMARY

Sometimes audio notification (pipewire) freezes whole shell.
Basically it looks like `plasmashell` gets stuck waiting forever on Pipewire.

STEPS TO REPRODUCE
1.  No idea, it happens rarely

OBSERVED RESULT

Whole plasmashell gets stuck/frozen - "nothing works"

EXPECTED RESULT

Keep responding :)
I think it should just timeout and abort if some time has passed.

SOFTWARE/OS VERSIONS
Linux: Arch Linux
KDE Plasma Version: 6.5.0
KDE Frameworks Version: 6.19.0
Qt Version: 6.10.0
Pipewire: 1.4.9

ADDITIONAL INFORMATION

This is backtrace when it was frozen:
```
#0  __syscall_cancel_arch () at ../sysdeps/unix/sysv/linux/x86_64/syscall_cancel.S:56
#1  0x00007fb6de0931ac in __internal_syscall_cancel (a1=<optimized out>, a2=<optimized out>, a3=<optimized out>, a4=<optimized out>, a5=a5@entry=0, a6=a6@entry=4294967295, nr=202) at cancellation.c:49
#2  0x00007fb6de09381c in __futex_abstimed_wait_common64 (private=0, futex_word=0x55d5f2507590, expected=<optimized out>, op=<optimized out>, abstime=0x0, cancel=true) at futex-internal.c:57
#3  __futex_abstimed_wait_common (futex_word=futex_word@entry=0x55d5f2507590, expected=<optimized out>, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0, cancel=cancel@entry=true) at futex-internal.c:87
#4  0x00007fb6de09387f in __GI___futex_abstimed_wait_cancelable64 (futex_word=futex_word@entry=0x55d5f2507590, expected=<optimized out>, clockid=clockid@entry=0, abstime=abstime@entry=0x0, private=private@entry=0) at futex-internal.c:139
#5  0x00007fb6de095ede in __pthread_cond_wait_common (cond=0x55d5f2507570, mutex=0x55d5f2507548, clockid=0, abstime=0x0) at pthread_cond_wait.c:421
#6  ___pthread_cond_wait (cond=cond@entry=0x55d5f2507570, mutex=mutex@entry=0x55d5f2507548) at pthread_cond_wait.c:453
#7  0x00007fb6701de1fb in pw_thread_loop_wait (loop=0x55d5f2507530) at ../pipewire/src/pipewire/thread-loop.c:428
#8  0x00007fb661b5dc85 in snd_pcm_pipewire_prepare (io=0x55d5f1bf1480) at ../pipewire/pipewire-alsa/alsa-plugins/pcm_pipewire.c:585
#9  0x00007fb640147873 in snd_pcm_ioplug_prepare (pcm=0x55d5f26335f0) at pcm/pcm_ioplug.c:175
#10 0x00007fb6401851d1 in snd_pcm_prepare (pcm=0x55d5f26335f0) at pcm/pcm.c:1249
#11 0x00007fb6401a61f7 in snd_pcm_hw_params (pcm=<optimized out>, params=params@entry=0x7ffe527ac900) at pcm/pcm.c:958
#12 0x00007fb67a365401 in open_alsa (c=c@entry=0x55d5f04f75d0, out=out@entry=0x55d5f6592540) at /usr/src/debug/libcanberra/libcanberra/src/alsa.c:261
#13 0x00007fb67a366111 in alsa_driver_play (c=0x55d5f04f75d0, id=0, proplist=0x55d5f57f23b0, cb=0x0, userdata=<optimized out>) at /usr/src/debug/libcanberra/libcanberra/src/alsa.c:459
#14 0x00007fb6dcf8c308 in driver_play (c=0x55d5f04f75d0, id=0, pl=0x55d5f57f23b0, cb=0x0, userdata=0x0) at /usr/src/debug/libcanberra/libcanberra/src/dso.c:342
#15 ca_context_play_full (c=0x55d5f04f75d0, id=id@entry=0, p=p@entry=0x55d5f57f23b0, cb=cb@entry=0x0, userdata=userdata@entry=0x0) at /usr/src/debug/libcanberra/libcanberra/src/common.c:522
#16 0x00007fb67a36ba66 in multi_driver_play (c=<optimized out>, id=0, proplist=0x55d5f57f23b0, cb=<optimized out>, userdata=<optimized out>) at /usr/src/debug/libcanberra/libcanberra/src/multi.c:273
#17 0x00007fb6dcf8c308 in driver_play (c=0x55d5f02034d0, id=0, pl=0x55d5f57f23b0, cb=0x0, userdata=0x0) at /usr/src/debug/libcanberra/libcanberra/src/dso.c:342
#18 ca_context_play_full (c=0x55d5f02034d0, id=0, p=0x55d5f57f23b0, cb=0x0, userdata=0x0) at /usr/src/debug/libcanberra/libcanberra/src/common.c:522
#19 0x00007fb6707043eb in NotificationManager::Notifications::playSoundHint(QModelIndex const&) const () from /usr/lib/libnotificationmanager.so.1
#20 0x00007fb67070552d in ?? () from /usr/lib/libnotificationmanager.so.1
#21 0x00007fb6707061e7 in NotificationManager::Notifications::qt_metacall(QMetaObject::Call, int, void**) () from /usr/lib/libnotificationmanager.so.1
#22 0x00007fb6dff37a03 in QQmlObjectOrGadget::metacall (this=<optimized out>, type=<optimized out>, index=<optimized out>, argv=<optimized out>) at /usr/src/debug/qt6-declarative/qtdeclarative/src/qml/qml/qqmlobjectorgadget.cpp:14
#23 0x00007fb6dfde8311 in QV4::CallMethod (object=..., index=<optimized out>, returnType=..., argCount=<optimized out>, argTypes=<optimized out>, engine=<optimized out>, callArgs=<optimized out>, callType=<optimized out>) at /usr/include/qt6/QtCore/qvarlengtharray.h:90
#24 QV4::QObjectMethod::callPrecise (object=..., data=..., engine=<optimized out>, callArgs=<optimized out>, callType=<optimized out>) at /usr/src/debug/qt6-declarative/qtdeclarative/src/qml/jsruntime/qv4qobjectwrapper.cpp:2081
#25 0x00007fb6dfdf20dd in operator() (__closure=<optimized out>) at /usr/src/debug/qt6-declarative/qtdeclarative/src/qml/jsruntime/qv4qobjectwrapper.cpp:3113
#26 operator()<QV4::QObjectMethod::callInternal(const QV4::Value*, const QV4::Value*, int) const::<lambda()> > (__closure=<synthetic pointer>, call=...) at /usr/src/debug/qt6-declarative/qtdeclarative/src/qml/jsruntime/qv4qobjectwrapper.cpp:3090
#27 QV4::QObjectMethod::callInternal (this=0x7ffe527ad5e8, thisObject=<optimized out>, argv=0x7fb6b66f6578, argc=1) at /usr/src/debug/qt6-declarative/qtdeclarative/src/qml/jsruntime/qv4qobjectwrapper.cpp:3113
#28 0x00007fb6dfe0f91d in QV4::FunctionObject::call (this=0x7ffe527ad5e8, thisObject=0x7fb6b66f6560, argv=0x7fb6b66f6578, argc=1) at /usr/src/debug/qt6-declarative/qtdeclarative/src/qml/jsruntime/qv4functionobject_p.h:187
#29 QV4::Runtime::CallPropertyLookup::call (engine=0x55d5ea3f4eb0, base=..., index=<optimized out>, argv=0x7fb6b66f6578, argc=1) at /usr/src/debug/qt6-declarative/qtdeclarative/src/qml/jsruntime/qv4runtime.cpp:1562
#30 0x00007fb67abfa70e in ?? ()
```

I didn't think of checking what Pipewire was doing but after killing it made Plasma responsive again.
So it's possible that there's also some Pipewire bug but even if so it still shouldn't break whole Plasma.
Comment 1 Dāvis 2025-11-05 21:18:32 UTC
Happened again, this is how Pipewire looks like

```
Thread 3 (Thread 0x7f627c8d96c0 (LWP 389048) "data-loop.0"):
#0  __syscall_cancel_arch () at ../sysdeps/unix/sysv/linux/x86_64/syscall_cancel.S:56
#1  0x00007f627d2931ac in __internal_syscall_cancel (a1=<optimized out>, a2=a2@entry=140060973173344, a3=<optimized out>, a4=<optimized out>, a5=a5@entry=0, a6=a6@entry=0, nr=232) at cancellation.c:49
#2  0x00007f627d2931f4 in __syscall_cancel (a1=<optimized out>, a2=a2@entry=140060973173344, a3=<optimized out>, a4=<optimized out>, a5=a5@entry=0, a6=a6@entry=0, nr=232) at cancellation.c:75
#3  0x00007f627d31acf5 in epoll_wait (epfd=<optimized out>, events=events@entry=0x7f627c8d8a60, maxevents=<optimized out>, timeout=<optimized out>) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
#4  0x00007f627d62fc2a in impl_pollfd_wait (object=<optimized out>, pfd=<optimized out>, ev=0x7f627c8d8c20, n_ev=<optimized out>, timeout=<optimized out>) at ../pipewire/spa/plugins/support/system.c:138
#5  0x00007f627d61cc7f in spa_system_pollfd_wait (object=<optimized out>, pfd=<optimized out>, ev=0x7f627c8d8c20, n_ev=32, timeout=-1) at ../pipewire/spa/include/spa/support/system.h:154
#6  loop_iterate (object=0x56550306abe8, timeout=-1) at ../pipewire/spa/plugins/support/loop.c:701
#7  0x00007f627d529e01 in do_loop (user_data=0x565503065220) at ../pipewire/src/pipewire/data-loop.c:67
#8  0x00007f627d2969cb in start_thread (arg=<optimized out>) at pthread_create.c:448
#9  0x00007f627d31aa0c in __GI___clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78

Thread 2 (Thread 0x7f627bc906c0 (LWP 389050) "X11 Bell"):
#0  __syscall_cancel_arch () at ../sysdeps/unix/sysv/linux/x86_64/syscall_cancel.S:56
#1  0x00007f627d2931ac in __internal_syscall_cancel (a1=<optimized out>, a2=a2@entry=140060960291440, a3=<optimized out>, a4=<optimized out>, a5=a5@entry=0, a6=a6@entry=0, nr=232) at cancellation.c:49
#2  0x00007f627d2931f4 in __syscall_cancel (a1=<optimized out>, a2=a2@entry=140060960291440, a3=<optimized out>, a4=<optimized out>, a5=a5@entry=0, a6=a6@entry=0, nr=232) at cancellation.c:75
#3  0x00007f627d31acf5 in epoll_wait (epfd=<optimized out>, events=events@entry=0x7f627bc8fa70, maxevents=<optimized out>, timeout=<optimized out>) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
#4  0x00007f627d62fc2a in impl_pollfd_wait (object=<optimized out>, pfd=<optimized out>, ev=0x7f627bc8fc30, n_ev=<optimized out>, timeout=<optimized out>) at ../pipewire/spa/plugins/support/system.c:138
#5  0x00007f627d61cc7f in spa_system_pollfd_wait (object=<optimized out>, pfd=<optimized out>, ev=0x7f627bc8fc30, n_ev=32, timeout=-1) at ../pipewire/spa/include/spa/support/system.h:154
#6  loop_iterate (object=0x56550309fc88, timeout=-1) at ../pipewire/spa/plugins/support/loop.c:701
#7  0x00007f627d588014 in spa_loop_control_iterate_fast (object=<optimized out>, timeout=-1) at ../pipewire/spa/include/spa/support/loop.h:312
#8  pw_loop_iterate (object=<optimized out>, timeout=-1) at ../pipewire/src/pipewire/loop.h:89
#9  do_loop (user_data=0x56550309fa50) at ../pipewire/src/pipewire/thread-loop.c:294
#10 0x00007f627d2969cb in start_thread (arg=<optimized out>) at pthread_create.c:448
#11 0x00007f627d31aa0c in __GI___clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78

Thread 1 (Thread 0x7f627d4d5740 (LWP 389044) "pipewire"):
#0  __syscall_cancel_arch () at ../sysdeps/unix/sysv/linux/x86_64/syscall_cancel.S:56
#1  0x00007f627d2931ac in __internal_syscall_cancel (a1=<optimized out>, a2=a2@entry=140728001615536, a3=<optimized out>, a4=<optimized out>, a5=a5@entry=0, a6=a6@entry=0, nr=232) at cancellation.c:49
#2  0x00007f627d2931f4 in __syscall_cancel (a1=<optimized out>, a2=a2@entry=140728001615536, a3=<optimized out>, a4=<optimized out>, a5=a5@entry=0, a6=a6@entry=0, nr=232) at cancellation.c:75
#3  0x00007f627d31acf5 in epoll_wait (epfd=<optimized out>, events=events@entry=0x7ffdca8bd6b0, maxevents=<optimized out>, timeout=<optimized out>) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30
#4  0x00007f627d62fc2a in impl_pollfd_wait (object=<optimized out>, pfd=<optimized out>, ev=0x7ffdca8bd870, n_ev=<optimized out>, timeout=<optimized out>) at ../pipewire/spa/plugins/support/system.c:138
#5  0x00007f627d61cc7f in spa_system_pollfd_wait (object=<optimized out>, pfd=<optimized out>, ev=0x7ffdca8bd870, n_ev=32, timeout=-1) at ../pipewire/spa/include/spa/support/system.h:154
#6  loop_iterate (object=0x565503062648, timeout=-1) at ../pipewire/spa/plugins/support/loop.c:701
#7  0x00007f627d54de31 in spa_loop_control_iterate_fast (object=<optimized out>, timeout=-1) at ../pipewire/spa/include/spa/support/loop.h:312
#8  pw_loop_iterate (object=<optimized out>, timeout=-1) at ../pipewire/src/pipewire/loop.h:89
#9  pw_main_loop_run (loop=loop@entry=0x5655030624e0) at ../pipewire/src/pipewire/main-loop.c:130
#10 0x00005654f3f8b535 in main (argc=<optimized out>, argv=<optimized out>) at ../pipewire/src/daemon/pipewire.c:130
```

Currently quickest workaround seems to be `killall pipewire`, everything restarts automatically so no issues afterwards.
Comment 2 TraceyC 2025-11-07 16:39:55 UTC
Thanks for the bug report and your diligence in getting these bactraces. Those are helpful. I'll let those more familiar with the audio notification system take a closer look.