[bug report] ALSA: seq: Use no intrruptible mutex_lock
Hello Takashi Iwai,
The patch 04702e8d0092: "ALSA: seq: Use no intrruptible mutex_lock" from Aug 1, 2018, leads to the following static checker warning:
sound/core/seq/seq_clientmgr.c:2194 snd_seq_create_kernel_client() warn: called with lock held. '®ister_mutex'
sound/core/seq/seq_midi.c 294 if (ports > (256 / SNDRV_RAWMIDI_DEVICES)) 295 ports = 256 / SNDRV_RAWMIDI_DEVICES; 296 297 mutex_lock(®ister_mutex); ^^^^^^^^^^^^^^^ Holding lock
298 client = synths[card->number]; 299 if (client == NULL) { 300 newclient = 1; 301 client = kzalloc(sizeof(*client), GFP_KERNEL); 302 if (client == NULL) { 303 mutex_unlock(®ister_mutex); 304 kfree(info); 305 return -ENOMEM; 306 } 307 client->seq_client = 308 snd_seq_create_kernel_client( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Deadlock
309 card, 0, "%s", card->shortname[0] ? 310 (const char *)card->shortname : "External MIDI"); 311 if (client->seq_client < 0) { 312 kfree(client); 313 mutex_unlock(®ister_mutex); 314 kfree(info); 315 return -ENOMEM; 316 } 317 }
regards, dan carpenter
On Mon, 01 Feb 2021 14:13:14 +0100, Dan Carpenter wrote:
Hello Takashi Iwai,
The patch 04702e8d0092: "ALSA: seq: Use no intrruptible mutex_lock" from Aug 1, 2018, leads to the following static checker warning:
sound/core/seq/seq_clientmgr.c:2194 snd_seq_create_kernel_client() warn: called with lock held. '®ister_mutex'
sound/core/seq/seq_midi.c 294 if (ports > (256 / SNDRV_RAWMIDI_DEVICES)) 295 ports = 256 / SNDRV_RAWMIDI_DEVICES; 296 297 mutex_lock(®ister_mutex); ^^^^^^^^^^^^^^^ Holding lock
298 client = synths[card->number]; 299 if (client == NULL) { 300 newclient = 1; 301 client = kzalloc(sizeof(*client), GFP_KERNEL); 302 if (client == NULL) { 303 mutex_unlock(®ister_mutex); 304 kfree(info); 305 return -ENOMEM; 306 } 307 client->seq_client = 308 snd_seq_create_kernel_client( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Deadlock
309 card, 0, "%s", card->shortname[0] ? 310 (const char *)card->shortname : "External MIDI"); 311 if (client->seq_client < 0) { 312 kfree(client); 313 mutex_unlock(®ister_mutex); 314 kfree(info); 315 return -ENOMEM; 316 } 317 }
Again, both register_mutex are different instances, where both are local static variables, hence they can't conflict with each other.
thanks,
Takashi
participants (2)
-
Dan Carpenter
-
Takashi Iwai