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