[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