[alsa-devel] snd-ctxfi oops

The Source thesourcehim at gmail.com
Sat Jun 13 08:05:08 CEST 2009


On 12.06.2009 22:22, The Source wrote:
> On 12.06.2009 11:20, Takashi Iwai wrote:
>> At Fri, 12 Jun 2009 07:52:22 +0400,
>> The Source wrote:
>>> Hello. I use snd-ctxfi from 8 June snapshot. I hadn't oopses since I
>>> installed this driver but recently I got one again:
>>>
>>> Kernel failure message 1:
>>> BUG: sleeping function called from invalid context at mm/slub.c:1599
>> Could you try the patch below?
>>
>>
>> thanks,
>>
>> Takashi
>>
>> ---
>> diff --git a/sound/pci/ctxfi/ctatc.c b/sound/pci/ctxfi/ctatc.c
>> index 80fb2ba..b0adc80 100644
>> --- a/sound/pci/ctxfi/ctatc.c
>> +++ b/sound/pci/ctxfi/ctatc.c
>> @@ -259,7 +259,6 @@ static int atc_pcm_playback_prepare(struct ct_atc 
>> *atc, struct ct_atc_pcm *apcm)
>>       int n_amixer = apcm->substream->runtime->channels, i = 0;
>>       int device = apcm->substream->pcm->device;
>>       unsigned int pitch;
>> -    unsigned long flags;
>>
>>       if (NULL != apcm->src) {
>>           /* Prepared pcm playback */
>> @@ -311,10 +310,10 @@ static int atc_pcm_playback_prepare(struct 
>> ct_atc *atc, struct ct_atc_pcm *apcm)
>>       src = apcm->src;
>>       for (i = 0; i<  n_amixer; i++) {
>>           amixer = apcm->amixers[i];
>> -        spin_lock_irqsave(&atc->atc_lock, flags);
>> +        mutex_lock(&atc->atc_mutex);
>>           amixer->ops->setup(amixer,&src->rsc,
>>                       INIT_VOL, atc->pcm[i+device*2]);
>> -        spin_unlock_irqrestore(&atc->atc_lock, flags);
>> +        mutex_unlock(&atc->atc_mutex);
>>           src = src->ops->next_interleave(src);
>>           if (NULL == src)
>>               src = apcm->src;
>> @@ -865,7 +864,6 @@ static int
>>   spdif_passthru_playback_setup(struct ct_atc *atc, struct ct_atc_pcm 
>> *apcm)
>>   {
>>       struct dao *dao = container_of(atc->daios[SPDIFOO], struct dao, 
>> daio);
>> -    unsigned long flags;
>>       unsigned int rate = apcm->substream->runtime->rate;
>>       unsigned int status;
>>       int err;
>> @@ -885,7 +883,7 @@ spdif_passthru_playback_setup(struct ct_atc *atc, 
>> struct ct_atc_pcm *apcm)
>>           return -ENOENT;
>>       }
>>
>> -    spin_lock_irqsave(&atc->atc_lock, flags);
>> +    mutex_lock(&atc->atc_mutex);
>>       dao->ops->get_spos(dao,&status);
>>       if (((status>>  24)&  IEC958_AES3_CON_FS) != iec958_con_fs) {
>>           status&= ((~IEC958_AES3_CON_FS)<<  24);
>> @@ -895,7 +893,7 @@ spdif_passthru_playback_setup(struct ct_atc *atc, 
>> struct ct_atc_pcm *apcm)
>>       }
>>       if ((rate != atc->pll_rate)&&  (32000 != rate))
>>           err = atc_pll_init(atc, rate);
>> -    spin_unlock_irqrestore(&atc->atc_lock, flags);
>> +    mutex_unlock(&atc->atc_mutex);
>>
>>       return err;
>>   }
>> @@ -908,7 +906,6 @@ spdif_passthru_playback_prepare(struct ct_atc 
>> *atc, struct ct_atc_pcm *apcm)
>>       struct dao *dao;
>>       int err;
>>       int i;
>> -    unsigned long flags;
>>
>>       if (NULL != apcm->src)
>>           return 0;
>> @@ -934,13 +931,13 @@ spdif_passthru_playback_prepare(struct ct_atc 
>> *atc, struct ct_atc_pcm *apcm)
>>               src = apcm->src;
>>       }
>>       /* Connect to SPDIFOO */
>> -    spin_lock_irqsave(&atc->atc_lock, flags);
>> +    mutex_lock(&atc->atc_mutex);
>>       dao = container_of(atc->daios[SPDIFOO], struct dao, daio);
>>       amixer = apcm->amixers[0];
>>       dao->ops->set_left_input(dao,&amixer->rsc);
>>       amixer = apcm->amixers[1];
>>       dao->ops->set_right_input(dao,&amixer->rsc);
>> -    spin_unlock_irqrestore(&atc->atc_lock, flags);
>> +    mutex_unlock(&atc->atc_mutex);
>>
>>       ct_timer_prepare(apcm->timer);
>>
>> @@ -1088,7 +1085,6 @@ static int atc_spdif_out_set_status(struct 
>> ct_atc *atc, unsigned int status)
>>
>>   static int atc_spdif_out_passthru(struct ct_atc *atc, unsigned char 
>> state)
>>   {
>> -    unsigned long flags;
>>       struct dao_desc da_dsc = {0};
>>       struct dao *dao;
>>       int err;
>> @@ -1096,7 +1092,7 @@ static int atc_spdif_out_passthru(struct ct_atc 
>> *atc, unsigned char state)
>>       struct rsc *rscs[2] = {NULL};
>>       unsigned int spos = 0;
>>
>> -    spin_lock_irqsave(&atc->atc_lock, flags);
>> +    mutex_lock(&atc->atc_mutex);
>>       dao = container_of(atc->daios[SPDIFOO], struct dao, daio);
>>       da_dsc.msr = state ? 1 : atc->msr;
>>       da_dsc.passthru = state ? 1 : 0;
>> @@ -1114,7 +1110,7 @@ static int atc_spdif_out_passthru(struct ct_atc 
>> *atc, unsigned char state)
>>       }
>>       dao->ops->set_spos(dao, spos);
>>       dao->ops->commit_write(dao);
>> -    spin_unlock_irqrestore(&atc->atc_lock, flags);
>> +    mutex_unlock(&atc->atc_mutex);
>>
>>       return err;
>>   }
>> @@ -1572,7 +1568,7 @@ int __devinit ct_atc_create(struct snd_card 
>> *card, struct pci_dev *pci,
>>       atc->msr = msr;
>>       atc->chip_type = chip_type;
>>
>> -    spin_lock_init(&atc->atc_lock);
>> +    mutex_init(&atc->atc_mutex);
>>
>>       /* Find card model */
>>       err = atc_identify_card(atc);
>> diff --git a/sound/pci/ctxfi/ctatc.h b/sound/pci/ctxfi/ctatc.h
>> index a033472..9fe620e 100644
>> --- a/sound/pci/ctxfi/ctatc.h
>> +++ b/sound/pci/ctxfi/ctatc.h
>> @@ -19,7 +19,7 @@
>>   #define CTATC_H
>>
>>   #include<linux/types.h>
>> -#include<linux/spinlock_types.h>
>> +#include<linux/mutex.h>
>>   #include<linux/pci.h>
>>   #include<linux/timer.h>
>>   #include<sound/core.h>
>> @@ -90,7 +90,7 @@ struct ct_atc {
>>       void (*unmap_audio_buffer)(struct ct_atc *atc, struct 
>> ct_atc_pcm *apcm);
>>       unsigned long (*get_ptp_phys)(struct ct_atc *atc, int index);
>>
>> -    spinlock_t atc_lock;
>> +    struct mutex atc_mutex;
>>
>>       int (*pcm_playback_prepare)(struct ct_atc *atc,
>>                       struct ct_atc_pcm *apcm);
>>
> No oopses with this patch so far, thank you.
Tested the patch more. Really no oopses. Instead of them I get rare 
system lockups.


More information about the Alsa-devel mailing list