* General protection fault when unloading snd_hda_intel on 2.6.30-rc1+
@ 2009-04-11 19:36 Carlos R. Mafra
2009-04-11 20:20 ` Arjan van de Ven
2009-04-14 14:27 ` General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ Takashi Iwai
0 siblings, 2 replies; 9+ messages in thread
From: Carlos R. Mafra @ 2009-04-11 19:36 UTC (permalink / raw)
To: linux-kernel; +Cc: tiwai, alsa-devel
If I try on my Vaio VGN-FZ240E, using the latest kernel 2.6.30-rc1-00191-gd848223
modprobe -r snd_hda_intel
I get the following trace (copied from dmesg):
general protection fault: 0000 [#1] SMP
last sysfs file: /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
CPU 1
Modules linked in: nvram uvcvideo videodev v4l1_compat v4l2_compat_ioctl32 snd_hda_codec_idt
usbhid snd_hda_intel(-) snd_hda_codec snd_hwdep snd_pcm sr_mod sky2 i2c_i801 iwlagn snd_timer
sg snd_page_alloc evdev ata_piix ahci libata sd_mod scsi_mod uhci_hcd ohci_hcd ehci_hcd usbcore [last unloaded: scsi_wait_scan]
Pid: 9063, comm: modprobe Not tainted 2.6.30-rc1-00191-gd848223 #48 VGN-FZ240E
RIP: 0010:[<ffffffff8044bf90>] [<ffffffff8044bf90>] input_event+0x40/0xa0
RSP: 0018:ffff88006f283a78 EFLAGS: 00010293
RAX: 0000000000000008 RBX: 0000000000000003 RCX: 0000000000000000
RDX: 0000000000000007 RSI: 0000000000000005 RDI: 697665646632785c
RBP: ffff88006f283aa8 R08: 0000000004d6f76c R09: 0000000000000001
R10: 0000000000000000 R11: 0000000000000001 R12: ffffffff805bb97c
R13: 0000000000000005 R14: 697665646632785c R15: 0000000000000000
FS: 00007fc6c1e1c6f0(0000) GS:ffff880001028000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: 000000000071bf40 CR3: 000000007e2d4000 CR4: 00000000000006e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process modprobe (pid: 9063, threadinfo ffff88006f282000, task ffff88006f206840)
Stack:
ffff88006f283aa8 0000000000000003 ffffffff805bb97c ffff88007e811cc0
0000000000000001 0000000000000000 ffff88006f283ae8 ffffffff80475612
ffff88007f241ae0 0000000000000002 ffff88007d5eb010 0000000000000000
Call Trace:
[<ffffffff80475612>] snd_jack_report+0x92/0xa0
[<ffffffffa0160047>] stac92xx_unsol_event+0x2e7/0x5e0 [snd_hda_codec_idt]
[<ffffffffa015f528>] stac_issue_unsol_event+0x58/0x70 [snd_hda_codec_idt]
[<ffffffffa0160796>] stac92xx_init+0x186/0x660 [snd_hda_codec_idt]
[<ffffffffa0160c90>] stac92xx_resume+0x20/0x60 [snd_hda_codec_idt]
[<ffffffffa013c973>] hda_call_codec_resume+0x53/0x90 [snd_hda_codec]
[<ffffffffa013ca50>] snd_hda_power_up+0x40/0x70 [snd_hda_codec]
[<ffffffffa013c2b5>] snd_hda_codec_write+0x45/0xa0 [snd_hda_codec]
[<ffffffffa013c37a>] restore_pincfgs+0x6a/0xa0 [snd_hda_codec]
[<ffffffffa013ed75>] snd_hda_codec_free+0x35/0x120 [snd_hda_codec]
[<ffffffffa01403f8>] snd_hda_bus_free+0x68/0xb0 [snd_hda_codec]
[<ffffffffa01405e4>] snd_hda_bus_dev_free+0x14/0x20 [snd_hda_codec]
[<ffffffff80473e61>] snd_device_free+0x71/0xd0
[<ffffffff80473f24>] snd_device_free_all+0x64/0x70
[<ffffffff8046e16a>] snd_card_do_free+0x3a/0xd0
[<ffffffff8046ee39>] snd_card_free+0xa9/0xd0
[<ffffffffa015031e>] azx_remove+0x18/0x2a [snd_hda_intel]
[<ffffffff8036506f>] pci_device_remove+0x2f/0x60
[<ffffffff8040ec8c>] __device_release_driver+0x6c/0xb0
[<ffffffff8040ed78>] driver_detach+0xa8/0xb0
[<ffffffff8040de48>] bus_remove_driver+0x98/0xd0
[<ffffffff8040f357>] driver_unregister+0x47/0x60
[<ffffffff8036530c>] pci_unregister_driver+0x4c/0xc0
[<ffffffffa0150304>] alsa_card_azx_exit+0x10/0x12 [snd_hda_intel]
[<ffffffff8026787b>] sys_delete_module+0x18b/0x240
[<ffffffff80257be9>] ? up_write+0x9/0x10
[<ffffffff8020be2b>] system_call_fastpath+0x16/0x1b
Code: 89 5d d8 4c 89 65 e0 49 89 fe 41 89 f5 41 89 cf 83 fe 1f 76 16 48 8b 5d d8 4c 8b 65
e0 4c 8b 6d e8 4c 8b 75 f0 4c 8b 7d f8 c9 c3 <0f> a3 77 20 19 c0 85 c0 74 e0 48 8d 9f f8 06 00 00 89 55 d0 48
RIP [<ffffffff8044bf90>] input_event+0x40/0xa0
RSP <ffff88006f283a78>
---[ end trace 7fa0517f56c40085 ]---
After that, 'cat /proc/modules' contains this line:
snd_hda_intel 28648 0 - Unloading 0xffffffffa014e000
and the HDA driver never finishes that advertised "Unloading".
It also stops working,
[mafra@Pilar:linux-2.6]$ alsamixer
alsamixer: function snd_ctl_open failed for default: No such file or directory
The complete dmesg is available at
http://www.aei.mpg.de/~crmafra/dmesg_hda_intel.txt
and from lspci -vvnn I see this
00:1b.0 Audio device [0403]: Intel Corporation 82801H (ICH8 Family) HD Audio Controller [8086:284b] (rev 03)
Subsystem: Sony Corporation Vaio VGN-FZ260E [104d:9005]
Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 22
Region 0: Memory at fc400000 (64-bit, non-prefetchable) [size=16K]
Capabilities: [50] Power Management version 2
Flags: PMEClk- DSI- D1- D2- AuxCurrent=55mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
Status: D0 PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [60] Message Signalled Interrupts: Mask- 64bit+ Queue=0/0 Enable-
Address: 0000000000000000 Data: 0000
Capabilities: [70] Express (v1) Root Complex Integrated Endpoint, MSI 00
DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
ExtTag- RBE- FLReset-
DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop+
MaxPayload 128 bytes, MaxReadReq 128 bytes
DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ TransPend-
LnkCap: Port #0, Speed unknown, Width x0, ASPM unknown, Latency L0 <64ns, L1 <1us
ClockPM- Suprise- LLActRep- BwNot-
LnkCtl: ASPM Disabled; Disabled- Retrain- CommClk-
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed unknown, Width x0, TrErr- Train- SlotClk- DLActive- BWMgmt- ABWMgmt-
Capabilities: [100] Virtual Channel <?>
Capabilities: [130] Root Complex Link <?>
Kernel modules: snd-hda-intel
When the audio is working alsamixer says it is using Sigmatel STAC9872AK.
Anything else I can do to help?
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ 2009-04-11 19:36 General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ Carlos R. Mafra @ 2009-04-11 20:20 ` Arjan van de Ven 2009-04-11 21:03 ` Carlos R. Mafra 2009-04-14 14:27 ` General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ Takashi Iwai 1 sibling, 1 reply; 9+ messages in thread From: Arjan van de Ven @ 2009-04-11 20:20 UTC (permalink / raw) To: Carlos R. Mafra; +Cc: linux-kernel, tiwai, alsa-devel On Sat, 11 Apr 2009 21:36:30 +0200 "Carlos R. Mafra" <crmafra2@gmail.com> wrote: > general protection fault: Hi, if you happen to have CONFIG_DEBUG_INFO enabled, then you can run the oops through scripts/markup_oops.pl to get the source code of the exact line that is oopsing.. makes diagnosing it even easier! -- Arjan van de Ven Intel Open Source Technology Centre For development, discussion and tips for power savings, visit http://www.lesswatts.org ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ 2009-04-11 20:20 ` Arjan van de Ven @ 2009-04-11 21:03 ` Carlos R. Mafra 2009-04-11 21:39 ` Arjan van de Ven 0 siblings, 1 reply; 9+ messages in thread From: Carlos R. Mafra @ 2009-04-11 21:03 UTC (permalink / raw) To: Arjan van de Ven; +Cc: linux-kernel, tiwai, alsa-devel On Sat 11.Apr'09 at 13:20:33 -0700, Arjan van de Ven wrote: > > if you happen to have CONFIG_DEBUG_INFO enabled, then you can run the > oops through scripts/markup_oops.pl to get the source code of the exact > line that is oopsing.. makes diagnosing it even easier! I did not have CONFIG_DEBUG_INFO enabled back then, but now I have. The script gives me this output: No vmlinux specified, assuming /lib/modules/2.6.30-rc1-00191-gd848223/build/vmlinux add_input_randomness(type, code, value); input_handle_event(dev, type, code, value); spin_unlock_irqrestore(&dev->event_lock, flags); } } ffffffff8044bf7a: 48 8b 5d d8 mov -0x28(%rbp),%rbx | %ebx => 3 ffffffff8044bf7e: 4c 8b 65 e0 mov -0x20(%rbp),%r12 | %r12 => ffffffff805bb97c ffffffff8044bf82: 4c 8b 6d e8 mov -0x18(%rbp),%r13 | %r13 => 5 ffffffff8044bf86: 4c 8b 75 f0 mov -0x10(%rbp),%r14 | %r14 => 697665646632785c ffffffff8044bf8a: 4c 8b 7d f8 mov -0x8(%rbp),%r15 | %r15 => 0 ffffffff8044bf8e: c9 leaveq ffffffff8044bf8f: c3 retq static inline int variable_test_bit(int nr, volatile const unsigned long *addr) { int oldbit; asm volatile("bt %2,%1\n\t" *ffffffff8044bf90: 0f a3 77 20 bt %esi,0x20(%rdi) | %edi = 697665646632785c %esi = 5 <--- faulting instruction ffffffff8044bf94: 19 c0 sbb %eax,%eax static struct input_handler *input_table[8]; static inline int is_event_supported(unsigned int code, unsigned long *bm, unsigned int max) { return code <= max && test_bit(code, bm); ffffffff8044bf96: 85 c0 test %eax,%eax ffffffff8044bf98: 74 e0 je ffffffff8044bf7a <input_event+0x2a> { unsigned long flags; if (is_event_supported(type, dev->evbit, EV_MAX)) { ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ 2009-04-11 21:03 ` Carlos R. Mafra @ 2009-04-11 21:39 ` Arjan van de Ven 2009-04-12 0:33 ` Michal Jaegermann 0 siblings, 1 reply; 9+ messages in thread From: Arjan van de Ven @ 2009-04-11 21:39 UTC (permalink / raw) To: Carlos R. Mafra; +Cc: linux-kernel, tiwai, alsa-devel On Sat, 11 Apr 2009 23:03:36 +0200 "Carlos R. Mafra" <crmafra2@gmail.com> wrote: > From: "Carlos R. Mafra" <crmafra2@gmail.com> > To: Arjan van de Ven <arjan@infradead.org> > Cc: linux-kernel@vger.kernel.org, tiwai@suse.de, > alsa-devel@vger.kernel.org Subject: Re: General protection fault when > unloading snd_hda_intel on 2.6.30-rc1+ Date: Sat, 11 Apr 2009 > 23:03:36 +0200 User-Agent: Mutt/1.5.18 (2008-05-17) > > On Sat 11.Apr'09 at 13:20:33 -0700, Arjan van de Ven wrote: > [...] asm volatile("bt %2,%1\n\t" *ffffffff8044bf90: 0f a3 77 20 bt %esi,0x20(%rdi) | %edi = 697665646632785c %esi = 5 <--- faulting instruction ffffffff8044bf94: 19 c0 sbb %eax,%eax static struct input_handler *input_table[8]; static inline int is_event_supported(unsigned int code, unsigned long *bm, unsigned int max) { return code <= max && test_bit(code, bm); ffffffff8044bf96: 85 c0 test %eax,%eax ffffffff8044bf98: 74 e0 je ffffffff8044bf7a <input_event+0x2a> { unsigned long flags; if (is_event_supported(type, dev->evbit, EV_MAX)) { so... "dev" is pointing evbit at... 697665646632785 which looks like grabage. -- Arjan van de Ven Intel Open Source Technology Centre For development, discussion and tips for power savings, visit http://www.lesswatts.org ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ 2009-04-11 21:39 ` Arjan van de Ven @ 2009-04-12 0:33 ` Michal Jaegermann 2009-04-12 1:58 ` General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ (bisected) Carlos R. Mafra 0 siblings, 1 reply; 9+ messages in thread From: Michal Jaegermann @ 2009-04-12 0:33 UTC (permalink / raw) To: Arjan van de Ven; +Cc: Carlos R. Mafra, linux-kernel, tiwai, alsa-devel On Sat, Apr 11, 2009 at 02:39:50PM -0700, Arjan van de Ven wrote: > > so... "dev" is pointing evbit at... 697665646632785 which looks like grabage. FWIW 697665646632785c decodes in ASCII as "\x2fdevi". M. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ (bisected) 2009-04-12 0:33 ` Michal Jaegermann @ 2009-04-12 1:58 ` Carlos R. Mafra 0 siblings, 0 replies; 9+ messages in thread From: Carlos R. Mafra @ 2009-04-12 1:58 UTC (permalink / raw) To: tiwai; +Cc: Arjan van de Ven, linux-kernel, alsa-devel, Michal Jaegermann On Sat 11.Apr'09 at 18:33:20 -0600, Michal Jaegermann wrote: > On Sat, Apr 11, 2009 at 02:39:50PM -0700, Arjan van de Ven wrote: > > > > so... "dev" is pointing evbit at... 697665646632785 which looks like grabage. > > FWIW 697665646632785c decodes in ASCII as "\x2fdevi". So I painfully (exchanged 'good' for 'bad' in the middle and had to restart all over) bisected this down to commit 3be141494a080a9189b51fa78154c975ad8d9806 Author: Takashi Iwai <tiwai@suse.de> Date: Fri Feb 20 14:11:16 2009 +0100 ALSA: hda - Add generic pincfg initialization Added the generic pincfg cache and save/restore functions. Also introduced the pin-overriding via hwdep sysfs. It doesn't revert cleanly from the latest kernel, so I could not double check it. OBS: All tests were done with the headphone plugged in. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ 2009-04-11 19:36 General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ Carlos R. Mafra 2009-04-11 20:20 ` Arjan van de Ven @ 2009-04-14 14:27 ` Takashi Iwai 2009-04-14 16:21 ` Carlos R. Mafra 1 sibling, 1 reply; 9+ messages in thread From: Takashi Iwai @ 2009-04-14 14:27 UTC (permalink / raw) To: Carlos R. Mafra; +Cc: linux-kernel, alsa-devel At Sat, 11 Apr 2009 21:36:30 +0200, Carlos R. Mafra wrote: > > If I try on my Vaio VGN-FZ240E, using the latest kernel 2.6.30-rc1-00191-gd848223 > > modprobe -r snd_hda_intel > > I get the following trace (copied from dmesg): > > general protection fault: 0000 [#1] SMP > last sysfs file: /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq > CPU 1 > Modules linked in: nvram uvcvideo videodev v4l1_compat v4l2_compat_ioctl32 snd_hda_codec_idt > usbhid snd_hda_intel(-) snd_hda_codec snd_hwdep snd_pcm sr_mod sky2 i2c_i801 iwlagn snd_timer > sg snd_page_alloc evdev ata_piix ahci libata sd_mod scsi_mod uhci_hcd ohci_hcd ehci_hcd usbcore [last unloaded: scsi_wait_scan] > Pid: 9063, comm: modprobe Not tainted 2.6.30-rc1-00191-gd848223 #48 VGN-FZ240E > RIP: 0010:[<ffffffff8044bf90>] [<ffffffff8044bf90>] input_event+0x40/0xa0 > RSP: 0018:ffff88006f283a78 EFLAGS: 00010293 > RAX: 0000000000000008 RBX: 0000000000000003 RCX: 0000000000000000 > RDX: 0000000000000007 RSI: 0000000000000005 RDI: 697665646632785c > RBP: ffff88006f283aa8 R08: 0000000004d6f76c R09: 0000000000000001 > R10: 0000000000000000 R11: 0000000000000001 R12: ffffffff805bb97c > R13: 0000000000000005 R14: 697665646632785c R15: 0000000000000000 > FS: 00007fc6c1e1c6f0(0000) GS:ffff880001028000(0000) knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b > CR2: 000000000071bf40 CR3: 000000007e2d4000 CR4: 00000000000006e0 > DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 > DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 > Process modprobe (pid: 9063, threadinfo ffff88006f282000, task ffff88006f206840) > Stack: > ffff88006f283aa8 0000000000000003 ffffffff805bb97c ffff88007e811cc0 > 0000000000000001 0000000000000000 ffff88006f283ae8 ffffffff80475612 > ffff88007f241ae0 0000000000000002 ffff88007d5eb010 0000000000000000 > Call Trace: > [<ffffffff80475612>] snd_jack_report+0x92/0xa0 > [<ffffffffa0160047>] stac92xx_unsol_event+0x2e7/0x5e0 [snd_hda_codec_idt] > [<ffffffffa015f528>] stac_issue_unsol_event+0x58/0x70 [snd_hda_codec_idt] > [<ffffffffa0160796>] stac92xx_init+0x186/0x660 [snd_hda_codec_idt] > [<ffffffffa0160c90>] stac92xx_resume+0x20/0x60 [snd_hda_codec_idt] > [<ffffffffa013c973>] hda_call_codec_resume+0x53/0x90 [snd_hda_codec] > [<ffffffffa013ca50>] snd_hda_power_up+0x40/0x70 [snd_hda_codec] > [<ffffffffa013c2b5>] snd_hda_codec_write+0x45/0xa0 [snd_hda_codec] > [<ffffffffa013c37a>] restore_pincfgs+0x6a/0xa0 [snd_hda_codec] > [<ffffffffa013ed75>] snd_hda_codec_free+0x35/0x120 [snd_hda_codec] > [<ffffffffa01403f8>] snd_hda_bus_free+0x68/0xb0 [snd_hda_codec] > [<ffffffffa01405e4>] snd_hda_bus_dev_free+0x14/0x20 [snd_hda_codec] > [<ffffffff80473e61>] snd_device_free+0x71/0xd0 > [<ffffffff80473f24>] snd_device_free_all+0x64/0x70 > [<ffffffff8046e16a>] snd_card_do_free+0x3a/0xd0 > [<ffffffff8046ee39>] snd_card_free+0xa9/0xd0 > [<ffffffffa015031e>] azx_remove+0x18/0x2a [snd_hda_intel] > [<ffffffff8036506f>] pci_device_remove+0x2f/0x60 > [<ffffffff8040ec8c>] __device_release_driver+0x6c/0xb0 > [<ffffffff8040ed78>] driver_detach+0xa8/0xb0 > [<ffffffff8040de48>] bus_remove_driver+0x98/0xd0 > [<ffffffff8040f357>] driver_unregister+0x47/0x60 > [<ffffffff8036530c>] pci_unregister_driver+0x4c/0xc0 > [<ffffffffa0150304>] alsa_card_azx_exit+0x10/0x12 [snd_hda_intel] > [<ffffffff8026787b>] sys_delete_module+0x18b/0x240 > [<ffffffff80257be9>] ? up_write+0x9/0x10 > [<ffffffff8020be2b>] system_call_fastpath+0x16/0x1b > Code: 89 5d d8 4c 89 65 e0 49 89 fe 41 89 f5 41 89 cf 83 fe 1f 76 16 48 8b 5d d8 4c 8b 65 > e0 4c 8b 6d e8 4c 8b 75 f0 4c 8b 7d f8 c9 c3 <0f> a3 77 20 19 c0 85 c0 74 e0 48 8d 9f f8 06 00 00 89 55 d0 48 > RIP [<ffffffff8044bf90>] input_event+0x40/0xa0 > RSP <ffff88006f283a78> > ---[ end trace 7fa0517f56c40085 ]--- This seems happening in the path exciting the codec again in the release due to restoration of the pin defcfg values. Could you try the patch below, or merge for-next or master branch of sound git tree? git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git Thanks, Takashi --- diff --git a/include/sound/jack.h b/include/sound/jack.h index 6b013c6..f236e42 100644 --- a/include/sound/jack.h +++ b/include/sound/jack.h @@ -50,6 +50,8 @@ struct snd_jack { int type; const char *id; char name[100]; + void *private_data; + void (*private_free)(struct snd_jack *); }; #ifdef CONFIG_SND_JACK diff --git a/sound/core/jack.c b/sound/core/jack.c index c8254c6..d54d1a0 100644 --- a/sound/core/jack.c +++ b/sound/core/jack.c @@ -35,6 +35,9 @@ static int snd_jack_dev_free(struct snd_device *device) { struct snd_jack *jack = device->device_data; + if (jack->private_free) + jack->private_free(jack); + /* If the input device is registered with the input subsystem * then we need to use a different deallocator. */ if (jack->registered) diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 1f2ad76..56ce19e 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -350,12 +350,20 @@ static int conexant_mux_enum_put(struct snd_kcontrol *kcontrol, } #ifdef CONFIG_SND_JACK +static void conexant_free_jack_priv(struct snd_jack *jack) +{ + struct conexant_jack *jacks = jack->private_data; + jacks->nid = 0; + jacks->jack = NULL; +} + static int conexant_add_jack(struct hda_codec *codec, hda_nid_t nid, int type) { struct conexant_spec *spec; struct conexant_jack *jack; const char *name; + int err; spec = codec->spec; snd_array_init(&spec->jacks, sizeof(*jack), 32); @@ -368,7 +376,12 @@ static int conexant_add_jack(struct hda_codec *codec, jack->nid = nid; jack->type = type; - return snd_jack_new(codec->bus->card, name, type, &jack->jack); + err = snd_jack_new(codec->bus->card, name, type, &jack->jack); + if (err < 0) + return err; + jack->jack->private_data = jack; + jack->jack->private_free = conexant_free_jack_priv; + return 0; } static void conexant_report_jack(struct hda_codec *codec, hda_nid_t nid) @@ -455,8 +468,10 @@ static void conexant_free(struct hda_codec *codec) if (spec->jacks.list) { struct conexant_jack *jacks = spec->jacks.list; int i; - for (i = 0; i < spec->jacks.used; i++) - snd_device_free(codec->bus->card, &jacks[i].jack); + for (i = 0; i < spec->jacks.used; i++, jacks++) { + if (jacks->jack) + snd_device_free(codec->bus->card, jacks->jack); + } snd_array_free(&spec->jacks); } #endif diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 61996a2..ce30b45 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -3851,6 +3851,15 @@ static void stac_gpio_set(struct hda_codec *codec, unsigned int mask, AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */ } +#ifdef CONFIG_SND_JACK +static void stac92xx_free_jack_priv(struct snd_jack *jack) +{ + struct sigmatel_jack *jacks = jack->private_data; + jacks->nid = 0; + jacks->jack = NULL; +} +#endif + static int stac92xx_add_jack(struct hda_codec *codec, hda_nid_t nid, int type) { @@ -3860,6 +3869,7 @@ static int stac92xx_add_jack(struct hda_codec *codec, int def_conf = snd_hda_codec_get_pincfg(codec, nid); int connectivity = get_defcfg_connect(def_conf); char name[32]; + int err; if (connectivity && connectivity != AC_JACK_PORT_FIXED) return 0; @@ -3876,10 +3886,15 @@ static int stac92xx_add_jack(struct hda_codec *codec, snd_hda_get_jack_connectivity(def_conf), snd_hda_get_jack_location(def_conf)); - return snd_jack_new(codec->bus->card, name, type, &jack->jack); -#else - return 0; + err = snd_jack_new(codec->bus->card, name, type, &jack->jack); + if (err < 0) { + jack->nid = 0; + return err; + } + jack->jack->private_data = jack; + jack->jack->private_free = stac92xx_free_jack_priv; #endif + return 0; } static int stac_add_event(struct sigmatel_spec *spec, hda_nid_t nid, @@ -4138,8 +4153,10 @@ static void stac92xx_free_jacks(struct hda_codec *codec) if (!codec->bus->shutdown && spec->jacks.list) { struct sigmatel_jack *jacks = spec->jacks.list; int i; - for (i = 0; i < spec->jacks.used; i++) - snd_device_free(codec->bus->card, &jacks[i].jack); + for (i = 0; i < spec->jacks.used; i++, jacks++) { + if (jacks->jack) + snd_device_free(codec->bus->card, jacks->jack); + } } snd_array_free(&spec->jacks); #endif ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ 2009-04-14 14:27 ` General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ Takashi Iwai @ 2009-04-14 16:21 ` Carlos R. Mafra 2009-04-15 11:04 ` [alsa-devel] " Takashi Iwai 0 siblings, 1 reply; 9+ messages in thread From: Carlos R. Mafra @ 2009-04-14 16:21 UTC (permalink / raw) To: Takashi Iwai; +Cc: linux-kernel, alsa-devel On Tue 14.Apr'09 at 16:27:52 +0200, Takashi Iwai wrote: > > This seems happening in the path exciting the codec again in the > release due to restoration of the pin defcfg values. > > Could you try the patch below, or merge for-next or master branch > of sound git tree? > git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git I tested the patch below and now the module unloads correctly, so the problem is fixed. Tested-by: Carlos R. Mafra <crmafra2@gmail.com> Thanks Takashi! > > --- > diff --git a/include/sound/jack.h b/include/sound/jack.h > index 6b013c6..f236e42 100644 > --- a/include/sound/jack.h > +++ b/include/sound/jack.h > @@ -50,6 +50,8 @@ struct snd_jack { > int type; > const char *id; > char name[100]; > + void *private_data; > + void (*private_free)(struct snd_jack *); > }; > > #ifdef CONFIG_SND_JACK > diff --git a/sound/core/jack.c b/sound/core/jack.c > index c8254c6..d54d1a0 100644 > --- a/sound/core/jack.c > +++ b/sound/core/jack.c > @@ -35,6 +35,9 @@ static int snd_jack_dev_free(struct snd_device *device) > { > struct snd_jack *jack = device->device_data; > > + if (jack->private_free) > + jack->private_free(jack); > + > /* If the input device is registered with the input subsystem > * then we need to use a different deallocator. */ > if (jack->registered) > diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c > index 1f2ad76..56ce19e 100644 > --- a/sound/pci/hda/patch_conexant.c > +++ b/sound/pci/hda/patch_conexant.c > @@ -350,12 +350,20 @@ static int conexant_mux_enum_put(struct snd_kcontrol *kcontrol, > } > > #ifdef CONFIG_SND_JACK > +static void conexant_free_jack_priv(struct snd_jack *jack) > +{ > + struct conexant_jack *jacks = jack->private_data; > + jacks->nid = 0; > + jacks->jack = NULL; > +} > + > static int conexant_add_jack(struct hda_codec *codec, > hda_nid_t nid, int type) > { > struct conexant_spec *spec; > struct conexant_jack *jack; > const char *name; > + int err; > > spec = codec->spec; > snd_array_init(&spec->jacks, sizeof(*jack), 32); > @@ -368,7 +376,12 @@ static int conexant_add_jack(struct hda_codec *codec, > jack->nid = nid; > jack->type = type; > > - return snd_jack_new(codec->bus->card, name, type, &jack->jack); > + err = snd_jack_new(codec->bus->card, name, type, &jack->jack); > + if (err < 0) > + return err; > + jack->jack->private_data = jack; > + jack->jack->private_free = conexant_free_jack_priv; > + return 0; > } > > static void conexant_report_jack(struct hda_codec *codec, hda_nid_t nid) > @@ -455,8 +468,10 @@ static void conexant_free(struct hda_codec *codec) > if (spec->jacks.list) { > struct conexant_jack *jacks = spec->jacks.list; > int i; > - for (i = 0; i < spec->jacks.used; i++) > - snd_device_free(codec->bus->card, &jacks[i].jack); > + for (i = 0; i < spec->jacks.used; i++, jacks++) { > + if (jacks->jack) > + snd_device_free(codec->bus->card, jacks->jack); > + } > snd_array_free(&spec->jacks); > } > #endif > diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c > index 61996a2..ce30b45 100644 > --- a/sound/pci/hda/patch_sigmatel.c > +++ b/sound/pci/hda/patch_sigmatel.c > @@ -3851,6 +3851,15 @@ static void stac_gpio_set(struct hda_codec *codec, unsigned int mask, > AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */ > } > > +#ifdef CONFIG_SND_JACK > +static void stac92xx_free_jack_priv(struct snd_jack *jack) > +{ > + struct sigmatel_jack *jacks = jack->private_data; > + jacks->nid = 0; > + jacks->jack = NULL; > +} > +#endif > + > static int stac92xx_add_jack(struct hda_codec *codec, > hda_nid_t nid, int type) > { > @@ -3860,6 +3869,7 @@ static int stac92xx_add_jack(struct hda_codec *codec, > int def_conf = snd_hda_codec_get_pincfg(codec, nid); > int connectivity = get_defcfg_connect(def_conf); > char name[32]; > + int err; > > if (connectivity && connectivity != AC_JACK_PORT_FIXED) > return 0; > @@ -3876,10 +3886,15 @@ static int stac92xx_add_jack(struct hda_codec *codec, > snd_hda_get_jack_connectivity(def_conf), > snd_hda_get_jack_location(def_conf)); > > - return snd_jack_new(codec->bus->card, name, type, &jack->jack); > -#else > - return 0; > + err = snd_jack_new(codec->bus->card, name, type, &jack->jack); > + if (err < 0) { > + jack->nid = 0; > + return err; > + } > + jack->jack->private_data = jack; > + jack->jack->private_free = stac92xx_free_jack_priv; > #endif > + return 0; > } > > static int stac_add_event(struct sigmatel_spec *spec, hda_nid_t nid, > @@ -4138,8 +4153,10 @@ static void stac92xx_free_jacks(struct hda_codec *codec) > if (!codec->bus->shutdown && spec->jacks.list) { > struct sigmatel_jack *jacks = spec->jacks.list; > int i; > - for (i = 0; i < spec->jacks.used; i++) > - snd_device_free(codec->bus->card, &jacks[i].jack); > + for (i = 0; i < spec->jacks.used; i++, jacks++) { > + if (jacks->jack) > + snd_device_free(codec->bus->card, jacks->jack); > + } > } > snd_array_free(&spec->jacks); > #endif ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [alsa-devel] General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ 2009-04-14 16:21 ` Carlos R. Mafra @ 2009-04-15 11:04 ` Takashi Iwai 0 siblings, 0 replies; 9+ messages in thread From: Takashi Iwai @ 2009-04-15 11:04 UTC (permalink / raw) To: Carlos R. Mafra; +Cc: alsa-devel, linux-kernel, alsa-devel At Tue, 14 Apr 2009 18:21:19 +0200, Carlos R. Mafra wrote: > > On Tue 14.Apr'09 at 16:27:52 +0200, Takashi Iwai wrote: > > > > This seems happening in the path exciting the codec again in the > > release due to restoration of the pin defcfg values. > > > > Could you try the patch below, or merge for-next or master branch > > of sound git tree? > > git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git > > > I tested the patch below and now the module unloads correctly, so the > problem is fixed. > > Tested-by: Carlos R. Mafra <crmafra2@gmail.com> > > Thanks Takashi! Thanks for testing. I'll give a pull request soon later. Takashi ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2009-04-15 11:04 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-04-11 19:36 General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ Carlos R. Mafra 2009-04-11 20:20 ` Arjan van de Ven 2009-04-11 21:03 ` Carlos R. Mafra 2009-04-11 21:39 ` Arjan van de Ven 2009-04-12 0:33 ` Michal Jaegermann 2009-04-12 1:58 ` General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ (bisected) Carlos R. Mafra 2009-04-14 14:27 ` General protection fault when unloading snd_hda_intel on 2.6.30-rc1+ Takashi Iwai 2009-04-14 16:21 ` Carlos R. Mafra 2009-04-15 11:04 ` [alsa-devel] " Takashi Iwai
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox