summaryrefslogtreecommitdiff
path: root/scripts/Makefile.thinlto
diff options
context:
space:
mode:
authorCen Zhang <zzzccc427@gmail.com>2026-10-25 00:49:50 +0800
committerTakashi Iwai <tiwai@suse.de>2026-10-26 09:00:55 +0100
commit02b1d5127f37683448ef35798b3a6310d1d38761 (patch)
tree3e4ae89bcf881bc8466135e74ca416ea9b701212 /scripts/Makefile.thinlto
parenta71cef6f641152c7c7bbc17d86f33a3b45cd10a9 (diff)
downloadlinux-02b1d5127f37683448ef35798b3a6310d1d38761.tar.gz
linux-02b1d5127f37683448ef35798b3a6310d1d38761.zip
ALSA: opl3: Clear voice channels before freeing their sets
The card-owned OPL3 voice array survives sequencer-driver unbind, but its chan pointers refer to the native or OSS port's channel set. Neither port's private_free callback clears those pointers before freeing its set. A direct NOTEON in the initial SYNTH mode can leave a voice allocated without a subscription. Even with fix_dur zero and no timer, unbind and rebind followed by direct PITCHBEND can read the old channel: Sequencer driver unbind/rebind Direct PITCHBEND ----------------------------- ---------------- snd_seq_delete_kernel_client() port_free() free channel set snd_opl3_seq_probe() allocate new channel set snd_opl3_pitch_ctrl() snd_opl3_update_pitch() old voice->chan is non-NULL snd_opl3_calc_pitch() read freed channel Clearing only note_off_check or the voice state does not protect this path: snd_opl3_update_pitch() tests the channel pointer itself. Key off active voices before clearing their channel pointers, delayed- note flags and state under voice_lock. Direct events need no subscription, so port deletion need not call synth_unuse() to reset the hardware. Merely marking a keyed-on voice off would retain hardware KEYON and cause a later note to miss the key-on transition. Reuse snd_opl3_kill_voice() before either channel set is freed. Visit higher-numbered voices first. In initial SYNTH mode, direct NOTEON events map channels to fixed voices without reserving them through the allocator: a 4-op primary can coexist with an independently keyed-on 2-op partner at voice + 3. Killing the primary clears that partner's software state without keying off its register. Ascending cleanup would then skip the partner. Retiring the partner first guarantees its key-off before the primary can change its state, on both register banks. The lock also excludes a timer or pitch update already using a voice. Both private_free callbacks must do the cleanup because an in-flight OSS event can refill the shared voice array after the native port has been drained and freed. That event can only reference its own still-live set; the OSS callback's final cleanup retires that reference before freeing its set as well. Assisted-by: LLM Signed-off-by: Cen Zhang <zzzccc427@gmail.com> Signed-off-by: Takashi Iwai <tiwai@suse.de> Link: https://patch.msgid.link/pm-pmb-4552c4e605507d8d9b16-v9-70247b8436e10e26d324-2@gmail.com
Diffstat (limited to 'scripts/Makefile.thinlto')
0 files changed, 0 insertions, 0 deletions