Linux Sound subsystem development
 help / color / mirror / Atom feed
* [BUG] ALSA: usb-audio: drain may fail with multi-port close race
@ 2025-02-17 11:16 John Keeping
  2025-02-17 17:06 ` Takashi Iwai
  0 siblings, 1 reply; 6+ messages in thread
From: John Keeping @ 2025-02-17 11:16 UTC (permalink / raw)
  To: Takashi Iwai
  Cc: John Keeping, Clemens Ladisch, Jaroslav Kysela, linux-sound,
	linux-kernel

I'm seeing a bug where data sometimes fails to send on USB MIDI devices
with multiple ports which seems to be a result of a race around closing
ports introduced by commit 0125de38122f0 ("ALSA: usb-audio: Cancel
pending work at closing a MIDI substream").

The scenario is essentially this program:

	snd_rawmidi_t *port0, *port1;
	snd_rawmidi_open(NULL, &port0, "hw:0,0,0", 0);
	snd_rawmidi_open(NULL, &port1, "hw:0,0,1", 0);

	snd_rawmidi_write(port0, data, len);

	snd_rawmidi_close(port1);
	snd_rawmidi_close(port0);

What happens seems to be the following:

	write(port0)
	`- snd_usbmidi_output_trigger
	   `- queue_work()
        close(port1)
	`- snd_usbmidi_output_close
	   `- cancel_work_sync()	# Work has not yet started here
	close(port0)
	`- snd_rawmidi_drain_output
	   # Times out because nothing is processing outbound data!

The two ports interact like this because they are on the same endpoint,
so should the work only be cancelled when the last endpoint is closed?


Thanks,
John

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-02-18 11:39 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-17 11:16 [BUG] ALSA: usb-audio: drain may fail with multi-port close race John Keeping
2025-02-17 17:06 ` Takashi Iwai
2025-02-17 18:38   ` John Keeping
2025-02-18  8:07     ` Takashi Iwai
2025-02-18 10:56       ` John Keeping
2025-02-18 11:39         ` Takashi Iwai

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox