[alsa-devel] Strange code in
Dear Takashi:
Hans de Goede (on cc:) hits a problem when snd-usb-audio breaks with: "USB device is in the shutdown state, cannot create a card instance".
This is how the place looks:
chip = NULL; for (i = 0; i < SNDRV_CARDS; i++) { if (usb_chip[i] && usb_chip[i]->dev == dev) { if (usb_chip[i]->shutdown) { snd_printk(KERN_ERR "USB device is in the shutdown state, cannot create a card instance\n"); goto __error; } chip = usb_chip[i]; break; } }
The code looks broken to me, because dev at this time is a new device structure, freshly allocated. You cannot compare it with an old instance, and I don't know why you would want to.
Unfortunately (for fortunately), I have zero clue about the way ALSA works, specifically rules for snd_device_ops.dev_free, so I am asking you to look at this problem.
Yours, -- Pete
At Fri, 20 Apr 2007 15:26:38 -0700, Pete Zaitcev wrote:
Dear Takashi:
Hans de Goede (on cc:) hits a problem when snd-usb-audio breaks with: "USB device is in the shutdown state, cannot create a card instance".
This is how the place looks:
chip = NULL; for (i = 0; i < SNDRV_CARDS; i++) { if (usb_chip[i] && usb_chip[i]->dev == dev) { if (usb_chip[i]->shutdown) { snd_printk(KERN_ERR "USB device is in the shutdown state, cannot create a card instance\n"); goto __error; } chip = usb_chip[i]; break; } }
The code looks broken to me, because dev at this time is a new device structure, freshly allocated. You cannot compare it with an old instance, and I don't know why you would want to.
This function was implemented in that way because some devices have multiple audio control interfaces per device, and it results in the multiple calls of probe function for each interface.
Unfortunately (for fortunately), I have zero clue about the way ALSA works, specifically rules for snd_device_ops.dev_free, so I am asking you to look at this problem.
Hard to guess unless knowing what is exactly happening, but most likely a race at disconnection. Yes, potentially the check of usb_device there is a problem indeed. The (untested) patch below might fix.
Takashi
diff -r aed6a15c9398 sound/usb/usbaudio.c --- a/sound/usb/usbaudio.c Mon Apr 23 11:54:41 2007 +0200 +++ b/sound/usb/usbaudio.c Mon Apr 23 12:09:12 2007 +0200 @@ -3611,6 +3611,7 @@ static void snd_usb_audio_disconnect(str list_for_each(p, &chip->mixer_list) { snd_usb_mixer_disconnect(p); } + chip->dev = NULL; mutex_unlock(®ister_mutex); snd_card_free_when_closed(card); } else {
participants (2)
-
Pete Zaitcev
-
Takashi Iwai