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 _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel