[alsa-devel] snd-ctxfi oops

Takashi Iwai tiwai at suse.de
Sat Jun 13 10:07:49 CEST 2009


At Sat, 13 Jun 2009 10:05:08 +0400,
The Source wrote:
> 
> 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.

In which situation, exactly?
Could you check whether it happens with use_system_timer=1 module
option, too?


Takashi


More information about the Alsa-devel mailing list